You need to enable JavaScript to run this app. 基于已拟合GAM模型如何预测未来4周的登革热病例数
优惠活动
大模型
产品
解决方案
定价
更多

基于已拟合GAM模型如何预测未来4周的登革热病例数

当前实现存在的核心问题
  • 拟合代码存在低级拼写错误:family = gaussian(link = indentity) 中indentity拼写错误,正确应为identity,这个问题会直接导致模型拟合阶段就抛出错误,无法正常运行。
  • 预测代码完全不符合mgcv包GAM模型的调用规则:predict.gam()函数本身没有n.ahead参数,这个参数是ARIMA等时间序列模型专属的,传入后会被函数直接忽略;同时你没有传入预测所需的新数据集newdata,这种写法最终只会返回训练集(1-32周)上的拟合值,完全无法实现33-36周的外推预测。
正确的GAM短期预测操作流程
  1. 修正并正常拟合模型
    首先确保加载mgcv包,修正拼写错误后跑通模型:
    library(mgcv)
    # 前提:dengue数据集内的Time变量为数值型,取值对应1-32周的周序号
    model <- gam(
      Cases ~ s(Time, k=5, bs="cs"), 
      data = dengue, 
      family = gaussian(link = "identity")
    )
    
  2. 构造预测专用的新数据集
    predict函数需要通过newdata参数接收待预测的自变量取值,针对33-36周的预测,需要构造和训练集变量名、类型完全一致的输入框:
    # 训练集Time最大取值为32,向后延伸4个周序作为预测输入
    new_pred_data <- data.frame(
      Time = 33:36
    )
    
    这里需要注意:如果模型公式中包含其他协变量,必须把所有协变量的预测取值都补全在这个数据框里,否则predict会抛出变量缺失的错误。当前模型仅包含Time的光滑项,因此仅需传入Time的取值即可。
  3. 生成带标准误的预测结果
    显式把新数据集传入predict函数,开启标准误返回:
    prediction <- predict(
      model,
      newdata = new_pred_data,
      se.fit = TRUE
    )
    
    执行完成后,返回列表中的prediction$fit为33-36周的病例数预测均值,prediction$se.fit为对应预测值的标准误,可直接用于构造预测区间。
  4. (可选)整理结构化的预测结果
    可以把预测值、置信区间拼接成便于查看的表格:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 10:06:02