临床预测模型的样本量估算 -- 基于 Riley 方法

Xing Abao Lv3

样本量估算是医学相关研究必不可少的一个环节,临床预测模型研究也不例外。目前国内很多预测模型研究沿用了一些样本量估算经验方法,其中最为常用的方法就是确保每个预测参数至少有 10 哥时间,也被称为十分之法则,即 10 EPV (Events per variable),就是说要确保每个预测参数,即回归方程中的每个 β 项至少有 10 个事件被考虑纳入预测模型方程中。

另外,孙振球教授主编的《医学统计学 (第四版)》也给出了一些常用的经验方法,比如,自变量个数的 15 ~ 20 倍 (Logistic 回归分析)、自变量个数的 5 ~ 10 倍 (多元线性回归)、自变量个数的 15 ~20 倍 (Cox 回归),类似于 10 EPV 的扩展。

但是,上述仅仅是估算,是一种经验做法,只是考虑了最终纳入模型的变量个数 (实际上考虑的是系数 β 的个数),没有考虑到多分类、交互作用、非线性关系等方面的影响,因此,最好是使用每个候选预测因子参数的事件数 (EPP) 来进行预测。候选参数很重要,因为模型过拟合的程度取决于所考虑的预测参数总数,而不仅仅是最终模型方程在包含的预测参数。此外,实际所需的样本量取决于具体情况,不仅取决于事件数量与候选预测参数数量的关系,还取决于参与者总数、研究人群中结果比例 (发生率) 以及模型的预期预测性能。

Riley 方法

Richard D Riley 等学者推出了一种专用于开发临床预测模型的样本量估算方法,并开发了实用的计算工具,今年来被广泛使用。该方法以论文的形式发表在 2020 年的 BMJ 杂志上:Calculating the sample size required for developing a clinical prediction model。Riley 方法设计了 4 个步骤来估算预测模型的样本量,每个步骤都是根据特定的问题算得一个样本量,然后采用 4 个样本中最大者作为最后确定的样本量。

  1. 多大的样本量才能精确估计总体结果风险或平均结果值?
  2. 多大的样本量可以得到所有个体水平平均误差较小的预测值?
  3. 多大的样本量可以产生较小的所需预测效应收缩?
  4. 多大的样本量可以使模型拟合度达到较小的乐观程度?

这四个步骤适用范围广,不论是连续、二元分类的结局指标,还是时间时间的结局指标,都可以用。

作者还开发了一个成熟的 Stata 和 R 包,名字就叫做pmsampsize,利用这个包,研究者就可以在特定的研究环境中计算预测模型所需的最小样本量,该包的目的就是最大限度地降低过拟合的可能性,同时对关键参数进行精确估计。

核心思想

传统的样本量估算方法,如 EPV > 10,主要关注避免模型过拟合,但它们过于简化,没有考虑到模型的预期性能。Riley 开发的方法之所以先进,是因为它同时考虑了多个标准,以确保最终开发的模型不仅在统计上稳健,而且具有良好的预测性能。

其核心目标是:

  1. 避免过拟合,确保模型的整体预测风险不会被高估。这通过一个叫做全局缩减因子 (Global Shrinkage Factor) 的指标来衡量,目标是使其接近 1,通常要求 > 0.9
  2. 精确校准:,确保模型的平均预测概率与实际观测概率一致,即所谓的大范围校准要准确
  3. 精确估计模型的整体性能,能够精确地估计模型的 Cox-Snell R²,这是衡量模型解释力的一个指标。

Riley 的方法将这些目标转化为数学公式,从而计算出满足所有这些条件的最低样本量。

一些建议

  1. 上述方法仅计算所需最小的样本量,实际上样本量越大,模型越可靠;
  2. 数据应具有足够的质量,并能代表目标人群和应用环境,否则预测将不精准;
  3. 最好使用所有可用数据进行模型开发 (即避免数据分割),并使用重采样方法,如 bootstrap 进行内部验证;
  4. 采用机器学习开发模型不仅要计算样本量,而且样本量通常更大,数据少了很容易过拟合;
  5. 外部验证也可以采用上述方法计算样本量,如果只涉及模型小幅度更新,样本量可以更小。

用 R 计算样本量

pmsampsize可用于计算连续、二元或生存 (时间到事件) 结果模型开发所需的最小样本量。Riley 等人提出了一系列样本量应满足的标准。这些标准旨在将过拟合降到最低,并确保预测模型中关键参数的精确估计。

连续性结果

  1. 过拟合程度小,即预测效应预期缩小 10% 或更小,对应前面介绍的步骤 3

  2. 模型的表观R方值和调整R方值的绝对差值小于0.05,对应步骤 4

  3. 精确估计残差标准差,对应步骤 2

  4. 精确估计平均结果值,对应步骤 1

样本量计算要求用户预先指定 (例如,根据以前的证据) 模型的预期 R 方,以及相关人群的平均结果值和结果值的标准差。

二元或生存

  1. 过拟合程度小,即预测效应的预期缩减不超过 10%,对应步骤 3

  2. 模型的表观 R 方值和调整后的 Nagelkerke’s R 方值绝对差值小于 0.05, 对应步骤 4

  3. 精确估计 (在 +/- 0.05 范围内) 预测关键时间点的人群平均结果风险, 对应步骤 1

发病率和患病率的区别

在使用pmsampsize时一个常见的关键混淆点,prevalence参数在这里一般不是指发病率 (Incidence Rate),而是指患病率 (Prevalence),更准确地说,是在研究样本中结局事件的预期比例。

首先,我们必须严格区分这两个流行病学的概念:

  • 发病率 (Incidence Rate / 发病率):
    • 定义: 指在特定时期内,特定风险人群中新发生某疾病的频率。
    • 计算: (某时期内新发病例数)/(同期暴露的总人时数)。
    • 特点: 它是一个“流量”或“速度”的概念,衡量的是疾病发生的速度。
    • 您的例子: 您提到的前列腺癌发病率为 0.0001 (即十万分之十),这通常是指在普通人群中,每年每十万人中有 10 个新诊断为前列腺癌的病例。这正是一个典型的发病率。
  • 患病率 (Prevalence / 患病率):
    • 定义: 指在特定时间点或时期内,特定人群中患有某疾病(或具有某种特征)的所有病例(包括新发和旧有)所占的比例。
    • 计算: (特定时间点的现患病例数)/(当时的总人口数)。
    • 特点: 它是一个“存量”或“快照”的概念,衡量的是疾病存在的状态和负担。

核心区别:发病率关注“新发病”,而患病率关注“总患病”。

pmsampsize 包用于计算开发临床预测模型所需的样本量。在预测模型的背景下,prevalence 参数的含义是:

计划招募的研究样本中,预期有多少比例的个体最终会发生您所关注的结局事件 (Outcome Event)

如果您将 prevalence = 0.0001 输入 pmsampsize,计算机会认为在您的研究队列中,每一万名参与者里只有 1 个人会得前列腺癌。这将导致一个天文数字般的所需样本量,因为要观察到足够数量的“事件” (癌症病例) 来稳定地构建模型,需要一个极其庞大的基础人群。

这在实际研究中几乎是不可能也是不必要的,原因如下:

  • 研究设计的选择:研究者通常不会从发病率极低的普通人群中进行随机抽样来开发预测模型。这样做效率太低。
  • 常见的研究策略:
    1. 队列研究 (Cohort Study): 会选择一个高风险队列进行前瞻性跟踪。例如,您可能会招募 50 岁以上的男性,并跟踪他们 5 年或 10 年。在这个高风险队列中,前列腺癌的发生比例 (即您研究中的“prevalence”) 会远高于普通人群的年发病率 0.0001。它可能是 1%、5% 甚至更高,这取决于队列的风险水平和随访时间。
    2. 病例对照研究 (Case-Control Study): 会直接招募一组已经确诊的“病例” (前列腺癌患者) 和一组“对照” (未患前列腺癌的个体)。在这种设计下,样本中的“prevalence”是被人为设定的。例如,如果您招募了 500 个病例和 500 个对照,那么样本中的prevalence就是 500 / (500 + 500) = 0.5

如何来确定这个值

需要根据您的具体研究设计来估算这个值:

  1. 回顾文献: 查找与您计划研究的人群(例如,特定年龄段、有家族史等)和随访时间相似的队列研究。看看这些研究中报告的结局事件发生比例是多少。例如,一篇文献可能报告说,在对 60-75 岁的男性进行为期 10 年的随访后,前列腺癌的累积发生率为 8%。那么,0.08 就是一个合理的prevalence初步估计值。
  2. 进行预实验 (Pilot Study): 如果条件允许,在一个小规模的样本上进行预实验,以获得对事件发生比例的直接估计。
  3. 基于临床经验: 与临床专家讨论,根据他们对您目标研究人群的了解,估算一个合理的事件发生比例。
  4. 对于病例对照研究: 这个值由自己决定,通常为了统计效率最大化,会选择病例和对照 1:1 的比例,此时 prevalence = 0.5。如果选择 1:2 的比例(1个病例对 2 个对照),则 prevalence = 1 / (1 + 2) = 0.333

简要总结

pmsampsize 中的 prevalence 是指研究样本中的结局事件预期比例 (患病率),而不是普通人群的年发病率。

您提供的前列腺癌发病率 0.0001 是一个年发病率 (Incidence Rate),几乎肯定不是应该在 prevalence 参数中使用的正确数值。

请根据的研究设计 (队列研究、病例对照研究等)和目标人群,通过查阅文献或临床经验来估算一个切合实际的事件比例 (例如,0.05, 0.10, 0.5等)。这个值将直接影响样本量计算的合理性。

代码演示

二分类,Logistic 模型

1
2
3
4
5
6
7
8
library(pmsampsize)

pmsampsize(
type = "b",
csrsquared = 0.288,
parameters = 24,
prevalence = 0.174
)
1
2
3
4
5
6
7
8
9
10
11
12
NB: Assuming 0.05 acceptable difference in apparent & adjusted R-squared 
NB: Assuming 0.05 margin of error in estimation of intercept
NB: Events per Predictor Parameter (EPP) assumes prevalence = 0.174

Samp_size Shrinkage Parameter CS_Rsq Max_Rsq Nag_Rsq EPP
Criteria 1 623 0.900 24 0.288 0.603 0.477 4.52
Criteria 2 662 0.905 24 0.288 0.603 0.477 4.80
Criteria 3 221 0.905 24 0.288 0.603 0.477 1.60
Final 662 0.905 24 0.288 0.603 0.477 4.80

Minimum sample size required for new model development based on user inputs = 662,
with 116 events (assuming an outcome prevalence = 0.174) and an EPP = 4.8

使用 24 个候选预测参数建立二元结果变量预测模型所需的最小样本量。根据以往的证据,假设发生率预计为 0.174,现有预测模型的 (取自现有预测模型的校正 Cox-Snell R2) R 方值下限为 0.288。

还有另一种情况,假设我们无法从现有的预测模型中获得 Cox-Snell R 平方估计值,但有报告称现有预测模型的 C 统计量为 (0.89)。我们可以使用这个 C 统计量和患病率,用 Riley 等人的方法近似计算 Cox-Snell R 平方。

用法简单,使用 cstatistic() 选项代替 csrsquared() 选项即可。

1
2
3
4
5
6
7
8
library(pmsampsize)

pmsampsize(
type = "b",
cstatistic = 0.89,
parameters = 24,
prevalence = 0.174
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Given input C-statistic = 0.89  & prevalence = 0.174  
Cox-Snell R-sq = 0.2902

NB: Assuming 0.05 acceptable difference in apparent & adjusted R-squared
NB: Assuming 0.05 margin of error in estimation of intercept
NB: Events per Predictor Parameter (EPP) assumes prevalence = 0.174

Samp_size Shrinkage Parameter CS_Rsq Max_Rsq Nag_Rsq EPP
Criteria 1 617 0.900 24 0.2902 0.603 0.481 4.47
Criteria 2 661 0.906 24 0.2902 0.603 0.481 4.79
Criteria 3 221 0.906 24 0.2902 0.603 0.481 1.60
Final 661 0.906 24 0.2902 0.603 0.481 4.79

Minimum sample size required for new model development based on user inputs = 661,
with 116 events (assuming an outcome prevalence = 0.174) and an EPP = 4.79

连续结果,线性预测模型

以连续变量为例,计算使用 20 个候选预测因子建立连续性结果多变量预测模型所需的最小样本量。我们假设该领域现有的预测模型的调整 R 平方为 0.9,人群中该连续变量的平均值为 26.7,SD 为 8.7 。

1
2
3
4
5
6
7
8
library(pmsampsize)
pmsampsize(
type = "c",
rsquared = 0.9,
parameters = 20,
intercept = 26.7,
sd = 8.7
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
NB: Assuming 0.05 acceptable difference in apparent & adjusted R-squared 
NB: Assuming MMOE <= 1.1 in estimation of intercept & residual standard deviation
SPP - Subjects per Predictor Parameter

Samp_size Shrinkage Parameter Rsq SPP
Criteria 1 68 0.900 20 0.9 3.40
Criteria 2 41 0.853 20 0.9 2.05
Criteria 3 254 0.970 20 0.9 12.70
Criteria 4* 254 0.970 20 0.9 12.70
Final 254 0.970 20 0.9 12.70

Minimum sample size required for new model development based on user inputs = 254

* 95% CI for intercept = (26.36, 27.04), for sample size n = 254

生存分析,Cox 预测模型

计算使用 30 个候选预测因子建立生存结果多变量预测模型所需的最小样本量。假设我们知道现有的同领域预测模型的调整 R 平方为 0.051 。此外,在之前的研究中,平均随访时间为 2.07 年,总体事件发生率为 0.065 。我们选择一个感兴趣的时间点,使用新开发的 2 年模型进行预测。

1
2
3
4
5
6
7
8
9
library(pmsampsize)
pmsampsize(
type = "s",
csrsquared = 0.051,
parameters = 30,
rate = 0.065,
timepoint = 2,
meanfup = 2.07
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NB: Assuming 0.05 acceptable difference in apparent & adjusted R-squared 
NB: Assuming 0.05 margin of error in estimation of overall risk at time point = 2
NB: Events per Predictor Parameter (EPP) assumes overall event rate = 0.065

Samp_size Shrinkage Parameter CS_Rsq Max_Rsq Nag_Rsq EPP
Criteria 1 5143 0.900 30 0.051 0.555 0.092 23.07
Criteria 2 1039 0.648 30 0.051 0.555 0.092 4.66
Criteria 3 * 5143 0.900 30 0.051 0.555 0.092 23.07
Final SS 5143 0.900 30 0.051 0.555 0.092 23.07

Minimum sample size required for new model development based on user inputs = 5143,
corresponding to 10646 person-time** of follow-up, with 692 outcome events
assuming an overall event rate = 0.065 and therefore an EPP = 23.07

* 95% CI for overall risk = (0.113, 0.13), for true value of 0.122 and sample size n = 5143
**where time is in the units mean follow-up time was specified in

三分类问题如何预测样本量

例如,对于前列腺预测,主要涉及三类人群:健康人群、前列腺增生、前列腺癌。这是一个多分类的问题。然而,Riley 团队开发的pmsampsize包目前主要针对二元逻辑回归和生存分析。

最常见且最实用的方法是,将多分类问题简化为一系列的二分类问题,并针对最关键、最难预测的那个二分类问题来计算样本量。这个样本量通常是最大的,因此也能满足其他分类任务的需求。

样本量估算总览

模型包含两个部分,我们将分别为它们计算样本量:

  1. 模型一:区分正常与异常
    • 目标,从普通人群中筛查出有潜在风险的个体。
    • 分类问题,健康人群 (Healthy) vs. {前列腺增生 (BPH) + 前列腺癌 (PCa)}
  2. 模型二:区分良性与恶性
    • 目标: 在已确定为异常的个体中,精确诊断出癌症。
    • 分类问题: 前列腺增生 (BPH) vs. 前列腺癌 (PCa)

核心原则:我们将分别对这两个模型运行 pmsampsize,然后取各组所需的最大人数,以确保两个模型都有足够的数据进行稳健的开发。通常,模型二( BPH vs. PCa) 是更困难的分类任务,它会对样本量提出更高的要求。

第一步,为模型一估算样本量

这个模型的目标是区分健康人和任何有前列腺问题的人。

需要提供的参数有:

  1. cstatistic (AUC): 您期望模型一区分”健康”与”异常”的能力有多强?
    • 这个任务相对简单。通常,仅凭年龄和 PSA 值就能达到很高的 AUC 。因此,您可以设定一个较高的目标,例如 0.900.95
    • 我们假设 cstatistic = 0.95
  2. parameters: 计划在模型一中包含多少个预测变量?
    • 思考辅助,可能包括年龄、PSA、家族史、DRE 结果等。
    • 我们假设 parameters = 10
  3. prevalence: 在您研究的目标人群中,”异常”人群(BPH+PCa)的患病率是多少?
    • 思考辅助,这是最关键的参数。您需要根据文献或预实验来估计。例如,在一个 50 岁以上的男性体检人群中,可能有 30% 的人有 BPH,5% 的人有PCa。那么,总的”异常”患病率就是 30% + 5% = 35%
    • 我们假设 prevalence = 0.35 (即 35%)。
  4. shrinkage: 保持默认的 0.9 即可,这是一个稳健的标准。
1
2
3
4
5
6
7
8
9
library(pmsampsize)
pmsampsize_results1 <- pmsampsize(
type = "b",
cstatistic = 0.95,
parameters = 10,
prevalence = 0.35,
shrinkage = 0.9
)
print(pmsampsize_results1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Given input C-statistic = 0.95  & prevalence = 0.35  
Cox-Snell R-sq = 0.53

NB: Assuming 0.05 acceptable difference in apparent & adjusted R-squared
NB: Assuming 0.05 margin of error in estimation of intercept
NB: Events per Predictor Parameter (EPP) assumes prevalence = 0.35

Samp_size Shrinkage Parameter CS_Rsq Max_Rsq Nag_Rsq EPP
Criteria 1 113 0.900 10 0.53 0.726 0.73 3.95
Criteria 2 187 0.936 10 0.53 0.726 0.73 6.54
Criteria 3 350 0.936 10 0.53 0.726 0.73 12.25
Final 350 0.936 10 0.53 0.726 0.73 12.25

Minimum sample size required for new model development based on user inputs = 350,
with 123 events (assuming an outcome prevalence = 0.35) and an EPP = 12.25

如何解读模型一的结果?

运行上述代码后,pmsampsize 告诉我们:”Minimum sample size required … = 350, with 123 events…”,表示总样本量为 350 人,事件 (Events) 53 人,这里的事件指的是异常人群,即 BPH + PCa;非事件 (Non-events) 即为 350 - 150 = 227 人,这里的非事件是健康人群。

从这一步,我们得到的结论,我们需要最少 227 名健康对照者。

第二步,为模型二估算样本量

这个模型是临床的核心,目标是在已经确定有前列腺问题的病人中,区分良性的 BPH 和恶性的 PCa 。

需要提供的参数有:

  1. cstatistic (AUC): 期望模型二区分 BPH 与 PCa 的能力有多强?
  • 思考辅助,这是非常困难的任务,是临床的痛点。因此,这里的 AUC 会比模型一低。一个有临床价值的新模型,AUC 通常目标设定在 0.800.85 之间。
  • 我们假设 cstatistic = 0.85
  1. parameters: 计划在模型二中包含多少个预测变量?
  • 思考辅助,这里可能会包含更高级的生物标志物或影像学特征 (如 phi, 4Kscore, MRI PIRADS 评分等),变量数可能比模型一更多。
  • 我们假设 parameters = 10
  • prevalence: 在异常人群中,PCa 患者所占的比例是多少?
  • 思考辅助,这是最容易出错的地方!这里的 prevalence 不是 PCa 在总人群中的患病率。

    它的计算公式是:Prevalence_Model2 = P(PCa) / (P(BPH) + P(PCa))

  • 沿用我们之前的例子:如果总人群中 BPH 占 30%,PCa 占 5%,那么在异常人群中,PCa 的比例是 5% / (30% + 5%) = 5 / 35 ≈ 0.143

  • 我们假设 prevalence = 0.143,即 14.3%

  • shrinkage: 同样,保持默认的 0.9
1
2
3
4
5
6
7
8
9
library(pmsampsize)
pmsampsize_results2 <- pmsampsize(
type = "b",
cstatistic = 0.85,
parameters = 10,
prevalence = 0.143,
shrinkage = 0.9
)
print(pmsampsize_results2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Given input C-statistic = 0.85  & prevalence = 0.143  
Cox-Snell R-sq = 0.2026

NB: Assuming 0.05 acceptable difference in apparent & adjusted R-squared
NB: Assuming 0.05 margin of error in estimation of intercept
NB: Events per Predictor Parameter (EPP) assumes prevalence = 0.143

Samp_size Shrinkage Parameter CS_Rsq Max_Rsq Nag_Rsq EPP
Criteria 1 393 0.900 10 0.2026 0.56 0.362 5.62
Criteria 2 315 0.879 10 0.2026 0.56 0.362 4.50
Criteria 3 189 0.900 10 0.2026 0.56 0.362 2.70
Final 393 0.900 10 0.2026 0.56 0.362 5.62

Minimum sample size required for new model development based on user inputs = 393,
with 57 events (assuming an outcome prevalence = 0.143) and an EPP = 5.62

如何解读模型二的结果?

运行上述代码后,pmsampsize 告诉我们:”Minimum sample size required … = 393, with 57 events…”,表示总样本量为 393 人,这个总样本量指的是 BPH + PCa 的总人数。

事件 (Events) 57 人,这里的事件指的是前列腺癌 (PCa);非事件 (Non-events) 即为 393 - 57 = 336 人,这里的非事件是前列腺增生 (BPH)。

从这一步,我们得到的结论,我们需要至少 57 名 PCa 患者和 336 名 BPH 患者。

第三步,合并结果,得出最终样本量

健康人群、前列腺增生、前列腺癌比例按照 65%30%5% 估算:

现在,我们把两步计算得到的需求放在一起,取每个组别的最大值,以确保两个模型都能被充分训练。

现在,我们将两个模型的最低要求合并,并取每个组别的最大值,以确保两个模型都能得到充分的训练数据。

  1. 健康人群 (Healthy) 需要多少人?
    • 模型一要求: 227
    • 模型二不涉及此组
    • 最终需求: 227
  2. 前列腺增生 (BPH) 患者需要多少人?
    • 模型一需要 BPH 患者作为 123 名“异常人群”的一部分,但未指定具体数量
    • 模型二明确要求: 336
    • 最终需求: 我们必须满足更严格、更明确的要求,即 336
  3. 前列腺癌 (PCa) 患者需要多少人?
    • 模型一需要 PCa 患者作为 123 名“异常人群”的一部分,同样未指定具体数量。
    • 模型二明确要求: 57
    • 最终需求: 我们必须满足更严格、更明确的要求,即 57 人。

模型二需要 336 (BPH) + 57 (PCa) = 393 名异常患者。这个数量 393 远大于模型一所要求的 123 名异常患者。因此,当我们满足了模型二的需求时,模型一对于“异常人群”总数的需求也自然被满足了。这证明我们的合并逻辑是正确的。

最终结论与样本量规划

模型开发集 (Development Cohort)

根据您的计算,为了成功开发您的串联预测模型,您需要招募的总开发集样本量为:

总样本量 = 227 (健康) + 336 (BPH) + 57 (PCa) = 620 人

各组别的最低样本量要求如下:

  • 健康人群: 227 人
  • 前列腺增生 (BPH): 336 人
  • 前列腺癌 (PCa): 57 人

请注意: 这 620 人是用于训练和内部验证 (例如,通过 Bootstrapping) 的样本量。

外部验证集 (External Validation Cohort)

如我们之前所讨论的,一个严谨的研究还需要一个独立的外部验证集。其样本量应根据“100个事件/100个非事件”的经验法则来估算,并且应针对您模型中最关键、最困难的分类任务,即 模型二 (BPH vs. PCa)

  • 事件 (PCa): 至少 100 人
  • 非事件 (BPH): 至少 100 人
  • 健康人群: 也可以纳入一些(例如 50-100 人)来验证模型一的性能。

一个稳健的验证集规划可以是:

  • 前列腺癌 (PCa): 100 人
  • 前列腺增生 (BPH): 100 人
  • 健康人群: 100 人
  • 验证集总样本量: 约 300 人

项目总样本量

项目总样本量 = 开发集 + 验证集 = 620 + 300 = 920 人

如何在研究计划中撰写

可以这样在方法学部分描述您的样本量估算:

“本项目采用串联/层级预测模型设计。我们分两步独立计算了模型开发所需的样本量。

第一步,针对区分健康人群与**异常人群(BPH+PCa)**的模型,我们设定预期AUC为 0.95,纳入 10 个预测变量,异常人群患病率估计为 35% 。pmsampsize计算结果表明,需要一个包含 227 名健康者和 123 名异常患者的总计 350 人的队列。

第二步,针对在异常人群中区分 BPH 与 **PCa **的核心诊断模型,我们设定预期AUC为 0.85,纳入10 个预测变量,PCa 在异常人群中的比例估计为 14.3%。pmsampsize计算结果表明,需要一个包含 336 名 BPH 患者和 57 名 PCa 患者的总计 393 人的队列。

为了同时满足两个模型的开发需求,我们合并并取各组别的最大需求量。因此,本研究的模型开发队列计划招募总计 620 名受试者,其中包括至少 227 名健康对照者336 名前列腺增生患者,以及 57 名前列腺癌患者

此外,为了评估模型的泛化能力,我们将招募一个独立的外部验证队列,该队列将至少包含 100 名前列腺癌患者和 100 名前列腺增生患者。

如何确定自己研究的 prevalence

核心原则:一切由模型的【预期应用场景】决定

在回答任何具体问题之前,必须首先明确回答一个问题:

“我们开发的这个串联模型,将来到底要给谁用?在什么临床场景下解决什么具体问题?”

这个问题的答案,将直接决定如何定义人群、如何计算prevalence、如何设定年龄范围。

场景 A:模型作为【大众健康筛查工具】

预期应用场景: 用于体检中心、社区卫生服务站,对无明显症状的中老年男性进行前列腺癌的初步风险分层,目的是找出高危人群建议他们去泌尿外科进一步检查。

目标人群: 表面健康的、无症状或仅有轻微下尿路症状的普通中老年男性。

数据来源: 必须是体检科或类似的初级保健部门;绝对不能只用泌尿外科的数据,因为那里的患者已经是经过“筛选”的,患病率极高,完全不代表普通人群。

如何计算 prevalence:

  1. 回顾性统计: 调取您医院体检科过去1-2年的数据。
  2. 年龄筛选: 首先,只保留您设定的年龄范围内的男性(例如,50-80 岁,下文会详述)。
  3. 统计比例: 在这个经过年龄筛选的体检人群中,统计最终被确诊为健康、BPH 和 PCa 的比例。
    • 举例:在 10,000 名 50-80 岁的体检男性中,最终发现:
      • 健康: 9,500 人 (95%)
      • BPH: 450 人 (4.5%)
      • PCa: 50 人 (0.5%)
  4. 计算 pmsampsize 所需的 prevalence
    • 模型一 (健康 vs. 异常): prevalence = P(异常) = P(BPH) + P(PCa) = 4.5% + 0.5% = 5% (或 0.05)
    • 模型二 (BPH vs. PCa): prevalence = P(PCa | 异常) = P(PCa) / [P(BPH) + P(PCa)] = 0.5% / (4.5% + 0.5%) = 0.5 / 5 = 10% (或 0.1)

场景 B:模型作为【泌尿外科辅助诊断工具】

  • 预期应用场景: 用于泌尿外科门诊,帮助医生判断那些已经因为某些症状 (如排尿困难) 或指标异常 (如 PSA 升高) 前来就诊的患者,到底更可能是 BPH 还是 PCa,从而决定是否需要进行穿刺活检。
  • 目标人群: 因疑似前列腺问题而到泌尿外科就诊的中老年男性。
  • 数据来源: 必须是泌尿外科的门诊数据。 在这个场景下,使用泌尿外科的数据不是偏倚,而是正确地选择了目标人群。您的模型就是为了服务这个特定人群。
  • 如何计算 prevalence:
    1. 回顾性统计: 调取您医院泌尿外科过去1-2年的初诊患者数据。
    2. 年龄筛选: 同样,只保留您设定的年龄范围内的男性(例如,50-80 岁)。
    3. 统计比例: 在这个经过年龄筛选的泌尿外科就诊人群中,统计最终确诊为健康/其他、BPH和 PCa 的比例。
      • 举例:在 1,000 名 50-80 岁的泌尿外科初诊患者中,最终发现:
        • 健康/其他: 100 人 (10%)
        • BPH: 600 人 (60%)
        • PCa: 300 人 (30%)
    4. 计算 pmsampsize 所需的 prevalence:
      • 模型一 (健康 vs. 异常): prevalence = P(异常) = P(BPH) + P(PCa) = 60% + 30% = 90% (或 0.9)
      • 模型二 (BPH vs. PCa): prevalence = P(PCa | 异常) = P(PCa) / [P(BPH) + P(PCa)] = 30% / (60% + 30%) = 30 / 90 ≈ 33.3% (或 0.333)

结论:您看,不同的应用场景导致 prevalence 的计算结果天差地别。因此,您必须先确定场景,再根据场景选择对应科室的数据进行统计。

年龄限制,确保人群同质性

为什么要限制年龄

  1. 临床相关性,前列腺疾病是中老年男性高发病。在 40 岁以下的男性中极为罕见。纳入这些极低风险的年轻人,对模型学习区分 BPH 和 PCa 毫无帮助,只会引入噪音。您的模型应该聚焦于真正需要它的核心人群。
  2. 符合临床实践,无论是筛查还是诊断,临床指南和医生关注的都是中老年男性 (通常是 50 岁以上,或高危人群 45 岁以上)。您的研究人群应与最终的应用人群保持一致。
  3. 减少混杂因素,年龄本身是预测前列腺疾病的超强变量。如果不加限制,模型的性能可能被年龄这个单一因素主导,而学不到您想研究的其他预测因子的价值。通过限制年龄范围 (如 50-80 岁),可以降低年龄的混杂效应,让模型专注于学习其他指标的模式。
  4. 提高人群同质性,一个在相对同质化人群 (如 50-80 岁) 中开发的模型会更加稳定和可靠。超高龄患者 (如 > 85 岁) 往往伴有多种复杂疾病,其临床决策逻辑也不同,将他们纳入会增加不必要的复杂性。

发病率很低怎么办

在一个真实的、无症状的普通体检人群中,前列腺癌的患病率确实非常低,通常远低于 1%。这会直接导致两个巨大的问题:1. 统计学上的问题:事件数过少 (Too Few Events);实践操作上的问题:可行性极低 (Low Feasibility) 。

预测模型开发的标准之一是每变量事件数 (Events Per Variable, EPV)。一个广泛接受的经验法则是,每纳入一个预测因子 (变量),至少需要 10 个结局事件,在这里,结局事件就是 PCa 病例。假设模型二区分 BPH 和 PCa,有 10 个预测因子,您至少需要 10 * 10 = 100 个 PCa 病例。如果 PCa 在体检人群中的真实比例是 0.5% ,为了找到这 100 个 PCa 病例,理论上需要招募的总人数将是 100 / 0.5% = 100 / 0.005 = 20,000 人!

那么,研究者们是如何解决这个难题的呢?

面对这个挑战,研究实践中通常采用以下几种策略,而这些策略的本质都是通过富集 (Enrichment) 的方法,来提高研究人群中 PCa 病例的比例,使得研究在统计学和实践上都变得可行。

策略一:重新定义“筛查人群” —— 最常用且最实用的方法

这可能是最适合的策略。不再针对“所有来体检的男性”,而是定义一个更精确、风险更高的“筛查人群”。

  • 将目标人群从普通体检男性缩小为因 PSA 水平轻度升高, 例如 4-10 ng/mL 或有其他高危因素 (如家族史) 而来接受进一步检查的男性
  • 为什么这样做有效:
    • 这个人群的PCa患病率显著高于普通人群 (在 PSA 4-10 ng/mL 的区间,PCa 的检出率大约在 25%-35%)。
    • 这使得您不再需要数万的样本量,可能只需要数百或上千人就能收集到足够的 PCa 病例。
    • 这个临床场景非常有价值!如何处理 PSA 在灰色地带的患者是全世界泌尿外科医生每天都在面对的难题。为这个人群开发一个模型,能够帮助他们更精准地判断谁需要进行穿刺活检,具有巨大的临床意义。
  • 如何操作:
    1. 您的研究题目将不再是一个广谱筛查模型,而是一个针对 PSA 水平在 4-10 ng/mL 男性进行前列腺癌风险分层的预测模型。
    2. 您去医院数据库中,筛选出所有符合这个新标准(年龄 50-80 岁,PSA 在 4-10 ng/mL 之间)的男性。
    3. 在这个富集后的人群中,重新统计 BPH 和 PCa 的比例,并用这个新的、更高的prevalence来计算样本量。

策略二:采用病例-对照研究设计 (Case-Control Design)

这是一种经典的流行病学研究方法,专门用于研究罕见疾病。

  • 定义: 不进行随机抽样。而是主动地、有目的地去招募:
    • 一组“病例”:例如,招募 200 名已经确诊的 PCa 患者。
    • 一组或多组“对照”:例如,再招募 200 名确诊为 BPH 的患者,以及 200 名确认前列腺健康的男性。
  • 优点:
    • 高效: 保证了您能以较小的总样本量获得足够的事件进行分析。
  • 重大缺点,必须警惕!:
    • 无法计算真实患病率: 因为人群是“拼凑”出来的,所以样本中的比例,如 PCa 占 33%,完全不代表真实世界。
    • 无法直接评估模型的临床净获益: 像阳性预测值 (PPV)、阴性预测值 (NPV) 这些依赖于患病率的指标,无法从这种设计中直接获得。模型的校准也会出现严重偏差。
    • 选择偏倚风险高: 您在选择“对照组”时非常容易引入偏倚。
    • 结论局限: 这种设计主要用于发现“风险因子” (哪些指标与 PCa 相关),但直接构建一个用于预测个体概率的模型时,其性能评估会受限。

策略三:大型前瞻性队列研究 (Large-scale Prospective Cohort Study)

这是科学证据等级最高的方法,但也是最难的。

  • 定义: 招募一大群 (数万甚至数十万) 健康人,收集他们的基线数据,然后长期随访 (5 年、10 年、20 年),观察他们当中谁最终患上了 PCa 。
  • 优点: 能提供最高质量的证据,能观察疾病的自然史,避免了多种偏倚。
  • 缺点: 耗时极长,耗资巨大,不适合绝大多数独立研究者。
  • Title: 临床预测模型的样本量估算 -- 基于 Riley 方法
  • Author: Xing Abao
  • Created at : 2025-11-05 08:49:40
  • Updated at : 2025-11-06 12:41:14
  • Link: https://bioinformatics.vip/2025/11/05/251105_sample_size_calculations_in_multi_group_clinical_trials/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments