![]()
系列简介
这是我们一系列原创技术贴,从易到难,每天学习一点。所有内容均为疾控数据分析、科研论文相关,或者说很多和现在的热门监测预警相关,所以我们这个系列就叫“监测预警基础”。
今天是第37节,STL分解。我们在第一节()的时候就介绍过时间序列数据是由这些部分组成的,那如何把这每一部分拆开呢?
![]()
作为疾控人,我们每天面对的大疫情网数据,本质上是一条"三合一"的混乱曲线:
手足口病今年第20周报了500例,这是真下降了,还是还没到流行季?流感去年冬天比前年少了一半,是疫苗起作用了,还是采样少了?某一周突然冒出来一个尖峰,是真的暴发了,还是报告延迟堆积?
我们报病的时间序列数据混在一起看,永远看不清楚。
STL分解,就是给这条混乱曲线做"CT扫描",把它拆成三条干净、可解释的曲线,让你一眼看清:长期趋势、季节规律、意外异常。
![]()
STL =Seasonal andTrend decomposition usingLoess,全称为基于局部加权回归的季节性和趋势分解。
简单说,就是把你的周发病数(或月发病数)拆成三个可加的部分:
![]()
如果季节性波动幅度随发病水平同步变化(比如高峰年波动更大),用乘法模型;如果波动幅度稳定,用加法模型。
传染病数据通常用加法模型即可。
![]()
主要有以下这些作用和目的:
第一,看清长期趋势:每年春夏季的季节性高峰会掩盖真实的上升/下降趋势。STL把季节抹掉,趋势一目了然。
第二,识别异常暴发:某一周发病数突然升高,是"到了该高的季节",还是"真的暴发了"?看残差项就知道。
第三,预测不再跑偏:不分离季节成分,直接建模会把"每年固定来的高峰"误当成随机噪声,预测精度大打折扣。
第四,评估干预效果:EV71疫苗纳入免疫规划后,手足口病趋势是否下降?季节性模式是否改变?需要分别看。
第五,监控数据质量:残差连续多周为正,提示诊断标准、报告系统或实验室检测能力可能发生了变化。
![]()
第一步,准备数据:需要等间隔时间序列,传染病监测通常用周数据(一年52周)或月数据(一年12月)。
ts_cases <- ts(df$cases, frequency = 52) # 月数据则 frequency = 12第二步,一行代码分解:确定窗口,拆解数据。
stl_fit <- stl(ts_cases, s.window = "periodic", t.window = 53,robust = TRUE)关键参数我们解释一下
s.window:季节平滑窗口。周数据通常设为 "periodic" 或 7~13。
t.window:趋势平滑窗口。周数据通常设为 53(约1年)。
robust = TRUE:建议开启,降低突发暴发对趋势和季节的干扰。
第三步,可视化:确定窗口,拆解数据。
plot(stl_fit, main = "STL分解:周发病数")出来的图就是4张子图叠在一起:原始数据、季节成分、趋势成分、残差成分。
![]()
第四步,提取成分:确定窗口,拆解数据。
remainder <- stl_fit$time.series[, "remainder"] # 残差成分至此你就完成了对一套传染病时间序列数据的分解,下一节我们继续讲一讲分解之后能干什么?
![]()
![]()
编辑:普通疾控人 | 审核:诗酒趁年华
文章来源 | 原创
说明 | 转载只为分享,如有侵权联系删除
©版权声明 | 部分信息和图片来自公开网络
转载请注明
再次转载请注明出处
![]()
科普健康 | 宣传疾控
本号为多位疾控机构从业者运营
重点关注国内外健康事件
致力于疾控科普
在做好科普服务大众的同时
做好疾控机构的宣传
让更多的人了解疾控,拥抱健康
欢迎加「小编」微信(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.