![]()
系列简介
这是我们一系列原创技术贴,从易到难,每天学习一点。所有内容均为疾控数据分析、科研论文相关,或者说很多和现在的热门监测预警相关,所以我们这个系列就叫“监测预警基础”。
今天是第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 建模的逻辑其实是一致的,只是多了季节性的步骤,完整流程是:
时序可视化:肉眼识别是否有固定周期、趋势
平稳性处理:普通差分消趋势,季节差分消周期
模型定阶:ACF/PACF 手动定阶 + auto.arima 自动选优
模型拟合 + 残差白噪声检验
预测 + 效果评价
和基础 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疾控人”视频号
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.