可以为 nlme 拟合绘制交互方式,但不能为 lme4 绘制交互方式

Can plot interaction means for nlme fit, but not for lme4

使用这个虚拟数据集:

dummy.data <- data.frame(vaccinated = factor(rep(c("yes", "no"), each = 64)),
  infected = factor(rep(c("yes", "no"), each = 32)),
  animal = factor(rep(1:16, each = 8)),
  tissue = factor(c("blood", "liver", "kidney", "brain")),
  value = runif(128)
  )

这个有效:

library("nlme")
nlme.model <- as.formula(value ~ vaccinated * infected * tissue)
nlme.fit <- lme(fixed = nlme.model, random = ~1|animal, data = dummy.data)
library("phia")
int.nlme <- interactionMeans(nlme.fit)
plot(int.nlme)

但这不是:

library("lme4")  
lmer.model <- as.formula(value ~ vaccinated * infected * tissue + (1 | animal))
lmer.fit <- lmer(formula = lmer.model, data = dummy.data)
library("phia")
int.lmer <- interactionMeans(lmer.fit)
plot(int.lmer)

对于后者,我只得到

Error in t.default(M) : argument is not a matrix

来自 plot 命令。

当我查看 int.nlmeint.lmerstr 时,它们确实看起来不同,但我无法弄清楚问题出在哪里。非常感谢任何意见。

错误似乎是由 phia:::poolse 产生的,因此可以重现:

> phia:::poolse(int.nlme, "adjusted mean","vaccinated")
vaccinated
        no        yes 
0.04483019 0.04483019 
> phia:::poolse(int.lmer, "adjusted mean","vaccinated")
Error in t.default(M) : argument is not a matrix

还在挖掘...

我得出结论,它是 phia 包中的一个错误,它忽略了这一点:

When writing an R package that uses the Matrix package, why do I have to specify Matrix::t() instead of just t()?

作为一种解决方法,为了增加威力,将 int.lmer 的 "covmat" 属性从 Matrix 类 改为标准 R matrix 类:

> int.lmer <- interactionMeans(lmer.fit)
> plot(int.lmer)
Error in t.default(M) : argument is not a matrix
> attr(int.lmer, "covmat") = lapply(attr(int.lmer,"covmat"),as.matrix)
> plot(int.lmer)

然后情节有效。

我确认这实际上是错误的原因:必须将 lmer 的协方差矩阵转换为 "normal" 矩阵才能使绘图生效。解决这个问题是我待办事项列表中的优先事项,我想在今年夏天做一系列的修复工作。但是,如果有人想为加快更新做出贡献,您可以向 Github:

中的存储库提出拉取请求

https://github.com/heliosdrm/phia