我有一个关于从 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
不能正确区分结构零和非结构零,这有点令人痛苦——如果它可以更改底层代码以使其工作,可能是有可能的足够重要,但我认为这已经够难了,我们需要一个非常引人注目的用例......
关于r - 从 lmer 对象 (lme4, R) 中提取随机效应的原始模型矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30896540/