Me gustaría igualar los resultados de lmer (realmente glmer) con un ejemplo binomial de juguete. He leído los documentos y creo que entiendo lo que está sucediendo.
Pero aparentemente no es así. Después de quedarme atascado, arreglé la "verdad" en términos de los efectos aleatorios y fui tras la estimación de los efectos fijos solamente. Incluyo el código a continuación. Para ver que es legítimo, puedes comentar + Z %*% b.k
y coincidirá con los resultados de un glm regular. Espero poder contar con ayuda para averiguar por qué no puedo igualar la salida de lmer cuando se incluyen los efectos aleatorios.
# Configuración - codificación manual de un conjunto de datos sencillo
df <- data.frame(x1 = rep(c(1:5), 3), subject = sort(rep(c(1:3), 5)))
df$subject <- factor(df$subject)
# Valores verdaderos de los coeficientes
beta <- matrix(c(-3.3, 1), ncol = 1) # Intercepto y pendiente, respectivamente
u <- matrix(c(-.5, .6, .9), ncol = 1) # efectos aleatorios para los 3 sujetos
# Matrices de diseño Z (efectos aleatorios) y X (efectos fijos)
Z <- model.matrix(~ 0 + factor(subject), data = df)
X <- model.matrix(~ 1 + x1, data = df)
# Respuesta
df$y <- c(1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1)
y <- df$y
### Objetivo: igualar las estimaciones de la siguiente salida de lmer!
library(lme4)
my.lmer <- lmer( y ~ x1 + (1 | subject), data = df, family = binomial)
summary(my.lmer)
ranef(my.lmer)
### Comienza el esfuerzo para igualar
beta.k <- matrix(c(-3, 1.5), ncol = 1) # Valores iniciales (cercanos a la verdad)
b.k <- matrix(c(1.82478, -1.53618, -.5139356), ncol = 1) # efectos aleatorios de lmer
# Algoritmo iterativo de Gauss-Newton
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
# Actualización de Gauss-Newton
beta.k <- beta.k + delta.k
cat(iter, "Efectos Fijos: ", beta.k, "\n")
}