¿Por qué no puedo hacer coincidir la salida de glmer (familia = binomial) con la implementación manual del algoritmo de Gauss-Newton?

15

Me gustaría hacer coincidir las salidas de lmer (realmente glmer) con un ejemplo binomial de juguete. He leído las viñetas y creo que entiendo lo que está pasando.

Pero al parecer no. Después de atascarme, arreglé la "verdad" en términos de los efectos aleatorios y busqué solo la estimación de los efectos fijos. Estoy incluyendo este código a continuación. Para ver que es legítimo, puede comentar + Z %*% b.ky coincidirá con los resultados de un glm regular. Espero tomar prestada algo de capacidad intelectual para descubrir por qué no puedo igualar la producción de Imer cuando se incluyen los efectos aleatorios.

# 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
fuente

Respuestas:

28

Si cambia el comando de ajuste del modelo a lo siguiente, su enfoque de coincidencia funciona:

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

El cambio clave es el nAGQ = 0, que coincide con su enfoque, mientras que el predeterminado ( nAGQ = 1) no. nAGQsignifica 'número de puntos de cuadratura Gauss-Hermite adaptativos' y establece cómo glmerse integrarán los efectos aleatorios al ajustar el modelo mixto. Cuando nAGQes mayor que 1, se usa cuadratura adaptativa con nAGQpuntos. Cuando nAGQ = 1, se usa la aproximación de Laplace, y cuando nAGQ = 0, la integral se 'ignora'. Sin ser demasiado específico (y, por lo tanto, quizás demasiado técnico), nAGQ = 0significa que los efectos aleatorios solo influyen en las estimaciones de los efectos fijos a través de sus modos condicionales estimados; por lo tanto,nAGQ = 0no explica completamente la aleatoriedad de los efectos aleatorios. Para tener en cuenta los efectos aleatorios, deben integrarse. Sin embargo, como descubrió esta diferencia entre nAGQ = 0y a nAGQ = 1menudo puede ser bastante pequeña.

Su enfoque de correspondencia no funcionará nAGQ > 0. Esto se debe a que en estos casos hay tres pasos para la optimización: (1) mínimos cuadrados repesados ​​iterativamente penalizados (PIRLS) para estimar los modos condicionales de los efectos aleatorios, (2) (aproximadamente) integran los efectos aleatorios sobre sus modos condicionales , y (3) optimización no lineal de la función objetivo (es decir, el resultado de la integración). Estos pasos se repiten hasta la convergencia. Simplemente está ejecutando una ejecución de mínimos cuadrados repesados ​​iterativamente (IRLS), que se supone que bse conoce y se pone Z%*%bun término de compensación. Su enfoque resulta ser equivalente a PIRLS, pero esta equivalencia solo se cumple porque se usa glmerpara obtener modos condicionales estimados (que de otro modo no conocería).

Disculpas si esto no se explica bien, pero no es un tema que se presta bien a una descripción rápida. Puede encontrar útil https://github.com/lme4/lme4pureR , que es una implementación (incompleta) del lme4enfoque en código R puro. lme4pureRestá diseñado para ser más legible que lme4sí mismo (aunque mucho más lento).

Steve Walker
fuente