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

标签 r matrix sparse-matrix lme4 lmer

我有一个关于从 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/

相关文章:

matlab - 矩阵除法的问题

java - Java中的稀疏矩阵/数组

R 包小插图

r - 为什么 `stringsAsFactors` 在 R 中使用大写字母来提高可读性?

r - 求解 R 中 desolve 包中已编译的 ODE

C 将矩阵读入动态数组

r - 分组后在 dplyr 中使用 t.test 汇总

c - 高斯消元法 - 线性方程矩阵,算法

r - 将 tibble 作为带有行名称的矩阵展开

python - 使用 scikit-learn 在 Python 中使用稀疏矩阵进行 kNN 估计?