基于已拟合GAM模型如何预测未来4周的登革热病例数
当前实现存在的核心问题
- 拟合代码存在低级拼写错误:
family = gaussian(link = indentity)中indentity拼写错误,正确应为identity,这个问题会直接导致模型拟合阶段就抛出错误,无法正常运行。 - 预测代码完全不符合
mgcv包GAM模型的调用规则:predict.gam()函数本身没有n.ahead参数,这个参数是ARIMA等时间序列模型专属的,传入后会被函数直接忽略;同时你没有传入预测所需的新数据集newdata,这种写法最终只会返回训练集(1-32周)上的拟合值,完全无法实现33-36周的外推预测。
正确的GAM短期预测操作流程
- 修正并正常拟合模型
首先确保加载mgcv包,修正拼写错误后跑通模型:library(mgcv) # 前提:dengue数据集内的Time变量为数值型,取值对应1-32周的周序号 model <- gam( Cases ~ s(Time, k=5, bs="cs"), data = dengue, family = gaussian(link = "identity") ) - 构造预测专用的新数据集
predict函数需要通过newdata参数接收待预测的自变量取值,针对33-36周的预测,需要构造和训练集变量名、类型完全一致的输入框:
这里需要注意:如果模型公式中包含其他协变量,必须把所有协变量的预测取值都补全在这个数据框里,否则predict会抛出变量缺失的错误。当前模型仅包含Time的光滑项,因此仅需传入Time的取值即可。# 训练集Time最大取值为32,向后延伸4个周序作为预测输入 new_pred_data <- data.frame( Time = 33:36 ) - 生成带标准误的预测结果
显式把新数据集传入predict函数,开启标准误返回:
执行完成后,返回列表中的prediction <- predict( model, newdata = new_pred_data, se.fit = TRUE )prediction$fit为33-36周的病例数预测均值,prediction$se.fit为对应预测值的标准误,可直接用于构造预测区间。 - (可选)整理结构化的预测结果
可以把预测值、置信区间拼接成便于查看的表格:pred_table <- data.frame( Week = 33:36, Pred_Cases = round(prediction$fit, 1), CI_95_Lower = round(prediction$fit - 1.96 * prediction$se.fit, 1), CI_95_Upper = round(prediction$fit + 1.96 * prediction$se.fit, 1) )
补充说明:你使用的
bs="cs"是收缩型薄板回归样条,短期外推的逻辑是沿着训练集最右端(32周位置)的样条切线趋势线性延伸,你仅外推4周,距离训练区间很近,结果可信度较高;如果外推距离超过训练区间长度的1/5,结果会随着外推距离增加快速失真,需要谨慎解读。
内容的提问来源于stack exchange,提问作者Knovolt
相关产品推荐
相关产品推荐

