predictInterval()
包中的merTools
与嵌套随机效果不一样吗?例如,使用msleep
包中的ggplot2
数据集:
library("lme4")
library("merTools")
library("ggplot2")
mod <- lmer(sleep_total ~ bodywt + (1|vore/order), data=msleep)
predInt <- predictInterval(merMod=mod, newdata=msleep)
返回错误:
Error in '[.data.frame'(newdata, , j) : undefined columns selected
这样运行没问题:
mod <- lmer(sleep_total ~ bodywt + (1|vore) + (1|order), data=msleep)
predInt <- predictInterval(merMod=mod, newdata=msleep)
(实际上,它会对随机效应变量中的NA
级别发出警告,但我并不关心这一点。
正如Ben Bolker在下面的回答中所述,新版merTools
说明了嵌套随机效应。但是,当我尝试预测包含新级别嵌套随机效果的数据时,我会收到错误。
这有效:
mod <- lmer(sleep_total ~ bodywt + (1|vore/order), data=msleep)
predInt <- predictInterval(merMod=mod, newdata=msleep)
虽然有一些警告(见下面关于警告的其他问题*),但这有效:
mod <- lmer(sleep_total ~ bodywt + (1|vore) + (1|order), data=msleep)
msleep2 <- msleep %>% mutate(vore = "omni")
predInt <- predictInterval(merMod=mod, newdata=msleep2)
但这不起作用:
mod <- lmer(sleep_total ~ bodywt + (1|vore/order), data=msleep)
msleep2 <- msleep %>% mutate(vore = "omni")
predInt <- predictInterval(merMod=mod, newdata=msleep2)
出现以下错误:
Error in `[.data.frame`(tmp, alllvl) : undefined columns selected
In addition: Warning message:
In predictInterval(merMod = mod, newdata = msleep3) :
newdata is tbl_df or tbl object from dplyr package and has been
coerced to a data.frame
在这里,"omni"
实际上并不是vore
的新级别,但与order
结合使用时,会创建新的嵌套变量组合。
如果我使用"new"
或其他任何未观察到的vore
级别,我会得到类似的结果:它适用于模型的非嵌套版本,但不适用于嵌套版本。
*此外,我是否应该关注上面第二个模型块发出的警告:
> mod <- lmer(sleep_total ~ bodywt + (1|vore) + (1|order), data=msleep)
> msleep2 <- msleep %>% mutate(vore = "omni")
> predInt <- predictInterval(merMod=mod, newdata=msleep2)
Warning messages:
1: In predictInterval(merMod = mod, newdata = msleep2) :
newdata is tbl_df or tbl object from dplyr package and has been
coerced to a data.frame
2: In chol.default(sigma, pivot = TRUE) :
the matrix is either rank-deficient or indefinite
我猜第二个是vore
对每个观察值采用相同值的结果,但这不应该成为预测的问题,是吗?如果变量在我拟合模型时具有相同的值,我可以看到这是一个问题,但是在预测新观察时不会认为它应该是一个问题?
答案 0 :(得分:3)
通过明确地写出交互术语,可以(显然)解决这个问题。 警告:我实际上没有检查过以确保结果预测是正确的,只是看到没有产生错误并且生成的对象近似合理......
msleep <- transform(msleep,voreOrder=interaction(vore,order,drop=TRUE))
mod2 <- lmer(sleep_total ~ bodywt + (1|vore)+(1|voreOrder), data=msleep)
predInt <- predictInterval(merMod=mod2, newdata=msleep)
这确实会生成警告消息,但显然它们归因于<NA>
变量中的vore
值(我不知道此数据集......)