为什么我不能将 glmer (family=binomial) 输出与手动实现的 Gauss-Newton 算法相匹配?

机器算法验证 r 混合模式 优化 lme4-nlme
2022-02-02 19:39:45

我想将 lmer(真的是 glmer)的输出与玩具二项式示例相匹配。我已经阅读了这些小插曲,并相信我了解发生了什么。

但显然我没有。卡住之后,我根据随机效应确定了“真相”,并单独估计了固定效应。我在下面包含此代码。要查看它是否合法,您可以注释掉+ Z %*% b.k它,它将与常规 glm 的结果相匹配。我希望借用一些脑力来弄清楚为什么在包含随机效应时我无法匹配 lmer 的输出。

# 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")
}
1个回答

如果将模型拟合命令更改为以下内容,则匹配方法有效:

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

关键更改是nAGQ = 0,它与您的方法相匹配,而默认 ( nAGQ = 1) 不匹配。 nAGQ表示“自适应 Gauss-Hermite 正交点的数量”,并设置glmer在拟合混合模型时如何整合随机效应。nAGQ大于 1 时,自适应正交与nAGQ点一起使用。当 时nAGQ = 1,使用拉普拉斯近似,当 时nAGQ = 0,积分被“忽略”。不太具体(因此可能过于技术性)nAGQ = 0意味着随机效应仅通过其估计的条件模式影响固定效应的估计 - 因此,nAGQ = 0不能完全解释随机效应的随机性。为了充分考虑随机效应,需要将它们整合出来。nAGQ = 0但是,正如您发现的那样,和之间的差异nAGQ = 1通常很小。

您的匹配方法不适用于nAGQ > 0. 这是因为在这些情况下,优化需要三个步骤:(1)惩罚迭代重加权最小二乘法(PIRLS)来估计随机效应的条件模式,(2)(大约)整合关于其条件模式的随机效应,以及(3)目标函数的非线性优化(即积分的结果)。这些步骤本身被迭代直到收敛。您只是在进行迭代重新加权最小二乘 (IRLS) 运行,它假设b已知并放入Z%*%b偏移项。您的方法结果与 PIRLS 等效,但这种等效性仅在您用于glmer获取估计的条件模式时才成立(否则您不会知道)。

如果没有很好地解释这一点,我们深表歉意,但这不是一个适合快速描述的主题。您可能会发现 https://github.com/lme4/lme4pureR很有用,它是lme4纯 R 代码中该方法的(不完整)实现。 lme4pureR被设计为比lme4它本身更具可读性(虽然慢得多)。