R语言中线性混合模型的预测:基于lme4包sleepstudy数据集预测未观测天数的反应值
解决lme4混合模型的新时间点预测问题
没问题,这就带你一步步实现对18名受试者在Day=12和Day=14的Reaction值预测,最终得到你想要的三列数据集:
步骤1:生成待预测的新数据集
首先我们需要创建一个包含所有受试者(18名)和目标天数(12、14)的组合数据框,用expand.grid()函数就能轻松实现:
# 提取sleepstudy里的所有受试者(去重) subjects <- unique(sleepstudy$Subject) # 定义需要预测的天数 new_days <- c(12, 14) # 创建包含所有预测组合的数据集 new_data <- expand.grid(Days = new_days, Subject = subjects)
这一步会生成36行(18个受试者×2个天数)的数据框,刚好覆盖我们需要预测的所有场景。
步骤2:用拟合好的模型生成预测值
我们已经有了含随机截距的模型fit1,直接调用predict()函数就能生成受试者特异性的预测值,注意要指定newdata参数为我们刚创建的数据集:
# 生成预测值,默认会纳入每个受试者的随机截距(条件预测) new_data$Predicted_Response <- predict(fit1, newdata = new_data)
这里要说明:predict(lmer模型)默认是条件预测,也就是会结合每个受试者的随机截距计算个性化预测值,这正是我们需要的;如果想要只看固定效应的平均预测(不考虑个体差异),可以加re.form = ~0参数,但这里我们不需要这个选项。
步骤3:查看最终结果
现在new_data就是符合要求的三列数据集了,直接打印就能看到格式:
print(new_data)
输出会和你预期的完全一致:
Days Subject Predicted_Response
12 308 [对应预测值]
12 309 [对应预测值]
...
14 371 [对应预测值]
14 372 [对应预测值]
完整代码汇总
把所有步骤整合起来,完整可运行的代码如下:
library("lme4") # 加载数据集 data(sleepstudy) # 拟合含随机截距的线性混合模型 fit1 <- lmer(Reaction ~ Days + (1 | Subject), data = sleepstudy) # 生成待预测的新数据集 subjects <- unique(sleepstudy$Subject) new_days <- c(12, 14) new_data <- expand.grid(Days = new_days, Subject = subjects) # 生成预测值并添加到数据框 new_data$Predicted_Response <- predict(fit1, newdata = new_data) # 预览结果 head(new_data)
内容的提问来源于stack exchange,提问作者John Majimboni
相关产品推荐
相关产品推荐

