别再迷信“每个变量10个事件”:预测模型防翻车指南

如果你在医院、药企或互联网健康团队里做过风险预测模型(比如预测手术并发症几率、糖尿病发病风险),你多半听过这样一句流传甚广的“江湖祖传秘方”:

“每个预测变量只要有 10 个结局事件就够了(Events Per Variable, EPV ≥ 10)。”1

按照这个口诀,不少研究者打起了精明的小算盘: “我手头攒了 80 个心梗复发病例,80 除以 10 等于 8。太棒了!我可以在模型里塞进 8 个指标:年龄、血压、胆固醇、血糖、吸烟史、心率、睡眠时间和体重指数!”

模型训练完毕,跑一跑内部交叉验证,ROC 曲线下面积(AUC)高达 0.88,大家举杯庆祝。可是一旦拿到隔壁医院或者真实世界的新病人身上一测,AUC 当场雪崩到 0.58,表现宛如抛硬币!

这种在自己电脑上“神机妙算”、一出门就“原形毕露”的惨案,究竟是怎么发生的?那个被奉为金科玉律的“EPV ≥ 10”,到底把多少研究者带进了沟里?


做题家困境:模型什么时候会开始“死记硬背”?

要把这个问题讲透,我们需要先理解算法模型到底是在“学规律”还是在“背答案”。

想象一个正在备考的学生。如果老师给了他 10,000 道不同的经典练习题,并告诉他解题的核心考点只有 3 个公式,这个学生大概率能真正掌握公式背后的逻辑,高考时遇到新题也能应付自如。

但如果老师总共只给了他 50 道练习题,却洋洋洒洒列了 20 个花里胡哨的解题窍门,会发生什么? 这个学生根本不会去理解本质规律,而是开始死记硬背题目的细枝末节——“只要题干里有‘小明’两个字,答案肯定选 C”;“只要图形左边有个圆圈,第三步就套这个窍门”。

把这个场景搬到预测模型上,就是经典的过拟合(Overfitting):

  • 如果你的真实阳性样本量太少,而给模型喂进去的候选特征太多、模型太灵活,模型就会误把手头这批病人的“噪声细节”当成了普遍真理;
  • 比如,模型可能会“发现”:“只要年龄大于 62 岁且刚好周二来就诊的病人,复发率极高!”
  • 在你自己的数据里,这个规律严丝合缝;但在真实世界的新病人眼里,这纯属胡说八道。

这种内部表现与真实表现之间的虚假鸿沟,在统计学里叫做乐观度偏差(Optimism)。


祖传秘方错在哪?三大致命漏洞

为什么简单的“每个变量 10 个事件”治不好这个做题家呢?因为这条经验法则存在三个致命的逻辑硬伤:

1. 它完全不关心你的特征到底“硬不硬”

如果你的候选特征里包含一个决定性的关键基因突变,它本身就能解释大部分疾病风险,模型学起来很省心; 但如果你的特征全都是弱相关的蛛丝马迹(比如日常饮食偏好、轻微的情绪波动),模型为了把微弱的信号拼凑起来,就需要极其庞大的样本量才能抵消随机噪点的干扰。无视特征信号的强度而死守一个数字 10,无异于刻舟求剑。

2. 它彻底忽视了疾病的“稀缺程度”

凑齐 100 个事件,在发生率 50% 的高危人群里只需要找 200 个人;但在发生率只有 2% 的普通体检人群里,需要筛查整整 5,000 个人! 在后一种情况下,虽然阳性病例都是 100 个,但 5,000 个正常人提供的人群基线信息和阴性参考,与 200 人根本不可同日而语。EPV 却把两者粗暴地等同起来。

3. “变量数”不等于“自由度”

很多人以为一个“受教育程度(小学/初中/高中/大学)”算 1 个变量。但在回归模型里,4 个分类需要转成 3 个哑变量(Dummy variables),实际上消耗了 3 个待估参数的自由度! 如果你再随手加两个非线性样条(Spline)或者变量间的交叉项,实际消耗的参数自由度会瞬间翻倍。名义上你以为 EPV 达标了,背地里早就超载透支了。


现代解法:Riley 教授的三道防线

为了终结 EPV 带来的行业乱象,英国基尔大学的统计学教授 Richard Riley 及其团队在国际顶级医学期刊 BMJ 等刊物上正式提出了现代预测模型开发样本量三维准则。

资料陈述:Riley et al. (2018, 2020) 明确指出,预测模型开发不能靠拍脑袋,而必须在建模前根据预期表现和临床容忍度,逐一核算三道安全底线。23

这三道底线用大白话翻译过来就是:

\(S \ge 0.90\))">第一道防线:参数必须“打折防吹牛”(收缩系数 \(S \ge 0.90\))

因为小样本拟合出来的系数总是倾向于被乐观度吹得偏高,所以统计学上有个保护机制叫收缩(Shrinkage)——人为给系数打个折,往回压一压。 Riley 准则的第一条死命令就是:你的样本量必须足够大,使得模型系数被高估的幅度绝对不能超过 10%(即打折系数 \(S \ge 0.90\))! 如果手头特征解释力较弱,为了保住这 90% 的真金白银,所需的事件数往往要飙升到每个变量 20 甚至 30 个事件以上。

第二道防线:开发集与外部世界的差距必须微乎其微

要求在自己的开发数据上测出来的拟合优度,与拿到全天下真实人群里预期的真实表现,两者差异必须被牢牢锁死在容许误差内(通常要求偏差小于 0.05)。不给模型在自己家里“自我感觉过于良好”的机会。

第三道防线:人群大盘的底色绝对不能估偏(基线精度)

如果某种并发症的真实发病率是 5%,你的模型因为样本量不足,把这个大盘底色(截距)估成了 8%,那么后面所有个体的个性化风险打分都会全盘皆输。第三道防线用置信区间的严格宽度,锁死总体发病率的测量精度。

最终法则:分别按照这三道防线算一遍,谁算出来的样本量最大,就听谁的!


实操避坑:用 R 算一遍有多简单?

在 R 语言里,Riley 团队把这套三维准则直接做成了一个小巧的包:pmsampsize。

假设你要开发一个术后感染预测模型:

  • 打算纳入 24 个待估参数自由度(含分类哑变量);
  • 既往文献表明该领域的同类模型 AUC 大概在 0.80 左右;
  • 人群中术后感染率约为 17.4%。

用代码算一算:

library(pmsampsize)

res <- pmsampsize(
  type = "b",            # binary 二分类结局
  cstatistic = 0.80,     # 预期 C 统计量 (AUC)
  parameters = 24,       # 候选变量消耗的参数自由度
  prevalence = 0.174     # 结局发生率
)

print(res)

算出来的真相:

  • 第一道防线(收缩 \(\ge 0.90\))要求:至少需要约 1200 例样本,且必须有 209 个感染事件!
  • 相比之下,如果你照搬老旧的“EPV = 10”,你可能会误以为只需要 \(24 \times 10 = 240\) 例样本甚至只要 100 个事件就够了,直接将模型推入过拟合的深渊。

💡 小贴士:网上有些二手教程提到 pmsampsize 里有 corr(相关系数)或者 ORperSD 参数,千万别用!我们在对源码的审计中确认,这些都是早就废弃被拔除的旧接口,现在官方推荐且唯一稳定的入参方式,就是提供预期的 cstatistic(AUC)或 csrsquared(决定系数)。


总结:给建模者的三条铁律

  1. 别贪多,少即是多: 在样本量有限的情况下,少塞几个花哨的干扰特征,选两三个生物学机制过硬的强特征,模型的实战抗风险能力会比一锅端强百倍;
  2. 在立项时就算账,别等拒稿了才哭: 现在高分医学期刊(如 The Lancet、BMJ 系列)在审阅预测模型论文时,普遍依据 TRIPOD 声明严格核查样本量计算依据。提前用 Riley 准则定好预算,是论文能立得住的底气;
  3. 把祖传口诀留在历史里: 科学在进步,统计学在迭代。下一次再听到有人把“每个变量只要 10 个事件”挂在嘴边,不妨把这份防翻车指南递给他。

相关知识


参考文献

局限与说明

  1. 开发与验证大不相同:本文的 Riley 准则是针对“开发新模型”;如果是拿别人已经开发好的成熟模型去你自己的医院“做外部验证”,样本量规则不同,通常要求至少 100 到 200 个事件以保证校准曲线可靠。
  2. 复杂黑盒算法:该准则主要针对广义线性回归(Logistic / Cox 等);如果是极度深层的神经网络或随机森林,所需样本规模通常还要根据经验学习曲线作进一步放大。

  1. Peduzzi P, Concato J, Kemper E, Holford TR, Feinstein AR. A simulation study of the number of events per variable in logistic regression analysis. Journal of Clinical Epidemiology. 1996;49(12):1373-1379. DOI: 10.1016/s0895-4356(96)00236-3 ↩︎

  2. Riley RD, Snell KIE, Ensor J, et al. Minimum sample size for developing a multivariable prediction model: PART II - binary and survival data. Statistics in Medicine. 2019;38(7):1276-1296. DOI: 10.1002/sim.7993 ↩︎

  3. Riley RD, Ensor J, Snell KIE, et al. Calculating the sample size required for developing a clinical prediction model. BMJ. 2020;368:m441. DOI: 10.1136/bmj.m441 ↩︎