可以为 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.nlme
和 int.lmer
与 str
时,它们确实看起来不同,但我无法弄清楚问题出在哪里。非常感谢任何意见。
错误似乎是由 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:
中的存储库提出拉取请求
使用这个虚拟数据集:
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.nlme
和 int.lmer
与 str
时,它们确实看起来不同,但我无法弄清楚问题出在哪里。非常感谢任何意见。
错误似乎是由 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:
中的存储库提出拉取请求