从 lmer 对象 (lme4, R) 中提取随机效应的原始模型矩阵

Extract raw model matrix of random effects from lmer objects (lme4, R)

我有一个关于从 R 中装有 lmer (lme4) 的模型中提取随机效应的(原始)模型矩阵的问题。 更具体地说,我想获得一个数据框或一个矩阵,其中包含随机效应项中涉及的所有变量。 事情变得更加复杂,因为该矩阵的某些条目为零。

我通常通过 getME 访问稀疏模型矩阵 (Zt) 来提取这些矩阵,然后通过其维度将其转换为常规矩阵(见下文)。 但是,只要(原始)模型矩阵包含零,这就会导致问题,因为 Zt 仅包含非零元素。

这是一个示例,一个简单的混合效应模型,其中 x1 是正常的,x2 包含五个正好为零的值:

id <- rep(1:20,each=5)
y <- rnorm(100)
x1 <- rnorm(100)
x2 <- c(rep(0,5),rnorm(95))
df <- data.frame(id,x1,x2,y)

我使用 lmer 拟合两个模型,一个使用 x1,另一个使用 x2 作为预测变量:

library(lme4)    
m1 <- lmer(y~1+x1+(1+x1|id), data=df)
m2 <- lmer(y~1+x2+(1+x2|id), data=df)

在这里,我访问了拟合模型对象的 Zt 插槽。 下面的代码演示 Zt 不包含 x2 中的零值。 结果,我非常简单地转换为常规矩阵会引发错误。

# length okay
length(getME(m1,"Zt")@x)
# model matrix okay
mm1 <- matrix(getME(m1,"Zt")@x, ncol=2, byrow=T)

# too short
length(getME(m2,"Zt")@x)
# gives error on model matrix
mm2 <- matrix(getME(m2,"Zt")@x, ncol=2, byrow=T)

这是我认为我可以做的。 lmer 似乎也保存了原始矩阵,只要只有一个簇变量,它似乎就可以正常工作。

# seems to work okay
mm3 <- getME(m2,"mmList")[[1]]

然而,mmList 插槽在网上的记录很少,我几乎没有提到人们用它来编程。 到目前为止,访问 Zt 似乎是更常见的选择。

即使原始模型矩阵包含零,是否可以从 Zt 构建随机效应模型矩阵? 如果不是,那么我对 mmList 有何期待?

如果 mmList 存在,则它不会消失(无论它的文档记录多么糟糕——随时提出文档改进建议...)。怎么样

do.call(cbind,getME(m2,"mmList"))

(对于多项模型似乎可以正确概括)?

我同意 Zt 不能正确区分结构零和非结构零,这有点痛苦——如果它是足够重要,但我认为这已经够难了,我们需要一个非常引人注目的用例 ...