在新水平上使用 lme4 进行预测
Prediction with lme4 on new levels
我正在尝试拟合混合效应模型,然后使用该模型生成对可能具有不同级别的新数据集的估计。我预计对新数据集的估计会使用估计参数的平均值,但事实似乎并非如此。这是一个最小的工作示例:
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
似乎同意我的观点,因为它似乎只使用固定效应来预测新水平。文档说 "the prediction will use the unconditional (population-level) values for data with previously unobserved levels",但这些值似乎不是根据您的模型规格估算的。
因此,我推荐这个模型:
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
时会发生什么。我猜模棱两可可能是什么
"unconditional (population-level) values" 表示 ...
allow.new.levels
: logical if new levels (or NA values) in ‘newdata’ are
allowed. If FALSE (default), such new values in ‘newdata’
will trigger an error; if TRUE, then the prediction will use
the unconditional (population-level) values for data with
previously unobserved levels (or NAs).
我正在尝试拟合混合效应模型,然后使用该模型生成对可能具有不同级别的新数据集的估计。我预计对新数据集的估计会使用估计参数的平均值,但事实似乎并非如此。这是一个最小的工作示例:
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
似乎同意我的观点,因为它似乎只使用固定效应来预测新水平。文档说 "the prediction will use the unconditional (population-level) values for data with previously unobserved levels",但这些值似乎不是根据您的模型规格估算的。
因此,我推荐这个模型:
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
时会发生什么。我猜模棱两可可能是什么
"unconditional (population-level) values" 表示 ...
allow.new.levels
: logical if new levels (or NA values) in ‘newdata’ are allowed. If FALSE (default), such new values in ‘newdata’ will trigger an error; if TRUE, then the prediction will use the unconditional (population-level) values for data with previously unobserved levels (or NAs).