打开网易新闻 查看精彩图片

系列简介

这是我们一系列原创技术贴,从易到难,每天学习一点。所有内容均为疾控数据分析、科研论文相关,或者说很多和现在的热门监测预警相关,所以我们这个系列就叫“监测预警基础”。

今天是第47节,这算是我们一个小专题吧,大概11讲,我们细化,短篇化,彻底把ARIMA模型搞懂。

今天是学透ARIMA专题第8讲的内容,终于来到了季节性模型。

上一篇我们跑完了基础 ARIMA 的模型评价,很多同行跑完手足口病数据都发现了同一个问题:

残差明明通过了白噪声检验,历史拟合也没问题,但测试集预测误差特别大,MAPE 甚至超过 50%,根本没法用。

这不是代码写错了,而是基础 ARIMA 的天生局限它只能捕捉序列的短期自相关趋势,完全处理不了传染病最核心的「年度季节性流行规律」。像手足口、流感这类有固定夏秋季 / 冬春季高峰的疾病,用普通 ARIMA 预测必然会周期错位,误差飙升。

这一篇我们就讲疾控场景最常用的进阶模型 ——SARIMA,也就是ARIMA季节性模型,专门适配传染病的周期性流行特征,也是绝大多数传染病预测论文里的标配模型。我们继续用你的手足口病周数据实操,跑完你就能直观看到:加入季节性后,预测精度会有质的提升。

打开网易新闻 查看精彩图片

基础 ARIMA 只有 3 个参数(p, d, q),只能处理序列的短期波动;而 SARIMA 全称是季节性自回归积分滑动平均模型,在基础 ARIMA 的基础上,新增了 3 个季节性参数,专门捕捉固定周期的流行规律。

它的完整参数格式是:

们分成两组,用疾控场景的大白话逐个讲透:

第一组:普通阶数(p, d, q):和基础 ARIMA 完全一致,管短期非季节性的波动规律

  • p就是普通自回归阶数,捕捉短期病例数的自相关性
  • d就是普通差分阶数,消除长期上升 / 下降趋势
  • q就是普通移动平均阶数,捕捉短期随机冲击的影响

第二组:季节阶数(P, D, Q)SARIMA 的核心,管周期性的流行规律
  • P:季节自回归阶数,捕捉历史同期(比如去年同周)的病例对今年的影响
  • D:季节差分阶数,消除序列的季节性波动(比如年度高峰的周期影响)
  • S:周期长度,是季节性模型的基础参数,疾控场景固定两个值:周度监测数据就是52,月度就是12。


一句话总结:普通参数管本周和前几周的关系,季节参数管本周和去年同周的关系,两者结合就能同时捕捉短期波动和年度流行周期,完美适配传染病的发病特征。

打开网易新闻 查看精彩图片

和基础 ARIMA 建模的逻辑其实是一致的,只是多了季节性的步骤,完整流程是:

  1. 时序可视化:肉眼识别是否有固定周期、趋势

  2. 平稳性处理:普通差分消趋势,季节差分消周期

  3. 模型定阶:ACF/PACF 手动定阶 + auto.arima 自动选优

  4. 模型拟合 + 残差白噪声检验

  5. 预测 + 效果评价

和基础 ARIMA 最大的区别:平稳性需要同时满足「普通平稳」和「季节性平稳」,对应 d 和 D 两个差分阶数。

打开网易新闻 查看精彩图片

我们还是接着用上一篇的基础数据

test_ts <- ts(test_data, start = c(2025, 33), frequency = 52)
步骤 1:识别季节性,判断是否需要季节差分

     col = "#1E90FF")

步骤 2:自动拟合最优 SARIMA 模型(日常工作首选)

和基础 ARIMA 一样,auto.arima()开启季节性后,会自动筛选最优的普通参数 + 季节参数,一步输出最优模型:

sarima_best

开启季节性后,软件会自动检验普通平稳性和季节平稳性,确定 d 和 D,再遍历 p、q、P、Q 的组合,选出 AIC 最小的最优模型,和基础 ARIMA 的逻辑完全一致。

步骤 3:手动拟合 SARIMA 模型(学习原理用)

如果已经通过 ACF/PACF 确定了参数,可以手动指定参数拟合,和基础 ARIMA 的arima()函数一致,多了seasonal参数:

sarima_manual
步骤 4:残差白噪声检验(必做步骤)

和基础 ARIMA 完全一致,残差必须是白噪声,才算模型合格:

Box.test(residuals(final_sarima), type = "Ljung-Box", lag = 10)

合格标准:P 值 > 0.05,残差无显著自相关,模型提取了全部有效信息(包括短期和季节性规律)。

步骤 5:预测与效果评价(和基础 ARIMA 对比)

预测 20 周(对应测试集长度),计算误差指标,和上一篇的基础 ARIMA 做对比:

accuracy(sarima_pre$mean, test_ts)

会看到直观的提升:对比基础 ARIMA 50%+ 的 MAPE,加入季节性后,测试集 MAPE 会大幅下降,预测精度会有质的飞跃,这就是季节性模型的核心价值。

步骤 6:预测效果可视化

       inset = 0.02)

打开网易新闻 查看精彩图片

1. 周度数据的 53 周问题:个别年份有 53 周,会导致周期长度不一致,季节性建模出现偏差。解决方法:统一剔除每年的第 53 周数据,保证所有年份都是 52 周,周期长度固定。
2. 季节差分阶数 D 不要超过 1:和普通差分 d 一样,季节差分不是越多越好。疾控场景的传染病数据,D 取 0 或 1 就足够,过度季节差分会丢失大量有效信息,反而降低预测精度。
3. 不是所有数据都适合加季节性:如果时序图没有明显的固定周期,或者数据量不足 2 个完整周期(比如周度数据不到 2 年),不要强行加季节性,否则模型会过拟合,效果反而更差。
4. 95% 置信区间的预警用法:SARIMA 模型的预测 95% 置信区间上限,就是疾控预警的核心阈值:真实病例数在区间内属于正常季节性波动,真实病例数超过 95% 置信上限:超出既往流行规律,提示可能出现暴发风险,触发预警。

总体来看,ARIMA 和SARIMA操作没有太大区别,主要在3点

第一,也是最主要的, 自动建模:auto.arima()的开关决定了模型的完整结构

这是最常用的日常建模方式,差异最直观:

seasonal = FALSE:只拟合基础 ARIMA,输出 3 个参数ARIMA(p,d,q)

,只筛选普通阶数 p、d、q;

seasonal = TRUE:拟合 SARIMA 季节性模型,输出完整 7 个参数,ARIMA(p,d,q)(P,D,Q)[s],软件会自动同时筛选普通阶数 p/d/q + 季节阶数 P/D/Q,基于 AIC 选出全局最优模型。

补充细节:周期s不是由seasonal参数决定的,而是由你ts()里设置的frequency决定的。周度数据frequency=52,开了季节性后自动按 52 周的年周期拟合;如果 frequency 设错了,开 seasonal 也会完全失效。

第二是手动拟合的时候语法不一样

第三是差分的时候不一样

完整R代码

       lwd = 2, lty = c(1,1,1,3), bty = "n", y.intersp = 1.8)

搞定了季节性 SARIMA,我们就覆盖了单变量时间序列的核心建模方法。但实际疾控工作中,传染病发病还受气温、湿度、节假日、防控政策等外部因素的影响。

下一篇我们讲ARIMAX 带协变量的 ARIMA 模型,教你把气象、干预措施等外部因素加入模型,进一步提升预测精度,适配更复杂的疾控场景。

参考:

《时间序列分析-基于R》. [M] .王燕.中国人民大学出版社出版

传染病预测预警技术及实践案例分析. [M]. 杨鹏, 王小莉. 人民卫生出版社

打开网易新闻 查看精彩图片

打开网易新闻 查看精彩图片

编辑:普通疾控人 | 审核:诗酒趁年华

文章来源 | 原创

说明 | 转载只为分享,如有侵权联系删除

©版权声明 | 部分信息和图片来自公开网络

转载请注明

再次转载请注明出处

打开网易新闻 查看精彩图片

科普健康 | 宣传疾控

本号为多位疾控机构从业者运营

重点关注国内外健康事件

致力于疾控科普

在做好科普服务大众的同时

做好疾控机构的宣传

让更多的人了解疾控,拥抱健康

欢迎加「小编」微信(cdcjkr126com)

本文具体说明

本文为原创内容,文章为个人理解所学,不涉及疫情信息及内部保密数据,发表的目的为自我总结及给有需求的人士学习使用。如有不妥之处,欢迎联系小编修改、删除。

更多精彩视频,尽在“CDC疾控人”视频号

打开网易新闻 查看精彩图片