我有一个关于从R中拟合lmer
(lme4
)的模型中提取随机效应的(原始)模型矩阵的问题。
更具体地说,我想获得一个数据框或矩阵,其中包含随机效应项中涉及的所有变量。
事情进一步复杂化,因为该矩阵的某些条目为零。
我通常通过Zt
访问稀疏模型矩阵(getME
)来提取这些矩阵,之后我通过其维度将其转换为常规矩阵(见下文)。
但是,只要(原始)模型矩阵包含零,就会出现问题,因为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
得到什么?
答案 0 :(得分:1)
如果mmList
存在,那么它就不会消失(无论文件记录不清楚 - 随意建议文档改进......)。 <怎么样
do.call(cbind,getME(m2,"mmList"))
(对于多学期模型,似乎可以正确推广)?
我同意Zt
在结构和非结构零之间没有正确区分它有点痛苦 - 有可能更改底层代码以使其工作如果它足够重要,但我认为我们需要一个非常引人注目的用例是很难的......