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

4
我有一个关于使用R中的lmer (lme4)拟合模型时提取随机效应 (原始) 模型矩阵的问题。 更具体地说,我想获得一个包含所有涉及随机效应项的变量的数据框或矩阵。 这个问题更加复杂,因为该矩阵的某些条目为零。
通常,我通过访问稀疏模型矩阵 (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期望什么?

你能详细说明一下为什么你需要完整的矩阵而不是稀疏矩阵吗?似乎Matrix包(即稀疏矩阵)更有用,因为它更容易推广使用......在处理大型数据集时,我曾试图避免使用Matrix,但却遇到了问题和内存问题。 - alexwhitworth
正如我在问题中所写的那样,我需要给定模型中随机效应的设计矩阵,即包含与随机效应相关的预测变量的(N*q)模型矩阵。Zt插槽并没有给出确切的结果,这使得需要转换Zt,但由于结构零的处理方式(请参见下面Ben的答案),这一点受到了阻碍。之后,该矩阵被分解成较小的矩阵,这就是为什么即使在我的领域中使用“大”数据集时,我也不会遇到内存问题的原因。 - SimonG
我理解您“需要”设计矩阵。我问的是为什么需要它(而不是是否需要)。您在这里只是简单地重申了您对它的需求。我的评论是建议,如果您学会使用稀疏矩阵,那么稀疏矩阵可能已经足够了。也许不是。如果您不想详细说明您的请求,那没问题。您似乎已经从Bolker博士那里得到了可行的解决方案。 - alexwhitworth
使用稀疏矩阵可能更具计算效率,我将来可能会尝试。然而,正如我在上一条评论中所解释的那样,我的情况不太可能出现内存问题。因此,Ben关于mmList的建议完美地回答了我的问题。 - SimonG
1个回答

3
如果 `mmList` 存在,那么它不会消失(即使它的文档可能非常不好 -- 欢迎提出文档改进建议...)。怎么样?
do.call(cbind,getME(m2,"mmList"))

(这似乎适用于多项式模型的概括正确吗?)
我同意Zt不能正确区分结构零和非结构零,这有点麻烦。如果这很重要,可能可以更改底层代码使其正常工作,但我认为这将是非常困难的,我们需要一个相当强有力的用例...

嗨,本!这是一个非常优雅的解决方案,我很高兴得知mmList可以扩展到更大的问题。我无法真正为文档提出改进意见,但我在网上提出了这个问题,以便人们可以找到使用mmList而不是Zt的参考资料。 - SimonG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接