lme4 的预测更上一层楼

Prediction with lme4 on new levels

提问人:random_forest_fanatic 提问时间:3/25/2015 更新时间:6/29/2023 访问量:18617

问:

我正在尝试拟合一个混合效应模型,然后使用该模型在可能具有不同级别的新数据集上生成估计值。我预计新数据集的估计值将使用估计参数的平均值,但事实似乎并非如此。下面是一个最低限度的工作示例:

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)定义了三个组。但是,当我尝试以看不见的水平对新数据集进行预测时,我会得到一个恒定的估计值。我本来希望斜率和截距的期望值用于生成此新数据的预测。我是不是期待错了?或者,我的代码做错了什么?

R 预测 LME4 混合模型 随机效应

评论

2赞 Roland 3/26/2015
我相信只是将模型的固定效应部分的系数用于新的水平。 是一个更合理的模型规范。predict.merMody ~ x + (x|grp)
0赞 random_forest_fanatic 3/26/2015
啊,这是有道理的!如果你把它作为一个答案,我会接受它。

答:

18赞 Roland 3/26/2015 #1

我通常不会在不包括固定斜率的情况下包括随机斜率。这似乎同意我的观点,因为它似乎只是简单地使用固定效应来预测新的水平。文档说“预测将使用具有以前未观察到水平的数据的无条件(总体水平)值”,但这些值似乎不是使用您的模型规范估计的。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

评论

0赞 Sapiens 9/10/2020
我知道这仍然只会在新的预测中使用固定效应。但是,如何添加随机效果?
0赞 Roland 9/10/2020
我不明白你的问题。
0赞 Sapiens 9/10/2020
正如您之前所说:“predict.merMod 仅将模型中固定效应部分的系数用于新水平”。有没有办法也包括随机效应 (x|grp)?
0赞 Roland 9/10/2020
当然,这是默认设置。您只需要使用默认的 .当然,你无法预测新关卡的随机效应(这些关卡不是训练数据的一部分)。这在概念上是不可能的。allow.new.levels = FALSE
1赞 Sapiens 9/12/2020
明白了。我有兴趣找到一个全新主题的随机效应估计,我想我使用了错误的方法。无论如何谢谢你。
7赞 Ben Bolker 3/26/2015 #2

也许这还不够清楚,但我认为状态的文档(合理地)清楚地说明了当.我想歧义可能在于什么 “无条件(人口水平)值”是指......?predict.merModallow.new.levels=TRUE

allow.new.levels:如果“newdata”中的新水平(或 NA 值)是 允许。如果为 FALSE(默认值),则“newdata”中的此类新值 将触发错误;如果为 TRUE,则预测将使用 具有 以前未观察到的水平(或NA)。

“无条件(总体水平)”意味着相应的随机效应分量设置为零——如果我们无法对特定组的观测数据进行条件调整,我们就会这样做,因为我们不想指定预测是针对特定组的

评论

0赞 Arthur 9/29/2022
我正在经历与原始海报类似的困惑。您能详细说明一下“allow.new.levels”是如何工作的吗?什么是无条件(人口级别)值?
1赞 Ben Bolker 9/29/2022
无条件/总体水平意味着相应的随机效应设置为零(如果我们不能以观察结果来自特定群体这一事实为条件,我们会这样做)
0赞 Arthur 9/29/2022
欣赏答案。对于复杂情况是否可靠,例如,正在为新的但已知的分层项预测?我认为这里有意义的是将新系数设置为零,但使用适合系数来表示适当的.predict.merModindividual\familyindividualfamilyindividualfamily
1赞 Ben Bolker 9/29/2022
是的。您可以使用包含/排除相关术语,或将指定的系列设置为新的(以前未观察到的)级别并使用re.formallow.new.levels = TRUE