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

时间:2015-06-17 15:52:51

标签: r matrix sparse-matrix lme4 lmer

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

我通常通过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得到什么?

1 个答案:

答案 0 :(得分:1)

如果mmList存在,那么它就不会消失(无论文件记录不清楚 - 随意建议文档改进......)。 <怎么样

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

(对于多学期模型,似乎可以正确推广)?

我同意Zt在结构和非结构零之间没有正确区分它有点痛苦 - 有可能更改底层代码以使其工作如果它足够重要,但我认为我们需要一个非常引人注目的用例是很难的......