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.k
auskommentieren 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")
}