Warum kann ich die Ausgabe von glmer (family = binomial) nicht mit der manuellen Implementierung des Gauss-Newton-Algorithmus abgleichen?

15

Ich möchte die Ausgaben von lmer (wirklich glmer) mit einem Spielzeugbinomialbeispiel abgleichen. Ich habe die Vignetten gelesen und glaube zu verstehen, was los ist.

Aber anscheinend mache ich nicht. Nachdem ich stecken geblieben war, habe ich die "Wahrheit" in Bezug auf die zufälligen Effekte korrigiert und mich nur um die Schätzung der fixierten Effekte gekümmert. Ich füge diesen Code unten ein. Um zu sehen, dass es legitim ist, können Sie + Z %*% b.kauskommentieren und es wird mit den Ergebnissen eines regulären glm übereinstimmen. Ich hoffe, dass ich mir ein wenig Kopfzerbrechen machen kann, um herauszufinden, warum ich nicht in der Lage bin, den Output von lmer anzupassen, wenn die zufälligen Effekte einbezogen werden.

# Setup - hard coding simple data set 
df <- data.frame(x1 = rep(c(1:5), 3), subject = sort(rep(c(1:3), 5)))
df$subject <- factor(df$subject)

# True coefficient values  
beta <- matrix(c(-3.3, 1), ncol = 1) # Intercept and slope, respectively 
u <- matrix(c(-.5, .6, .9), ncol = 1) # random effects for the 3 subjects 

# Design matrices Z (random effects) and X (fixed effects)
Z <- model.matrix(~ 0 + factor(subject), data = df)
X <- model.matrix(~ 1 + x1, data = df)

# Response  
df$y <- c(1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1)
    y <- df$y

### Goal: match estimates from the following lmer output! 
library(lme4)
my.lmer <- lmer( y ~ x1 + (1 | subject), data = df, family = binomial)
summary(my.lmer)
ranef(my.lmer)

### Matching effort STARTS HERE 

beta.k <- matrix(c(-3, 1.5), ncol = 1) # Initial values (close to truth)
b.k <- matrix(c(1.82478, -1.53618, -.5139356), ncol = 1) # lmer's random effects

# Iterative Gauss-Newton algorithm
for (iter in 1:6) {
  lin.pred <- as.numeric(X %*% beta.k +  Z %*% b.k)
  mu.k <- plogis(lin.pred)
  variances <- mu.k * (1 - mu.k)
  W.k <- diag(1/variances)

  y.star <- W.k^(.5) %*% (y - mu.k)
  X.star <- W.k^(.5) %*% (variances * X)
  delta.k <- solve(t(X.star) %*% X.star) %*% t(X.star) %*% y.star

  # Gauss-Newton Update 
  beta.k <- beta.k + delta.k
  cat(iter, "Fixed Effects: ", beta.k, "\n")
}
Ben Ogorek
quelle

Antworten:

28

Wenn Sie Ihren Modellanpassungsbefehl folgendermaßen ändern, funktioniert der Übereinstimmungsansatz:

my.lmer <- glmer(y ~ x1 + (1 | subject), data = df, family = binomial, nAGQ = 0)

Die Schlüsseländerung ist die nAGQ = 0, die Ihrem Ansatz entspricht, während die Standardeinstellung ( nAGQ = 1) dies nicht tut. nAGQbedeutet "Anzahl der adaptiven Gauß-Hermite-Quadraturpunkte" und legt fest, wie glmerdie Zufallseffekte beim Anpassen des gemischten Modells integriert werden. Wenn nAGQgrößer als 1 ist, wird die adaptive Quadratur mit nAGQPunkten verwendet. Wenn nAGQ = 1die Laplace-Näherung verwendet wird und wenn nAGQ = 0das Integral "ignoriert" wird. Ohne zu spezifisch (und daher vielleicht zu technisch) zu sein, nAGQ = 0bedeutet dies, dass die zufälligen Effekte die Schätzungen der festen Effekte nur durch ihre geschätzten bedingten Modi beeinflussen - dahernAGQ = 0berücksichtigt die Zufälligkeit der zufälligen Effekte nicht vollständig. Um die zufälligen Effekte vollständig zu berücksichtigen, müssen sie heraus integriert werden. Wie Sie jedoch festgestellt haben, ist dieser Unterschied zwischen nAGQ = 0und nAGQ = 1häufig recht gering.

Ihr passender Ansatz funktioniert nicht nAGQ > 0. Dies liegt daran, dass die Optimierung in diesen Fällen drei Schritte umfasst: (1) Bestrafte iterativ gewichtete kleinste Fehlerquadrate (PIRLS), um die bedingten Modi der Zufallseffekte abzuschätzen. (2) Integriere (ungefähr) die zufälligen Effekte über ihre bedingten Modi und (3) nichtlineare Optimierung der Zielfunktion (dh des Ergebnisses der Integration). Diese Schritte werden selbst bis zur Konvergenz wiederholt. Sie führen einfach einen iterativ gewichteten IRLS-Lauf (Least Squares) durch, bei dem davon ausgegangen bwird, dass er bekannt ist und Z%*%beinen Offset-Term enthält. Ihr Ansatz stellt sich als gleichwertig mit PIRLS heraus, aber diese Äquivalenz gilt nur, weil Sie glmergeschätzte bedingte Modi erhalten (die Sie sonst nicht kennen würden).

Entschuldigung, wenn dies nicht gut erklärt ist, aber es ist kein Thema, das sich gut für eine kurze Beschreibung eignet. Möglicherweise finden Sie https://github.com/lme4/lme4pureR nützlich, eine (unvollständige) Implementierung des lme4Ansatzes in reinem R-Code. lme4pureRist besser lesbar lme4(wenn auch viel langsamer).

Steve Walker
quelle