![]()
系列简介
这是我们一系列原创技术贴,从易到难,每天学习一点。所有内容均为疾控数据分析、科研论文相关,或者说很多和现在的热门监测预警相关,所以我们这个系列就叫“监测预警基础”。
今天是第36节,之前我们其实就介绍过移动流行区间法,→
通过这3篇其实基本把移动流行区间法的内容将差不多了,应部分粉丝要求,我们今天再用大白话把整个步骤和关键点讲一下,另外,我们之前虽然那已经介绍的很详细了,但是并没有介绍MEM的R语言操作,我们今天把R代码补上。
怎么说呢,这一篇的内容比较长,但是收藏这一篇,好好理解,基本上所有关于MEM的内容你就都清楚了!
当然我也相信,除非确有需要,很多人不会看完这篇内容的,有点长(哈哈哈)
之前咱们分三期讲了移动流行区间法(MEM):从核心原理、Excel 手算拆解到阈值计算公式。
不少同行私信留言,希望把整套流程的实际应用,用大白话串一遍,另外关于R的操作也希望讲一讲。
今天,我们就解决MEM的所有问题!
![]()
咱们疾控日常做预警,最常用的就是移动百分位数法 —— 拍定一个 P75、P90 作为阈值,超过就报警。
但这个方法有个绕不开的问题:你没法说清这个阈值准不准,没有统一的 “标尺” 去验证漏报了多少、误报了多少。
MEM 最大的价值,就是解决了这个问题。但这里必须先纠正一个容易误解的说法:MEM 并不是能识别出 “真正的、客观的流行期”。
它的核心逻辑是:先定一套统一的划分规则,用这套规则给所有历史年份分别划出流行期 / 非流行期,把这个划分结果作为方法内部的参照基准(俗称 “金标准”);再基于非流行期的数据算出预警阈值;最后拿阈值和基准比对,算出灵敏度、特异度,量化告诉你 “这个预警线,漏报率多少、误报率多少”。
简单说:传统方法是 “我定个线,报警就完事了”;MEM 是 “我先定一把统一的标尺,再算预警线,还能量化证明这条线有多准”,这也是它被 WHO 推荐、越来越多用于手足口、流感预警的核心原因。
![]()
实际操作中,我们通常需要 5-10 年的历史监测数据,用发病数或发病率都可以,两者各有优势。完整操作步骤可以总结为 4 步:
第 1 步:单年数据只能划流行期,选不出参数
如果只有 1 年的数据,我们确实可以用任意一个 δ 值 + MAP 算法,给这一年划出流行期和非流行期,这个也就是我们说的金标准。
但核心问题是:你没有任何依据判断这个 δ 选得合不合理—— 没有多年数据做对比,就不知道哪个 δ 对应的预警效果最好。
这就是我们需要 5-10 年多年数据的根本原因:只有多年数据才能验证参数的好坏,筛选出适配本地流行特征的最优 δ。
第 2 步:遍历 δ,用回代法初选最优参数
整理好 10 年数据后,第一步是批量筛选最优 δ(我们记为 δ₁),对应 R 里的roc.analysis函数。
具体逻辑:我们遍历几十个候选 δ 值,对每一个 δ,都统一做三件事:
第一,划金标准:用这个 δ,给每一年分别划出各自的流行期 / 非流行期(每年的金标准是独立的,但划分规则完全统一);
第二,算统一阈值:把 10 年所有数据放在一起,算出1 个全局统一的流行阈值—— 这个阈值的计算里,包含了所有年份的数据;
第三,合并算总账:把 10 年所有周的结果全部混在一起统计,用这个统一阈值和每年的金标准逐一比对,把 10 年的真阳性、假阳性全部累加,算出整体的灵敏度、特异度、约登指数等一套总指标。也就是说我们遍历的每一个δ都有一套指标。然后,我们选约登指数最高的那个 δ,作为初选的最优 δ₁。这一步叫回代法。特点是计算速度快,适合批量筛参数,但结果偏乐观 —— 因为被检验的年份本身参与了阈值计算,相当于 “自己出卷自己考”。
第 3 步:留一交叉验证,检验真实预警能力
选出最优 δ₁之后,我们用留一交叉验证法,检验这个参数在真实预警场景下的实际效果,对应 R 里的memgoodness函数,方法选cross
具体逻辑:10 年数据循环跑 10 轮,每一轮都严格遵循 “训练集、测试集分离” 的原则:
第一,单独拎出 1 年作为测试年,这一年的数据全程不参与阈值计算;第二,用剩下 9 年的数据,以 δ₁为参数,按 MEM 规则算出一个独立的流行阈值;第三,用这个完全不含测试年信息的阈值,去判定测试年每周是流行还是非流行;第四,测试年自身的金标准,同样用 δ₁+MAP 算法划分,两者比对,算出这一年专属的灵敏度、特异度、约登指数。
10 年全部跑完,就能得到每一年单独的预警效果。这一步的核心原则是:被检验的年份,绝对不参与阈值计算,100% 模拟 “用历史数据预警未来” 的真实工作场景,结果最贴近实战、最可信。
这个交叉验证有什么用呀?
它的核心作用是给这个 δ 的模型做性能鉴定、查边界、找短板。很多人会误以为 “交叉验证是为了再选一次最优 δ”,这是典型的误解。行业通用的流程永远是:回代法初选参数,交叉验证评价效果,不会用交叉验证反过来推翻初选的 δ。
第 4 步:计算最终阈值,落地预警与年度复盘
确认模型效果符合预期后,我们用全部 10 年历史数据 + 最优 δ₁,计算出最终的流行阈值、中 / 高 / 超高流行强度阈值,这套阈值就可以直接用于下一年的日常监测预警。
等新的一年结束后,我们也可以用 δ₁+MAP 算法划出这一年的金标准流行期,复盘当年预警的实际灵敏度、约登指数,再把这一年的数据加入基线,更新下一年的阈值,形成闭环。
![]()
第一步:拆分流行季节 —— 给模型 “单峰” 数据
MEM 有个硬性前提:一个流行季节里,只能有一个连续的流行高峰。咱们常见的手足口病、部分地区流感,一年都是双峰(夏季主高峰、秋季次高峰),如果直接把全年数据扔进去,模型只会认出最高的那个峰,次高峰直接被忽略,算出来的阈值会严重偏高。
所以第一步永远是先拆数据:
看多年平均发病曲线,找到两个高峰之间的低谷;
把一年拆成两个独立的流行季节(比如夏季流行季、秋季流行季);
后续所有计算,都分开做、各算各的阈值。
就像考试分科复习一样,语文和数学不能放一张卷子里评分,分开算才准。
第二步:定 δ 参数,划出统一规则下的 “参照基准”
这是 MEM 最核心的一步,也是很多疑问的起点。
先搞懂 δ 是什么?
δ 就是一把 “尺子的松紧度”,用来控制流行期的长短。它的底层逻辑叫最大累计发病占比法(MAP),大白话讲就是:在一个流行季节里,从峰值开始往前后扩连续的周数,每多扩一周,这些周的发病数占整个流行季总发病的比例就会涨一点;当涨幅第一次小于 δ 的时候,就停下来,这一段连续的周数,就是当年的流行期。
δ 越小,尺子越松,流行期划得越长;
δ 越大,尺子越紧,流行期划得越短。
有两个必须明确的关键点
第一,规则统一,结果不统一:所有年份用的是同一个 δ 值、同一套 MAP 算法,这是标准统一的核心;但因为每年发病曲线的形状、峰值、升降速度都不一样,所以每一年划出来的流行期起止周、持续长度都是不同的,每年有自己的基准区间。
第二,单年数据选不出最优 δ:只用 1 年数据,随便给一个 δ,都能划出当年的流行期;但你没法判断这个 δ 划得好不好、合不合理,因为没有外部参照。δ 的优劣,必须通过 “预警阈值的准确性” 来衡量,而预警效果的验证,必须靠多年数据才能实现。
划出来的这个流行期,就是后面所有计算的参照基准:算阈值要靠它拆分流行前期,验证效果要靠它当 “标准答案”。
第三步:算流行阈值 —— 找到 “预警启动线”
基准划好了,接下来就算咱们最关心的预警阈值,也就是 “超过这个数,就判定进入流行期” 的那条线。
MEM 标准算法是:从所有历史年份的「流行前期」(流行期开始之前的那段时间)里,一共挑 30 个发病最高的周,算它们算术均数的单侧 95% 置信区间上限,这个上限就是流行阈值。
大白话翻译一下:找历史上 “非流行阶段里发病最高的那些值”,再往上留一点余量(95% CI 上限),得到一条线。正常非流行期,发病几乎不会超过这条线;一旦超过了,就大概率是真的要进入流行期了,可以启动预警。
这条线,就是咱们日常监测里最常用的 “预警启动阈值”。
第四步:算强度分级阈值 —— 把流行分轻重
光知道 “进入流行了” 还不够,疾控防控是分级响应的,所以 MEM 还能算出三级强度阈值:中流行、高流行、超高流行。
算法逻辑和流行阈值类似,只是数据源换了:从所有历史年份的「流行期」里,挑 30 个发病最高的周,算它们几何均数的单侧置信区间上限:
40% CI 上限 → 中流行强度阈值
90% CI 上限 → 高流行强度阈值
95% CI 上限 → 超高流行强度阈值
这样一来,从基线到超高流行,一共 5 个等级,对应不同的防控响应级别,完全贴合咱们分级处置的工作需求。
第五步:参数筛选与效果验证 —— 回代初选,交叉终检
这一步是 MEM 的灵魂,也是大家疑问最多的地方。咱们分两部分讲透。
①回代法:快速批量筛参数
你之前用roc.analysis跑出来的每个 δ 一行的结果,就是回代法。
它的计算逻辑(以某一个 δ 为例)
用这个 δ,给所有年份分别划出流行期(基准);
- 把所有年份的数据凑在一起,只算出 1 个统一的流行阈值—— 注意,这里面包含了每一年的数据;
- 把所有年份的所有周合并在一起算总账:用这个统一阈值逐周判定流行 / 非流行,和各自年份的基准比对,把 10 年的真阳性、假阳性全部加起来,算出一套总的灵敏度、特异度、约登指数。
为什么每个 δ 只有一套结果?
不是不能算分年的,是完全没必要。回代法的唯一使命,就是快速对比不同 δ 的整体好坏,帮你缩小参数范围。它本身就是 “全量数据一起建模、一起检验”,本质是 “自己考自己”,就算拆成分年的,也还是每年自己考自己,没有额外的学术价值。所以 mem 包直接做了合并输出,每个 δ 对应一行总结果,方便你一眼挑出约登指数最高的候选参数。
特点
计算速度快,适合遍历几十个 δ 值;
结果偏乐观、偏高,因为被检验的年份本身参与了阈值计算,相当于 “考前见过原题”;
只能用于初选参数,绝对不能当作最终的模型效能写进论文。
② 交叉验证:严谨检验真实能力
你用memgoodness(method="cross")跑出来的分年结果,就是留一交叉验证,这是学术论文里唯一认可的效能评价口径。
它的计算逻辑(10 年数据为例)循环跑 10 轮,每一轮都严格独立:
拿出其中 1 年当 “测试年”,这一年的数据完全不参与阈值计算;
用剩下 9 年的数据,以选定的 δ,按 MEM 规则算出一个流行阈值;
用这个完全独立的阈值,去判断测试年每周是流行还是非流行;
和「测试年用同一个 δ 划出的流行期(基准)」比对,算出这一年专属的灵敏度、特异度、约登指数。
10 年轮流当一次 “测试年”,最终就得到了每年一套的验证结果。
这个时候每年都要一套结果,为什么每年各有一套结果?
因为每一年用的阈值都不一样 —— 验证 2016 年的阈值里没有 2016 年数据,验证 2017 年的阈值里没有 2017 年数据,10 年对应 10 个不同的阈值、10 次独立的验证。它天然就是分年的,因为每一年都是一次完整的 “模拟真实预警”:站在去年年底,用历史数据算阈值,预判今年的流行情况,完全还原真实工作场景。
特点
结果更保守、更真实,代表模型在未知年份的实际预警能力;
可以看到每年的效果差异,能分析异常年份对模型的影响;
是所有 MEM 类论文通用的效能评价标准。
第六步:落地应用 —— 用历史阈值预警未来
前面所有步骤都走完,得到一套稳定的阈值,就可以落地用了。真实工作里逻辑非常简单:
用截至目前所有的历史数据,算出最终的流行阈值和三级强度阈值;
新的流行季到来后,每周拿到发病数据,和这四条线比对;
对应到哪个等级,就启动相应级别的防控响应。
这就是 MEM 从历史数据到一线预警的完整闭环。
![]()
1. 别把 “金标准” 当绝对真实的流行期
MEM 的流行期是用统一算法定义出来的参照基准,不是客观上天然存在的 “标准答案”。它的价值是保证评判规则统一,让阈值的效果可量化、可对比,不用纠结它是不是 “真正的流行期”。
2. 别混淆回代拟合和交叉验证
拿回代的灵敏度去写论文、吹模型效果,是新手最容易犯的错。记住:回代只是选参数的工具,只有交叉验证的结果,才能代表模型的真实预警能力。
3. 异常年份别硬塞进基线
比如新冠疫情这几年,手足口、流感的流行规律完全变了,硬塞进基线里,会把阈值带偏。可以剔除异常年份单独建模,再和全数据模型对比,选效果更好的。
4. 别直接照搬外地的 δ 和阈值
不同省份、不同人群的发病水平差很多,δ=2.8 是欧洲流感的经验值,不是通用金标准。一定要用本地的历史数据,筛选适合本地的最优 δ,计算本地的阈值。
5. 别把 “流行期划分” 和 “阈值预警” 混为一谈
基准流行期是用 δ+MAP 回顾性划出来的,是标尺;流行阈值是用来前瞻性预警的工具。不是 “超过阈值就是流行期”,而是 “超过阈值,我们预警认为进入流行期”,对不对要靠基准来验证。
![]()
说实话,我们前面讲的太细了,讲了太多了,但是我个人感觉讲清楚了。
如果你不是实际应用遇到问题,我相信很多人是不会看到这的,如果你看到这,请给我留个言吧!
接下来是R代码操作,其实也很简单,
数据整理工作我们就不在R里面进行了,假设你现在有10年的数据,已经整理成下面这样了,每一行代表每一周的病例数。
![]()
R代码及步骤如下,很简单的一套代码
#结束,以上阈值用于新的一年验证就行,画图手动画图就行参考文献和书籍:
[1]杨鹏, 王小莉. [M]传染病预测预警技术及实践案例分析.[M] 人民卫生出版社: 267-275.
[2] 杨筱婷,王龙, 等. 基于移动流行区间法的甘肃省手足口病流行阈值估计及强度分级研究[J]. 疾病监测, 2025, 40(7): 876-882.
![]()
![]()
编辑:普通疾控人 | 审核:诗酒趁年华
文章来源 | 原创
说明 | 转载只为分享,如有侵权联系删除
©版权声明 | 部分信息和图片来自公开网络
转载请注明
再次转载请注明出处
![]()
科普健康 | 宣传疾控
本号为多位疾控机构从业者运营
重点关注国内外健康事件
致力于疾控科普
在做好科普服务大众的同时
做好疾控机构的宣传
让更多的人了解疾控,拥抱健康
欢迎加「小编」微信(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.