Gibt es eine Möglichkeit, eine Beziehung zwischen Koeffizienten in der logistischen Regression zu erzwingen?

8

Ich möchte ein logistisches Regressionsmodell angeben, bei dem ich die folgende Beziehung habe:

E[Yi|Xi]=f(βxi1+β2xi2) wobei die inverse Logit-Funktion ist.f

Gibt es eine "schnelle" Möglichkeit, dies mit bereits vorhandenen R-Funktionen zu tun, oder gibt es einen Namen für ein Modell wie dieses? Mir ist klar, dass ich den Newton-Raphson-Algorithmus, der für die logistische Regression verwendet wird, modifizieren kann, aber dies ist eine Menge theoretischer und codierender Arbeit, und ich suche nach einer Abkürzung.

BEARBEITEN: Das Abrufen von Punktschätzungen für ist mit optim () oder einem anderen Optimierer in R ziemlich einfach, um die Wahrscheinlichkeit zu maximieren. Aber ich brauche Standardfehler bei diesen Jungs.β

TrynnaDoStat
quelle
1
Können Sie die Situation erklären, in der Sie das jemals tun möchten? Ich bin nur Neugierig. Ich persönlich habe dies nicht gesehen und müsste es wahrscheinlich mit eingeschränkter Optimierung codieren.
Wolfsatthedoor
1
Ich kann nicht auf die Einzelheiten eingehen, aber der Grund, warum ich dies tun möchte, ist im Grunde genommen die statistische Aussagekraft. Wenn ich glaube, dass diese Beziehung besteht, bringt mich das Erzwingen dieser Beziehung näher an den wahren Wert. Das Abrufen von Punktschätzungen für ist mit optim () oder einem anderen Optimierer in R ziemlich einfach, um die Wahrscheinlichkeit zu maximieren. Aber ich brauche Standardfehler bei diesen Jungs. βββ
TrynnaDoStat
3
Dieser ist nicht so schwer, wie es aussehen mag: Es ist ziemlich einfach, den MLE aus ersten Prinzipien zu erhalten, da Sie nur einen einzigen Parameter haben. Notieren Sie die Protokollwahrscheinlichkeit und differenzieren Sie sie in Bezug auf . Finden Sie die Null (en). Das würde numerisch gemacht werden. Wenn Sie Probleme beim Starten der Suche haben, passen Sie das übliche Zwei-Parameter-Modell an und verwenden Sie (sagen wir) den Koeffizienten von als Startwert. x 2βx2
whuber
2
Die NLIN-Prozedur in SAS kann an eine solche nichtlineare Regressionsformel angepasst werden und gibt Koeffizienten-Stnd-Fehler aus. Bist du mit R verheiratet oder gibt es etwas Flexibilität?
RobertF
1
Das Erhalten der SEs ist nicht schwieriger: Dies ist der einfache Fall der Standardtheorie, bei der es nur einen Parameter gibt. Angesichts der nichtlinearen Natur seiner Abhängigkeit von den Parametern würde ich mich jedoch nur ungern auf die Näherungstheorie oder die numerische Brute-Force-Optimierung stützen: Zeichnen Sie die Wahrscheinlichkeitsfunktion selbst, zumindest in einigen Fällen, auf, damit Sie ihre Qualität verstehen können Verhalten in der Nähe des Gipfels.
whuber

Antworten:

13

Dies ist mit der Optimierungsfunktion in R ziemlich einfach. Mein Verständnis ist, dass Sie eine logistische Regression ausführen möchten, bei der y binär ist. Sie schreiben einfach die Funktion und stecken sie dann in optim. Unten ist ein Code, den ich nicht ausgeführt habe (Pseudocode).

#d is your data frame and y is normalized to 0,1
your.fun=function(b)
{

    EXP=exp(d$x1*b +d$x2*b^2)

    VALS=( EXP/(1+EXP) )^(d$y)*( 1/(1+EXP) )^(1-d$y) 
    return(-sum(log(VALS)))
}

result=optim(0,your.fun,method="BFGS",hessian=TRUE)
# estimates 
 result$par
    #standard errors
    sqrt(diag(inv(result$hessian)))
# maximum log likelihood
-result$value

Beachten Sie, dass your.fun das Negativ einer Log-Likelihood-Funktion ist. Optim maximiert also die Protokollwahrscheinlichkeit (standardmäßig minimiert optim alles, weshalb ich die Funktion negativ gemacht habe). Wenn Y nicht binär ist, finden Sie unter http://fisher.osu.edu/~schroeder.9/AMIS900/ch5.pdf multinomiale und bedingte Funktionsformulare in Logit-Modellen.

Zachary Blumenfeld
quelle
1
Schätzen Sie die Antwort Zachary! Dies funktioniert jedoch nicht, da ich Standardfehler für meine Schätzungen benötige. Ich denke darüber nach, Bootstrapping und optim () zu kombinieren, würde aber nach Möglichkeit eine Methode ohne Bootstrapping bevorzugen. Das Modifizieren von Newton-Raphson wäre viel befriedigender, aber viel schwieriger zu implementieren.
TrynnaDoStat
3
Vielleicht verstehe ich nicht, der Standardfehler der Schätzung ergibt sich aus einer Funktion des bei den Schätzungen bewerteten Maximum-Likelihood-Hessischen. So wie Sie Ihre Funktion geschrieben haben, haben Sie nur einen Parameter. Sie können den obigen Code sicherlich booten, um auch Standardfehler zu erhalten.
Zachary Blumenfeld
1
@ZacharyBlumenfeld Ich verstehe, was du jetzt sagst! Ich war verwirrt, weil mein Verständnis der asymptotischen Theorie von MLE darin bestand, dass unsere Beobachtungen iid sein müssen (der Mittelwert variiert hier sicherlich, so dass meine Beobachtungen nicht iid sind). Ich sehe jedoch jetzt, dass Beobachtungen unter bestimmten Regelmäßigkeitsbedingungen nicht durchgeführt werden müssen ( en.wikipedia.org/wiki/Maximum_likelihood#Asymptotic_normality ). Jetzt muss ich nur noch überprüfen, ob meine Situation den Regelmäßigkeitsbedingungen entspricht. Danke noch einmal!
TrynnaDoStat
1
Hinweis: Wenn dann ist es die iid angenommen werden könnte, die nicht unbedingt . ϵ Y.Y=Xβ+ϵϵY
Konjugatprior
2

Die obige Antwort ist richtig. Als Referenz finden Sie hier einen ausgearbeiteten funktionierenden R-Code, um ihn zu berechnen. Ich habe mir erlaubt, einen Abschnitt hinzuzufügen, weil Sie wahrscheinlich einen davon wollen.

## make some data
set.seed(1234)
N <- 2000
x1 <- rnorm(N)
x2 <- rnorm(N)
## create linear predictor
lpred <- 0.5 + 0.5 * x1 + 0.25 * x2
## apply inverse link function
ey <- 1/(1 + exp(-lpred))
## sample some dependent variable
y <- rbinom(N, prob=ey, size=rep(1,N))

dat <- matrix(c(x1, x2, y), nrow=N, ncol=3)
colnames(dat) <- c('x1', 'x2', 'y')

Erstellen Sie nun eine Protokollwahrscheinlichkeitsfunktion zur Maximierung, verwenden Sie diese, dbinomweil sie vorhanden ist, und summieren Sie die Ergebnisse

## the log likelihood function
log.like <- function(beta, dat){
  lpred <- beta[1] + dat[,'x1'] * beta[2] + dat[,'x2'] * beta[2]**2
  ey <- 1/(1 + exp(-lpred))
  sum(dbinom(dat[,'y'], prob=ey, size=rep(1,nrow(dat)), log=TRUE))
}

und passen Sie das Modell mit maximaler Wahrscheinlichkeit an. Ich habe mir nicht die Mühe gemacht, einen Farbverlauf anzubieten oder eine Optimierungsmethode zu wählen, aber vielleicht möchten Sie beides tun.

## fit
res <- optim(par=c(1,1), ## starting values 
             fn=log.like,
             control=list(fnscale=-1), ## maximise not minimise
             hessian=TRUE, ## for SEs
             dat=dat)

Schauen Sie sich jetzt die Ergebnisse an. Die ML-Parameterschätzungen und asymptotischen SEs sind:

## results
data.frame(coef=res$par,
           SE=sqrt(diag(solve(-res$hessian))))

was sein sollte

##        coef         SE
## 1 0.4731680 0.04828779
## 2 0.5799311 0.03363505

oder es gibt einen Fehler (der immer möglich ist).

Es gelten die üblichen Vorbehalte gegen von Hessen abgeleitete Standardfehler.

Konjugatprior
quelle