![]()
系列简介
这是我们一系列原创技术贴,从易到难,每天学习一点。所有内容均为疾控数据分析、科研论文相关,或者说很多和现在的热门监测预警相关,所以我们这个系列就叫“监测预警基础”。
今天是第46节,这算是我们一个小专题吧,大概11讲,我们细化,短篇化,彻底把ARIMA模型搞懂。
今天是学透ARIMA专题第7讲的内容,上一节R语言实操完之后如何诊断和评价这个模型?
上一篇我们跟着代码跑通了手足口病数据的第一个 ARIMA 模型,很多同行反馈:代码复制过去能跑出结果,但不知道这个模型合不合格、能不能直接用来做预测和预警。
这是新手最容易踩的坑:拟合完模型就直接用,完全跳过了诊断环节。ARIMA 不是参数填进去就一定靠谱,残差有没有提取干净、预测精度够不够,直接决定了你的预测结果能不能用于监测研判、论文写作。
这一篇我们就把 ARIMA 模型的诊断全流程讲透,全程对应疾控监测场景,看完就能判断自己的模型能不能用,出了问题也知道从哪排查。
![]()
我们建模的核心目的是用过去的规律预测未来,而模型诊断,本质就是验证两件事:
第一,模型有没有把数据里的有效规律全部提取干净;
第二,模型的预测精度,能不能满足我们的工作需要。
放在我们疾控工作里,这件事的重要性更突出:如果模型没把发病的季节性、延续性提取干净,残差里还藏着没被捕捉的规律,那用它算出来的 95% 预警阈值就会不准,要么频繁误报,要么漏报暴发风险;
如果只看模型对历史数据的拟合效果,不验证外推预测的准确性,很容易出现 “历史拟合完美,未来预测完全跑偏” 的过拟合问题,直接影响防控决策的可靠性。
一句话总结:没经过诊断的 ARIMA 模型,就像没经过验证的检测试剂,结果可信与否都不知道,根本没法用。
![]()
其实白噪声检验我们在上一节就说到过,在此我们再系统讲一讲:
残差诊断是 ARIMA 模型合格的第一道门槛,也是教材里明确要求的必做步骤。我们先把两个基础概念用大白话讲透。
第一,先搞懂:残差和白噪声是什么
残差就是真实病例数 - 模型拟合值,也就是模型没捕捉到的那部分波动。白噪声就是完全随机、没有任何规律的波动,比如零星的偶发病例、偶然的报告偏差,没有可提取的预测价值。
残差白噪声检验的核心逻辑非常简单:如果残差是白噪声,说明序列里所有有用的流行规律都已经被模型提取完了,模型是合格的;如果残差不是白噪声,说明残差里还藏着没被捕捉的规律,模型拟合不充分,需要调整优化。
第二,怎么诊断?3 张图看懂模型是否合格
R 语言里用tsdiag(模型名)一行代码就能生成 3 张诊断图,我们逐张讲怎么看,完全不用记公式。
第一张图:标准化残差时序图
![]()
这个图第一是看残差是不是围绕 0 随机波动,没有明显的上升 / 下降趋势,也没有固定的周期性高峰低谷;第二是看波动幅度是不是整体稳定,没有某一段时间突然暴涨暴跌。如果都满足,说明残差的均值和方差基本稳定,符合平稳白噪声的基础特征。
第二张图:残差的 ACF 自相关图
![]()
这是最核心的一张图,判断标准非常明确:除了滞后 0 阶(自己和自己的相关)之外,有滞后阶数的柱子都落在两条虚线(95% 置信区间)以内,没有显著的自相关性。如果有很多柱子超出虚线,说明残差里还有可提取的自相关规律,模型拟合不充分。
第三张图:Ljung-Box 检验的 P 值图
![]()
这是白噪声检验的统计验证,判断标准:图里所有的点(不同滞后阶数对应的 P 值)全部都在 0.05 的虚线以上,也就是所有 P 值都 > 0.05。P 值 > 0.05,就接受 “残差相互独立、是白噪声” 的原假设,模型通过检验。
第三,精准验证:单独做白噪声检验
想看具体的 P 值,用Box.test()函数单独做 Ljung-Box 检验,代码和解读如下:
Box.test(residuals(final_model), type = "Ljung-Box", lag = 10)
结果解读:
P 值 > 0.05:通过白噪声检验,残差无自相关,模型信息提取充分;
P 值 ≤ 0.05:未通过检验,残差存在自相关,需要调整模型。
![]()
通过白噪声检验,只能说明模型拟合是合格的,但不代表预测精度够高。要判断模型能不能用,必须量化评价预测效果。
第一,先分清:拟合效果 ≠ 预测效果
新手最容易犯的错误,就是只看模型对历史数据的拟合效果。我们必须把数据拆成两部分分别评价:
训练集:用来建模的历史数据,对应的是「拟合效果」,反映模型对历史规律的还原能力;
测试集:留出来不用来建模的最新数据,对应的是「预测效果」,反映模型对未知数据的外推能力,才是评价模型好不好的核心标准。
就像我们做考题,训练集是课后练习题,拟合效果好只是练习题做得好;测试集是期末考试,预测效果好才是真的学会了。
第二,两个核心评价指标,疾控人这么看
forecast包里的accuracy()函数可以一键输出所有评价指标,我们只需要重点关注两个最常用的,当然本文后面我们也会对着运行结果再具体说一说。
首先是RMSE(均方根误差):预测值和真实值的平均偏差,单位和原始数据一致(比如病例数的 RMSE 单位就是 “例”)。数值越小说明预测的平均偏差越小;适合同一组数据的不同模型之间对比,数值越小的模型越好。
其次是MAPE(平均绝对百分比误差):预测误差的百分比,是疾控场景最常用的评价指标,因为它不受数据量级影响,不同疾病、不同地区的模型都可以横向对比。数值越小表示预测精度越高;
疾控场景通用参考标准:MAPE < 10%:预测效果优秀,可直接用于预警、趋势研判 10% ≤ MAPE < 20%:预测效果良好,可用于参考
MAPE ≥ 20%:预测误差偏大,需要优化模型
![]()
问题 1:残差未通过白噪声检验(有自相关)
这大概率是模型阶数不够,规律没提取干净,按这个顺序排查:
首先调整 p、q 阶数:适当增加 AR 或 MA 的阶数,比如原来用 ARIMA (1,1,0),可以试试 ARIMA (2,1,0)、ARIMA (1,1,1),再重新检验;其次重新检查平稳性:确认差分阶数 d 是否足够,序列有没有完全平稳;第三考虑季节性因素:如果是流感、手足口这类有明确年度周期的传染病,基础 ARIMA 没法捕捉季节性规律,残差大概率通不过检验,需要换成下一篇要讲的 SARIMA 季节性模型。
问题 2:训练集拟合很好,但测试集预测误差很大
这就是典型的过拟合,模型把历史数据的随机波动也当成规律学进去了,外推就失效了,常见原因和解决方法:
首先是模型阶数太高:p 和 q 不要设太大,疾控数据绝大多数场景 p、q 都在 0-3 之间,阶数越高越容易过拟合;其次可能是测试集有特殊突发因素:比如测试集时间段刚好有新冠疫情、大规模防控政策、暴发疫情等异常事件,这些是历史数据里没有的,模型预测不到,属于正常情况,可以结合业务解读补充说明。
![]()
首先是我们在上一节的基础上增加第8步和第9步:
inset = 0.02)我们主要看看上面评价的运行结果怎么看
![]()
训练集拟合效果:用「模型对历史数据的拟合值」和「训练集真实病例数」计算误差,衡量模型对历史规律的还原能力;
测试集预测效果:用「模型对未来的预测值」和「测试集真实病例数」计算误差,衡量模型对未知数据的外推预测能力,是判断模型好不好的核心标准。
每个指标详细讲解
第一,ME:Mean Error 平均误差:所有(预测值 - 真实值)的算术平均值,反映预测整体的偏差方向。
数值为正:模型整体高估了病例数;
数值为负:模型整体低估了病例数;
越接近 0,整体系统性偏差越小。
结合运行结果:训练集 ME≈0.6,几乎为 0,说明对历史数据的拟合没有整体偏高 / 偏低的系统性偏差;测试集 ME≈480,为正值,说明模型对未来 20 周的预测整体高估了约 480 例。
第二,RMSE:Root Mean Squared Error 均方根误差:误差平方的平均值再开根号,反映预测值和真实值的平均偏差幅度,单位和原始数据一致(这里是「例」)。数值越小,预测偏差越小;对极端大误差惩罚很重(某一期预测差很多,RMSE 会明显升高)。对于我们来说,同一份数据的不同模型之间横向对比,RMSE 更小的模型精度更高。
结合运行结果:训练集 RMSE≈98 例,历史拟合的平均偏差不到 100 例;测试集 RMSE≈730 例,外推预测的平均偏差明显变大,符合「预测越远误差越大」的规律。
第三,MAE:Mean Absolute Error 平均绝对误差:所有误差绝对值的平均值,同样反映平均偏差幅度,单位也是「例」。数值越小越好;和 RMSE 相比更稳健,不受个别极端大误差的影响,更能反映常规情况的误差水平。
结合运行结果:训练集 MAE≈64 例,测试集 MAE≈505 例。
第四,MPE:Mean Percentage Error 平均百分比误差:每一期的(预测值 - 真实值)/ 真实值 的平均值,用百分比体现偏差的方向和相对幅度。
正值:整体高估;负值:整体低估;
正负误差会互相抵消,只能看系统性偏差的相对比例,不能反映整体误差大小。
结合运行结果:训练集 MPE≈-47%,看起来整体低估,和 ME 接近 0 的结果不一致,核心原因是手足口病低谷期病例数只有几十例,很小的绝对误差就会被放大成很大的百分比误差,拉低了整体 MPE,属于低发病数据的正常现象。
第五,MAPE:Mean Absolute Percentage Error 平均绝对百分比误差:每一期 | 预测值 - 真实值 |/ 真实值 的平均值,是疾控场景最常用的预测精度指标,不受数据量级影响,不同疾病、不同地区的模型都可以横向对比。解读规则:数值越小,预测精度越高,疾控通用参考标准:
MAPE < 10%:预测效果优秀,可直接用于预警阈值计算;
10% ≤ MAPE < 20%:预测效果良好,可用于趋势参考;
MAPE ≥ 20%:预测偏差偏大,需要优化模型。
结合运行结果:训练集 MAPE≈63%,测试集≈50.7%,误差都偏大,核心原因是你现在用的是无季节性的基础 ARIMA,没有捕捉手足口病的年度流行周期,高峰低谷预测错位,这也恰恰是后续 SARIMA 季节性模型要解决的问题。
第六,ACF1:First-order Autocorrelation of Errors 误差一阶自相关系数:预测误差的一阶滞后自相关系数,衡量相邻两期的误差之间有没有关联性。解读规则:绝对值越接近 0 越好。
接近 0:说明残差没有明显自相关性,模型已经把序列的有效规律提取干净了;
绝对值偏大(比如 > 0.5):说明误差有连续偏高 / 连续偏低的规律,模型拟合不充分,还有没提取的信息。
结合运行结果:训练集 ACF1≈-0.01,几乎为 0,符合白噪声特征,历史数据的规律提取充分;测试集 ACF1≈0.88,非常高,说明预测误差是连续系统性的(连续好几期都偏高 / 都偏低),本质是模型没捕捉到季节性规律,外推时出现了趋势错位。
第七,Theil's U 泰尔 U 系数:相对效率指标,用来对比你的模型和「朴素预测模型(直接用上一期的数值预测下一期)」的效果好坏。
U = 1:你的模型效果和 “用上期值预测本期” 的朴素方法完全一样,没有提升;
U < 1:模型比朴素预测效果好,数值越小提升越明显;
U > 1:模型预测效果还不如直接用上一周的病例数预估本周,模型有效性差。
结合运行结果:训练集和测试集的 U 值都大于 2,说明基础 ARIMA 模型的预测效果不如最简单的朴素预测,进一步验证了:没有加入季节性的基础 ARIMA,完全不适合手足口病这类强季节性传染病数据,必须用 SARIMA 季节性模型才能得到可靠的预测结果。
跑通基础 ARIMA、做完诊断,你会发现:对手足口、流感这类有强年度季节性的传染病,基础 ARIMA 的预测效果总是差一点,因为它没法捕捉固定的年度周期规律。
下一篇我们就讲疾控场景最常用的进阶模型 ——SARIMA 季节性 ARIMA 模型,专门适配传染病的周期性流行特征,也是绝大多数传染病预测论文里的标配模型。我们会讲清 7 个参数的含义,以及一键自动拟合的代码,跟着操作就能跑出更精准的季节性预测模型。
参考:
《时间序列分析-基于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.