![]()
系列简介
这是我们一系列原创技术贴,从易到难,每天学习一点。所有内容均为疾控数据分析、科研论文相关,或者说很多和现在的热门监测预警相关,所以我们这个系列就叫“监测预警基础”。
我们这个系列不强求,宁缺毋滥,不为了发推文而发推文,有实用的,好用的内容了我们再发。
今天是对我们很早之前的一节内容,有网友朋友反馈不是很清楚的点再补充说明一下。
我们之前讲过累计和CUSUM,→
会有这篇→
我们下面这张图基本已经把C1/C2/C3的算法以及核心原理都解释的比较清楚了。
![]()
但是还是有一些网友留言反馈说搞不清楚C1、C2、C3到底什么区别?
C1 和 C2 的公式几乎一模一样,就差在基线窗口上,这点差别值得单独立一个方法吗?
C3 为什么只是把三天的 C2 加一加,灵敏度就提高了?
教科书说"敏感性 C3>C2>C1",这个排序的道理在哪?
这篇推文就把三个方法的改进逻辑讲清楚。
![]()
先看 C1 和 C2 共用的核心公式:
![]()
报警规则:C_t > h 时发出预警(Excel 里就是"C − h > 0 即报警")。
这个公式我们在之前的推文里详细拆过,这里只快速回顾它的四个零件:
第一是那个分数:指的是今天比基线高出"几个标准差"——标准化偏差;
第二是−k:为什么减去k,其实就是每天的"宽容额度",高出 k 个标准差以内的部分视为正常波动,不记账(k 是标准差系数,常取 1~2);
第三是+C_{t-1}:把今天的"净超标"累加到昨天的账本上——"积少成多"的核心;
第四是max{0, ·}:账本不许为负,没超标就清零重来——疫情回落后自动复位。
一句话:每天把超标 kσ 以上的部分记到账本上,攒过 h 就报警,没攒下就清零。那么 C1、C2、C3 的区别在哪?不在骨架,在两个具体设计上:基线怎么取、累积怎么累。
![]()
C1是紧挨着的过去 7 天,今天和"最近一周的平均水平"比。
优点是基线离当前最近,能跟上近期水平变化,反应最快。致命弱点是基线会被疫情"拖下水"。
怎么理解这个缺点?
设某病平时每天 10 例左右,疫情从周一开始悄悄抬头:周一发病 14 例,偏高但没攒过阈值,C1 没报警——第一天漏检了;周二算基线时,周一的 14 例已经进了"过去 7 天"的窗口,基线均值被抬高、标准差被拉大,报警门槛随之升高;周二发病 15 例,比昨天还多,可面对的尺子已经变松了——又漏检;周三、周四……疫情数据一天天卷进基线,基线一天天被抬高,越到后面越难报警。
这就是基线污染:暴发的数据混进了"正常水平"的估计里,等于让嫌疑人自己当裁判。C1 第一天没抓住,后面基本就抓不住了。
![]()
C2 只改一个地方:基线窗口整体往前挪 2 天。
比如第10天,用的均值和标准差就是第1天-第7天的,第10天和第7天隔了2天,也就是所谓的C2计算公式:当前CUSUM值=MAX,{0,【(日病例数-间隔两天前的7日移动均值)/间隔两天前7日移动标准差】-标准差系数K+上一天CUSUM值}
这空出来的 2 天就是隔离带(guard band),可是大家有没有想过为什么隔 2 天就能保护基线?
再用上面的例子:周一发病升到 14 例,C2 也没报警。但周二不一样了:周二的基线用的是上周日往前数 7 天的数据——周一的 14 例被隔离带挡在窗外,基线还是干净的 10 例。周二发病 15 例,面对的门槛没被抬高,检出机会和周一完全一样。周三同理,周一、周二的数据还"关"在隔离带里,进不了基线。
打个比方:C1 是"边发烧边把发烧的读数记进正常体温范围";C2 是"最近两天的读数先不算数"。隔离带相当于医学观察期——等数据"过了观察期",才允许它参与基线估计。
为什么偏偏是 2 天? 太短挡不住暴发头两天的数据渗入;太长基线又太陈旧、跟不上季节变化。2 天是实战中折中的结果:刚好护住疫情最需要被发现的头 48~72 小时。
代价:基线离当前远了 2 天,时效性略差。正常时期 C2 和 C1 表现几乎一样,C2 的优势全部体现在持续抬升期——第一天漏检后,第二、三天的检出能力不受影响。
至此,C1 → C2 的第一个补丁打完:防基线污染,但还有个遗留问题没解决。
注意 CUSUM 公式里的 max{0, ·}:它保证了"账本不为负",但也带来一个副作用——累积很容易被清零打断。
想象这种情况:连续几天每天都小幅超标,账本好不容易攒到 1.8(阈值 h=2,就差一点);中间夹了一天正常偏低,max{0, ·} 一发挥作用,账本直接归零;后面再抬头,又得从头攒。"就差一点"的证据被一天正常波动抹掉了。 对于渐进式、波浪式抬头的疫情(高几天、歇一天、再高几天),这种清零会让 C2 反复"功亏一篑"。
这就是 C3 要打的第二个补丁。
![]()
C3 的做法简单到一句话:
![]()
当天及之前 2 天,共 3 个 C2 值直接相加,超过阈值 h 就报警。没有新零件、没有新机制——那为什么这样就更灵敏?
关键理解:C3 是"累积的再累积"
注意,这里的 C2 本身已经是累积值了(每天都有 +C_{t-1} 的递推)。C3 把三天的累积值再相加,相当于双重累积:
第一层(C2 内部):今天的超标 + 昨天以前的存量;
第二层(C3):今天、昨天、前天三个时点的账本再叠加。
达到的效果是:某一天被清零打断的损失,由前后两天的账本"接力"补上。昨天攒到 1.8 被清零?没关系,前天账本的 1.2 和今天新攒的 0.9 还在,三天相加 1.2+1.8(清零前留下的痕迹通过 C2_{t-2}、C2_{t-1} 保留)……即使某一天归零,只要三天窗口里攒下的总量够,C3 照样过线。
比如下表数据例子,假设h=2
![]()
看第 5 天:C2 从头到尾没有一天够着 2 的报警线(第 3 天还被清零打断了一次),但 C3 把三天窗口里的"零零碎碎的嫌疑"全攒起来,第 5 天过了线。
这就是敏感性 C3 > C2 的机理:C2 要求"一条不间断的累积链"攒够 h;C3 只要求"三天窗口内几条断链加起来"够 h——显然后者容易得多。清零机制带来的"漏检缝隙",被三天窗口的冗余设计填上了。
当然,这也是有代价的:
第一,误报更多:正常时期三天的小波动叠加,也可能凑过阈值;
第二,惯性更大:疫情回落后,C2 一两天就清零复位,C3 因为带着前两天的存量,降下来要慢 2~3 天——报警解除也滞后;
第三,阈值要配套:C3 是三个非负数相加,数值天然比 C2 大,用同一个 h 时 C3 天然更敏感(这正是设计意图),但调参时要意识到这一点。
我们最后再用表格总结比较一下
![]()
![]()
![]()
编辑:普通疾控人 | 审核:诗酒趁年华
文章来源 | 原创
说明 | 转载只为分享,如有侵权联系删除
©版权声明 | 部分信息和图片来自公开网络
转载请注明
再次转载请注明出处
![]()
科普健康 | 宣传疾控
本号为多位疾控机构从业者运营
重点关注国内外健康事件
致力于疾控科普
在做好科普服务大众的同时
做好疾控机构的宣传
让更多的人了解疾控,拥抱健康
欢迎加「小编」微信(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.