我有一个关于使用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的答案),这一点受到了阻碍。之后,该矩阵被分解成较小的矩阵,这就是为什么即使在我的领域中使用“大”数据集时,我也不会遇到内存问题的原因。 - SimonGmmList
的建议完美地回答了我的问题。 - SimonG