1. 项目概述:为什么医学机器学习研究必须重新审视样本量问题?

在医学领域应用机器学习,我们常常陷入一个两难境地:一方面,我们渴望利用复杂的模型从数据中挖掘出深刻的洞见,以辅助诊断、预测预后或发现新的生物标志物;另一方面,我们手头的数据往往有限,尤其是涉及罕见病或需要侵入性检查才能获取的数据时。一个核心的、经常被简化处理的问题浮出水面: 我们到底需要多少数据? 这个问题在传统统计学中有相对成熟的样本量计算公式,但套用到机器学习,尤其是深度学习模型上,却常常失灵。我见过太多研究,将数据集简单地按7:3或8:2分成训练集和测试集,然后就宣称模型表现优异,却很少深入追问:这个测试集的样本量,足以让我们对模型性能的估计有多大的信心吗?训练集的样本量,又是否足够让模型学到真正普适的规律,而不是仅仅记住了训练数据中的噪声?

这正是本文要探讨的核心。传统的样本量计算往往针对单一的统计检验(比如比较两组均值),而机器学习项目的数据使用流程是割裂的:一部分用于“教”模型(训练),另一部分用于“考”模型(测试)。这两部分数据承担着截然不同的统计任务,因此对样本量的需求也完全不同。测试集样本量关乎 估计的精度 ——我们有多确信模型报告的85%的准确率不是偶然?而训练集样本量关乎 模型的复杂度与泛化能力 ——给模型“喂”多少数据,它才能学会举一反三,而不是死记硬背?将两者混为一谈,或者只关注其一,是当前许多医学机器学习研究在方法论上的一个软肋。

本文介绍的方法,其核心价值在于提供了一种 结构化、可操作的思路 ,将这两个问题解耦,并按照科学的优先级进行处理。它不依赖于某个特定黑箱工具,而是建立在一个清晰的逻辑链条上: 首先确保你的“考试”是严谨的(测试集样本量足够),再根据“教学”需要去准备“教材”(训练集样本量),最后得出总的“招生人数”(总样本量) 。这种方法尤其适合临床医生、医学研究员等领域的实践者,他们可能并非统计或计算机科班出身,但迫切需要一种既科学又直观的方法来规划自己的研究,为审稿人和读者提供令人信服的样本量依据。

2. 方法核心思路拆解:先“考评”后“教学”的逆向工程

这套方法的逻辑非常清晰,它颠覆了常见的“先收集数据再拆分”的随意性,倡导一种基于终点的设计思维。我们可以将其理解为一次逆向工程。

2.1 逻辑起点:为什么优先确定测试集样本量?

这是整个方法最具洞见的一步。在医学应用中,模型的最终价值不在于它在训练数据上表现多好,而在于它在未来新的、未见过的病人身上表现如何。测试集,就是这“未来病人”的模拟。因此, 测试集样本量计算的本质,是一个参数估计问题 。

我们真正关心的,是模型性能指标(如灵敏度、特异度、AUC)的真值。我们用测试集计算得到的,是这个真值的一个点估计(比如85%)和一个置信区间。测试集样本量直接决定了这个置信区间的宽度。例如,基于50个测试样本得出的85%灵敏度和基于500个测试样本得出的85%灵敏度,其可信度是天差地别的。前者可能伴随一个宽达(70%, 95%)的置信区间,这意味着真实性能可能低至70%;而后者可能给出(82%, 88%)的窄区间,让我们对85%这个值更有信心。

因此,优先确定测试集样本量,就是优先 确定我们研究结论的精确度 。这直接回应了医学研究对可靠性和可重复性的根本要求。从项目设计之初就明确“我需要多精确的效能评估”,是研究严谨性的体现。

2.2 关键参数:训练-测试比与测试集比例

确定了测试集的需求后,我们需要一个桥梁来连接训练集和总样本量。这里引入了两个关键参数:

  • 训练集-测试集比值 : rTT = n_TRAIN / n_TEST 。例如,常见的80/20拆分对应 rTT = 80/20 = 4 。
  • 测试集比例 : p_TEST = n_TEST / n 。同样对于80/20拆分, p_TEST = 0.2 。

这两个参数是等价的,知道其中一个就能推导出另一个( rTT = (1/p_TEST) - 1 )。它们在方法中扮演着“放大系数”的角色。 rTT 或 p_TEST 的选择并非纯统计学问题,而更多是经验性和领域性的。一个较高的 rTT (如 rTT=4 ,即80/20拆分)意味着将更多数据用于训练,这在模型非常复杂、数据饥渴时可能有利。一个较低的 rTT (如 rTT=1 ,即50/50拆分)意味着测试集占比更大,对性能的估计可能更稳定,但可能牺牲模型的学习能力。

实操心得 :在医学影像分析等深度学习任务中,由于模型参数极多,通常倾向于使用较高的 rTT (如 8:2 甚至 9:1),并配合交叉验证来充分利用训练数据。而在开发一个基于少量关键指标的简单逻辑回归预测模型时, rTT=2 (67/33拆分)或 rTT=3 (75/25拆分)可能更为常见。建议在方案设计时,参考同类顶级文献的常用比例。

2.3 计算流程总览

整个方法可以概括为以下四个步骤,形成了一个完整的闭环:

  1. 定义目标 :明确你要用测试集估计什么性能指标(如灵敏度、特异度、AUC、均方误差等)。
  2. 计算测试集样本量 :基于步骤1的指标,使用相应的统计学样本量公式或工具,计算出满足一定精度(如置信区间宽度)和置信水平(如95%)所需的 n_TEST 。
  3. 计算训练集样本量 :根据预先设定的 rTT ,计算 n_TRAIN = n_TEST × rTT 。
  4. 计算总样本量 : n = n_TEST + n_TRAIN ,或利用公式 n = n_TEST / p_TEST 直接计算。

这个过程将看似模糊的“需要大数据”诉求,转化为了一个基于明确统计学假设的可计算问题。

3. 核心细节解析与实操要点

理解了整体框架后,我们深入每个环节的细节,这些地方往往是决定成败的关键。

3.1 如何为测试集选择并计算样本量?

这是方法中技术性最强的一步。其核心是回到经典的统计学样本量计算框架,但应用的对象是模型性能指标。

对于分类任务(尤其是二分类,如疾病阳性/阴性): 最常用的指标是灵敏度和特异度。计算它们的样本量,本质上是在计算 估计一个比例(二项分布参数)所需的样本量 。

  • 公式基础 :估计一个比例为 p 的总体参数,在置信水平 1-α 下,要求边际误差(置信区间半宽)不超过 d ,所需样本量近似为: n = Z^2 * [p * (1-p)] / d^2 其中, Z 是标准正态分布的分位数(如95%置信水平对应 Z≈1.96 )。
  • 如何应用于灵敏度/特异度 :
    • 灵敏度 :只在真实阳性病例中计算。因此,你需要预估模型在病人群体中的灵敏度 p_sens ,并指定你希望估计的精度 d_sens 。同时,你需要知道或预估测试集中阳性病例的比例 prev_test (这通常与研究设计的患病率或抽样策略有关)。那么,所需的总测试集样本量 n_TEST 应至少满足阳性病例数足够: n_TEST * prev_test >= Z^2 * [p_sens * (1-p_sens)] / d_sens^2 。
    • 特异度 :同理,只在真实阴性病例中计算。使用预估的特异度 p_spec 、精度 d_spec 和阴性比例 (1-prev_test) 进行计算。
    • 最终 n_TEST :取满足灵敏���和特异度计算要求中 较大的那个值 ,以确保两个指标的估计都达到预设精度。

对于回归任务(连续结局,如血压值、生存时间): 常用指标是均方误差或预测值与真实值的相关系数。样本量计算可能基于希望检测到的预测误差的最小显著变化,或基于估计相关系数所需的精度。这通常涉及更复杂的幂分析。

注意事项 :这些计算都基于 渐进正态近似 ,当预估的性能指标 p 接近 0 或 1,或者样本量较小时,可能需要更精确的方法(如精确二项分布计算)。此外,所有计算都依赖于 预先设定的参数 (如预估的灵敏度、患病率、精度 d ),这些预估的准确性会直接影响结果。进行 敏感性分析 至关重要——尝试不同的预估参数组合,看看 n_TEST 的变化范围,这能帮助你评估研究的可行性和稳健性。

实操工具推荐 :

  • 专业统计软件 :PASS, nQuery, G*Power 等都提供了丰富的比例估计样本量计算模块。
  • 在线计算器 :如原文提到的 wnarifin.github.io/ssc/ ,或搜索“sample size for proportion confidence interval”可以找到很多可靠的工具。
  • R/Python 脚本 :自己编写简单的脚本进行计算,便于集成到分析流程和进行敏感性分析。例如在R中, pwr 包或基本的二项分布置信区间函数都可以辅助计算。

3.2 如何合理设定训练-测试比?

确定了 n_TEST 后, rTT 的选择直接决定了 n_TRAIN 和总样本量。这里没有金标准,但有几条权衡原则:

  1. 模型复杂度 :模型越复杂(参数越多,如深度神经网络),越容易过拟合,就需要相对更多的训练数据来约束它。因此,复杂模型对应 更高的 rTT (如 8:2, 9:1)。
  2. 数据特征维度 :特征数量多、噪声大,也需要更多数据来学习稳健的关系,倾向于较高 rTT 。
  3. 性能评估的稳定性 :在总样本量固定的情况下,降低 rTT (即增大测试集比例)可以提高性能估计的稳定性(减小方差)。如果你的主要目标是获得一个非常稳健的性能评估,可以考虑适中的 rTT (如 2:1 或 1:1)。
  4. 领域惯例 :查阅你所在医学子领域(如放射组学、基因组学、电子病历预测)的顶级期刊文章,观察其常用的分割比例,这是一个安全的参考。

实操心得 :我个人的经验法则是,对于传统的机器学习模型(如随机森林、SVM、逻辑回归),从 rTT=3 (75/25)或 rTT=4 (80/20)开始是一个合理的起点。对于深度学习,则至少从 rTT=4 开始考虑。 最重要的是,在你的研究方案中明确陈述你选择该 rTT 的理由 ,是基于前人研究、模型复杂度分析,还是初步的探索性数据评估。透明化这个选择过程能极大增加研究的可信度。

3.3 总样本量的确定与可行性校验

通过 n = n_TEST + n_TEST * rTT 或 n = n_TEST / p_TEST 计算出总样本量 n 后,工作并未结束。这是一个理论值,必须接受现实检验。

  • 可行性评估 :将这个 n 与你所在机构或通过合作能募集到的潜在病例数进行比较。如果理论值远超现实可能,你需要回到起点,调整你的期望:
    • 放宽精度要求 :能否接受更宽的置信区间(增大 d )?这能显著减少 n_TEST 。
    • 调整性能预期 :预估的灵敏度/特异度是否过于乐观?更保守的预估可能会降低样本量需求。
    • 重新考虑 rTT :在总样本量紧张的情况下,或许可以适度降低 rTT ,牺牲一点训练数据来保证测试集的起码规模。但要注意,这可能会增加模型过拟合的风险。
    • 考虑更高效的模型 :能否使用复杂度较低、数据需求较少的模型?
  • 考虑流失与数据质量 :在医学研究中,数据缺失、图像质量不合格、患者失访是常态。在计算出的理论 n 基础上,通常需要增加一个比例(如10%-20%)作为缓冲。

4. 案例实操:基于COVID-19胸片诊断模型的完整计算

让我们将上述方法应用到一个具体的、假设的案例中,这是理解整个流程的最佳方式。

研究场景 :我们计划开发一个基于胸部X光平片的深度学习模型,用于辅助诊断疑似COVID-19病例。我们将以RT-PCR检测结果作为金标准。计划将收集的数据按 75% : 25% 的比例划分为训练集和测试集。

已知信息与预设目标 :

  • 预估性能 :根据前期文献或预实验,我们期望模型的灵敏度约为 85% ,特异度约为 75% 。
  • 患病率 :在研究人群(疑似病例)中,预计COVID-19阳性率约为 20% 。
  • 精度要求 :我们希望估计灵敏度和特异度时,其 95%置信区间的宽度不超过10% (即边际误差 d = 5% )。这意味着如果点估计是85%,我们希望的区间大约是 (80%, 90%)。
  • 置信水平 :95%。

逐步计算过程:

4.1 第一步:计算测试集所需样本量

我们需要分别计算为满足灵敏度、特异度的估计精度,各需要多少测试样本。

  • 为灵敏度计算 :

    • 预估灵敏度 p_sens = 0.85
    • 精度 d_sens = 0.05
    • Z = 1.96 (对应95%置信水平)
    • 所需阳性病例数 n_pos = 1.96^2 * [0.85 * (1-0.85)] / (0.05^2) ≈ 196
    • 由于测试集中阳性比例 prev_test = 0.20 ,因此总测试集样本量需满足 n_TEST_sens >= n_pos / prev_test = 196 / 0.20 = 980
  • 为特异度计算 :

    • 预估特异度 p_spec = 0.75
    • 精度 d_spec = 0.05
    • 所需阴性病例数 n_neg = 1.96^2 * [0.75 * (1-0.75)] / (0.05^2) ≈ 288
    • 测试集中阴性比例 1 - prev_test = 0.80 ,因此 n_TEST_spec >= n_neg / (1 - prev_test) = 288 / 0.80 = 360
  • 确定 n_TEST :为了保证 两个指标 的估计都达到5%的精度,我们必须取两者中 更大的值 ,即 n_TEST = 980 。

关键解读 :这个结果直观地告诉我们,由于灵敏度(85%)比特异度(75%)更接近100%,其方差 p*(1-p) 更小,在相同精度要求下,本身需要的阳性病例数(196)少于特异度需要的阴性病例数(288)。但由于患病率较低(20%),为了凑够这196个阳性病例,我们需要一个更大的总测试集(980)。这凸显了在病例对照研究或患病率不平衡的研究中,样本量计算必须考虑组别比例。

4.2 第二步:计算训练集样本量

已知数据分割比例为 75% : 25%,即训练集-测试集比值 rTT = 75 / 25 = 3 。 因此,训练集样本量 n_TRAIN = n_TEST × rTT = 980 × 3 = 2940 。

4.3 第三步:计算总样本量

总样本量 n = n_TEST + n_TRAIN = 980 + 2940 = 3920 。 或者,用测试集比例 p_TEST = 0.25 计算: n = n_TEST / p_TEST = 980 / 0.25 = 3920 。

结论 :为了开发并可靠地评估这个COVID-19胸片诊断模型,我们总共需要收集 3920名 疑似病例的胸部X光片及对应的RT-PCR结果。其中, 2940例 用于训练模型, 980例 用于最终测试,并且我们预期这980例测试集中包含大约196例阳性病例和784例阴性病例,以确保对模型灵敏度和特异度的评估都具有足够的统计精度。

5. 方法延伸讨论与高级考量

上述基本框架适用于���多数场景,但在更复杂的研究设计中,还需要考虑以下问题。

5.1 多类别分类与回归问题

  • 多类别分类 :当结局变量多于两类时(如肿瘤分型:I, II, III期),常用的性能指标是宏观/微观平均准确率、或每个类别的召回率等。样本量计算可以针对你最关心的某个特定类别的召回率(将其视为一个二分类问题),或者针对整体准确率进行计算(此时 p 为预估的总体准确率)。更稳健的做法是进行模拟研究。
  • 回归问题 :对于连续结局(如预测血糖值、住院天数),目标可能是控制预测误差的均方根在某个范围内,或保证预测值与真实值的相关系数 R^2 的置信区间足够窄。这通常需要基于 t 分布或非中心化参数进行样本量计算,使用专门的软件或模拟更为合适。

5.2 交叉验证情境下的调整

本文方法明确区分了训练集和独立的测试集。但在实际中,我们常在训练集内部使用 k折交叉验证 来调参和进行初步模型选择。这会影响样本量的思考吗?

会的。交叉验证主要影响的是 训练集的有效利用和模型选择过程的稳定性 ,但它 不替代最终的外部测试集 。本文方法计算出的 n_TEST 仍然是你需要留出的、完全不参与任何训练/验证流程的 最终评估集 。

对于训练集部分( n_TRAIN ),如果你计划使用k折交叉验证,你需要确保每个折的样本量足够。例如,对于10折交叉验证,每个训练折的大小约为 0.9 * n_TRAIN 。你需要确保这个子集的大小仍然能满足模型训练的需求。这可以作为一个额外的检查点,但通常不是主要限制因素,因为 n_TRAIN 本身已经通过 rTT 放大了。

5.3 与“仅外部验证”和“模型特定方法”的对比

  • Riley等人推荐的“仅外部验证” :这种方法主张完全不分割现有数据集,而是用全部数据开发模型,然后寻找一个全新的、完全独立的外部数据集进行验证。这在理想情况下是最严谨的,因为它完美模拟了模型部署到新环境的情景。然而,获取高质量的外部验证集在医学研究中往往极其困难且成本高昂。本文提出的分割法是一种在 单一研究队列内 进行严格评估的务实折中方案,其前提是数据分割是随机的,且能代表同一总体。
  • 模型特定的样本量计算方法 :一些研究提供了针对特定模型(如逻辑回归、Cox比例风险模型)开发预测模型时,计算所需样本量的公式(如Riley et al., 2020的10 EPV法则)。这些方法计算出的通常是 开发模型所需的总样本量 ,隐含了模型复杂度的考量。本文方法与其互补:你可以先用模型特定方法估算一个总样本量 n ,然后按比例分配出 n_TEST 和 n_TRAIN ,再反过来用本文方法校验一下这个 n_TEST 是否满足你对性能评估精度的要求。两者结合使用,能提供更全面的样本量规划视角。

6. 常见陷阱与实操避坑指南

在实际应用这套方法时,我总结出以下几个最容易出错的点,供大家参考。

陷阱一:混淆“估计精度”与“比较效能”的样本量计算 这是最常见的概念错误。本文方法计算的是为了 估计 模型性能(如得到一个窄置信区间)需要多少测试样本。而有时研究者想问的是:为了 证明 模型A比模型B的准确率显著提高,需要多少样本?这是两个不同的统计问题,后者属于 假设检验 的样本量计算(功效分析),通常需要更大的样本量。务必在项目设计初期就明确你的主要目标是什么。

陷阱二:忽视数据分割的随机性与分层策略 计算出了 n_TEST 和 n_TRAIN ,但在实际分割数据时,简单的随机分割可能导致测试集中某一类别的样本数远低于预期(例如,阳性病例太少)。为了保证测试集能准确反映预估的患病率和满足计算出的类别样本需求,必须使用 分层抽样 。在划分训练/测试集时,应按照结局变量(如疾病状态)进行分层,确保测试集中各类别的比例与总体预估比例一致。

陷阱三:对预估参数过于乐观或悲观 所有计算都基于预估的灵敏度、特异度、患病率。如果预估过于乐观(如认为模型能达到95%的准确率),计算出的样本量会偏小,可能导致研究结束时性能评估不精确。建议进行 广泛的敏感性分析 :在方案中展示一组不同预估参数下的样本量需求表。例如:“在灵敏度为80%-90%,特异度为70%-80%的范围内,总样本量需求在3000至4500例之间。” 这体现了研究的严谨性,也让审稿人看到你考虑到了不确定性。

陷阱四:忘记考虑数据可用性与质量损耗 计算出的3920例是“清洁、完整、可用”的病例数。在实际收集中,你需要考虑:

  • 筛查失败率 :多少疑似病例的X光片质量不合格?
  • 数据缺失 :关键临床变量或金标准结果缺失的比例是多少?
  • 患者拒绝 :知情同意书的签署率如何? 通常,需要在理论样本量上增加 10%-30% 的冗余。例如,若预计有20%的数据因各种原因不可用,则初始招募目标应为 3920 / (1 - 0.20) ≈ 4900 例。

陷阱五:将本文方法视为一成不变的铁律 本文提供的是一个 框架和起点 ,而非不可更改的公式。医学研究情境复杂多变。例如,在罕见病研究中,阳性病例极其稀少,你可能无法获得计算出的足够阳性测试样本。此时,你可能需要调整目标,比如专注于报告阳性预测值(PPV)和阴性预测值(NPV),并基于此重新计算样本量,或者采用病例富集的设计。始终记住,统计方法是服务于临床研究问题的工具,灵活性至关重要。

最后,我个人在协助多个临床机器学习项目设计后的体会是,样本量规划从来不是一蹴而就的计算,而是一个与临床专家、统计学家反复沟通、迭代和妥协的过程。这套“先测试集,后训练集”的方法,最大的价值在于为这场讨论提供了一个清晰、量化、透明的共同语言。它迫使研究团队在项目伊始就直面最核心的问题:我们期望模型多好?我们愿意为这个“期望”的估计付出多少“不确定性”的成本?当你能用数字回答这些问题时,你的研究方案就已经赢在了起跑线上。

更多推荐