我正在尝试拟合一个混合效应模型,然后使用该模型在可能具有不同级别的新数据集上生成估计值。我原以为新数据集上的估计会使用估计参数的平均值,但事实并非如此。下面是一个最低限度的工作示例:
library(lme4)
d = data.frame(x = rep(1:10, times = 3),
y = NA,
grp = rep(1:3, each = 10))
d$y[d$grp == 1] = 1:10 + rnorm(10)
d$y[d$grp == 2] = 1:10 * 1.5 + rnorm(10)
d$y[d$grp == 3] = 1:10 * 0.5 + rnorm(10)
fit = lmer(y ~ (1+x)|grp, data = d)
newdata = data.frame(x = 1:10, grp = 4)
predict(fit, newdata = newdata, allow.new.levels = TRUE)
在这个例子中,我本质上是用不同的回归方程定义三组(斜率为1、1.5和0.5)。然而,当我试图在一个看不见的新数据集上进行预测时,我得到了一个恒定的估计。我本以为斜率和截距的预期值会用于生成对这些新数据的预测。我是不是期待错了?或者,我的代码做错了什么?
如果不包括固定斜率,我通常不会包括随机斜率。predict.merMod
似乎同意我的观点,因为它似乎只是简单地使用固定效应来预测新的水平。文件中说,"预测将使用以前未观测到水平的数据的无条件(总体水平)值",但这些值似乎不是用模型规范估计的。
因此,我建议这个模型:
fit = lmer(y ~ x + (x|grp), data = d)
newdata = data.frame(x = 1:10, grp = 4)
predict(fit, newdata = newdata, allow.new.levels = TRUE)
# 1 2 3 4 5 6 7 8 9 10
#1.210219 2.200685 3.191150 4.181616 5.172082 6.162547 7.153013 8.143479 9.133945 10.124410
这与只使用模型的固定效果部分相同:
t(cbind(1, newdata$x) %*% fixef(fit))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] 1.210219 2.200685 3.19115 4.181616 5.172082 6.162547 7.153013 8.143479 9.133945 10.12441
也许还不够清楚,但我认为?predict.merMod
的文档(合理地)清楚地说明了allow.new.levels=TRUE
时会发生什么。我想歧义可能在于"无条件(群体水平)值";方法
allow.new.levels
:如果"newdata"中的新级别(或NA值)为允许。如果为FALSE(默认值),则"newdata"中的这些新值将触发错误;如果为TRUE,则预测将使用具有的数据的无条件(总体级别)值以前未观察到的水平(或NA)。
"无条件(人口水平)";意味着相应的随机效应分量被设置为零——如果我们不能对特定组的观测数据进行条件,我们就会这样做,因为我们不想指定预测是针对特定组的