Pourquoi ne puis-je pas faire correspondre la sortie glmer (famille = binomiale) avec l'implémentation manuelle de l'algorithme de Gauss-Newton?


15

Je voudrais faire correspondre les sorties de lmer (vraiment glmer) avec un exemple binomial jouet. J'ai lu les vignettes et je crois comprendre ce qui se passe.

Mais apparemment non. Après être resté coincé, j'ai corrigé la "vérité" en termes d'effets aléatoires et je suis allé après l'estimation des effets fixes seuls. J'inclus ce code ci-dessous. Pour voir que c'est légitime, vous pouvez commenter + Z %*% b.ket cela correspondra aux résultats d'un glm régulier. J'espère emprunter un peu de cerveau pour comprendre pourquoi je ne suis pas en mesure de faire correspondre la sortie de lmer lorsque les effets aléatoires sont inclus.

# 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")
}

Réponses:


28

Si vous modifiez la commande d'ajustement de modèle comme suit, votre approche de correspondance fonctionne:

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

Le changement clé est le nAGQ = 0, qui correspond à votre approche, contrairement à default ( nAGQ = 1). nAGQsignifie «nombre de points de quadrature Gauss-Hermite adaptatifs» et définit comment glmerintégrer les effets aléatoires lors de l'ajustement du modèle mixte. Lorsque nAGQest supérieur à 1, la quadrature adaptative est utilisée avec des nAGQpoints. Quand nAGQ = 1l'approximation de Laplace est utilisée et quand nAGQ = 0l'intégrale est «ignorée». Sans être trop spécifique (et donc peut-être trop technique), cela nAGQ = 0signifie que les effets aléatoires n'influencent les estimations des effets fixes qu'à travers leurs modes conditionnels estimés - donc,nAGQ = 0ne tient pas complètement compte du caractère aléatoire des effets aléatoires. Pour tenir pleinement compte des effets aléatoires, ils doivent être intégrés. Cependant, comme vous l'avez découvert, cette différence entre nAGQ = 0et nAGQ = 1peut souvent être assez faible.

Votre approche d'appariement ne fonctionnera pas avec nAGQ > 0. En effet, dans ces cas, l'optimisation se déroule en trois étapes: (1) les moindres carrés itératifs pénalisés (PIRLS) pour estimer les modes conditionnels des effets aléatoires, (2) intégrer (approximativement) les effets aléatoires sur leurs modes conditionnels , et (3) l'optimisation non linéaire de la fonction objectif (ie le résultat de l'intégration). Ces étapes sont elles-mêmes répétées jusqu'à la convergence. Vous faites simplement un des moindres carrés itérativement repondérés (IRLS) run, ce qui suppose best connu et mettre Z%*%bdans un terme de décalage. Votre approche s'avère équivalente à PIRLS, mais cette équivalence ne tient que parce que vous utilisez glmerpour obtenir des modes conditionnels estimés (que vous ne connaîtriez pas autrement).

Toutes mes excuses si cela n'est pas bien expliqué, mais ce n'est pas un sujet qui se prête bien à une description rapide. Vous trouverez peut-être utile https://github.com/lme4/lme4pureR , qui est une implémentation (incomplète) de l' lme4approche en code R pur. lme4pureRest conçu pour être plus lisible que lme4lui-même (bien que beaucoup plus lent).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.