跳到主内容

60 名患者的随访生存:新药是否延长了生存时间?

研究背景

某临床试验对 60 名患者进行随访(新药组 30 人、对照组 30 人),记录生存时间(月)、随访结束时是否发生终点事件(1 = 死亡,0 = 删失),以及年龄与性别。其中 19 人在研究截止时仍存活或中途失访,他们的真实生存时间只知道「不小于」随访时长,属于右删失数据。

研究问题

两组的生存曲线是否不同?在控制年龄与性别之后,新药对死亡风险的效应有多大?

数据说明

60 行 × 5 列:time(生存或删失时间,月)、status(1 = 发生事件,0 = 删失)、group(新药组 / 对照组)、age(岁)、sex(1 = 男,0 = 女)。共 41 例事件、19 例删失。

示例数据

time,status,group,age,sex
8,1,新药组,64,1
16,1,新药组,69,1
28,0,新药组,52,0
30,0,新药组,42,1
45,0,新药组,60,1
29,0,新药组,45,0
11,1,新药组,65,0
27,0,新药组,52,0
15,0,新药组,56,1
12,1,新药组,74,0
24,0,新药组,67,1
15,1,新药组,70,0
7,1,新药组,59,0
1,1,新药组,73,0
27,0,新药组,41,0
9,1,新药组,71,1
18,1,新药组,54,0
19,0,新药组,48,0
1,1,新药组,59,1
6,1,新药组,73,0
32,0,新药组,52,1
21,1,新药组,72,1
27,1,新药组,56,1
25,1,新药组,74,0
16,0,新药组,67,0
15,0,新药组,67,0
21,1,新药组,53,1
7,1,新药组,61,0
32,1,新药组,49,1
8,1,新药组,68,0
13,1,对照组,49,1
12,1,对照组,64,0
1,1,对照组,43,0
16,0,对照组,49,0
15,0,对照组,53,1
22,0,对照组,46,0
10,0,对照组,49,0
14,1,对照组,47,0
26,1,对照组,41,1
16,1,对照组,52,0
6,1,对照组,56,0
19,1,对照组,55,1
1,1,对照组,71,0
10,1,对照组,43,1
14,0,对照组,62,1
7,1,对照组,52,0
18,0,对照组,41,0
2,1,对照组,67,0
5,1,对照组,55,0
5,1,对照组,74,1
1,1,对照组,67,1
9,1,对照组,70,0
4,1,对照组,60,0
6,1,对照组,52,1
1,1,对照组,70,0
19,1,对照组,54,0
3,1,对照组,70,1
8,1,对照组,72,1
37,0,对照组,52,0
3,1,对照组,65,1
logrank

分析步骤

  1. 步骤 1:先确认删失编码方向

    本工具的约定是 status = 1 表示发生事件、0 表示删失。如果编码颠倒(部分软件用 1 = 删失),Kaplan-Meier 曲线会完全错误,且不会报错。载入数据后先核对事件数与删失数是否与研究记录一致:本例应为 41 例事件、19 例删失。

    提示:一个快速的自检方法:删失比例若异常高(如 > 90%),几乎都是编码方向搞反了。

  2. 步骤 2:用 Kaplan-Meier 估计生存函数与中位生存时间

    KM 法在每个事件时间点用条件概率连乘更新生存率:S(t) = ∏(1 − dᵢ/nᵢ)。中位生存时间是 S(t) 首次降到 0.5 以下的时间点,其 95% CI 由 Greenwood 标准误经互补对数变换得到。切到「Kaplan-Meier」模式可查看合并曲线,切到「log-rank」模式可查看分组曲线。

  3. 步骤 3:用 log-rank 检验比较两组曲线

    log-rank 检验的思路是比较各组的观察事件数 O 与「两组生存曲线相同时」的期望事件数 E,统计量 χ² = Σ(O−E)²/E 服从自由度 = 组数 − 1 的卡方分布。它是整体检验,只回答「曲线是否不同」,不回答「哪段时间不同」。

  4. 步骤 4:用 Cox 回归控制协变量并输出风险比 HR

    切到「Cox 回归」模式,把 age、sex、group 一起放入模型。Cox 模型是半参数的:不指定基线风险函数的形状,只假设各协变量对 log(风险) 的效应是线性可加的。系数取指数得到 HR,即「其他变量不变时,该变量每增加一个单位,瞬时风险的倍数」。

    提示:存在同一时间点多例事件(打结)时,本工具默认用 Efron 近似,比 Breslow 更接近精确偏似然,也与 R survival 包和 statsmodels 的默认一致。

  5. 步骤 5:检查比例风险假定与影响点

    Cox 模型要求 HR 在整个随访期内恒定。可用分组 KM 曲线是否交叉做目视判断(交叉通常提示 PH 被违反),并查看 martingale 残差是否有绝对值过大的个体。本例 martingale 残差最大绝对值为 2.789,超过经验阈值 2,工具把「无强影响点」标记为未通过,需要进一步查 deviance 残差定位具体个体。

结果解读

结论

合并 60 人的 Kaplan-Meier 估计给出中位生存时间 15 个月(95% CI [9, 21]),共 41 例事件、19 例删失,随访至 45 个月时生存率为 0.192。分组后新药组中位生存时间 21 个月(95% CI [12, 32]),对照组 9 个月(95% CI [5, 16])。log-rank 检验显示两组生存曲线存在统计学显著差异,χ²(1) = 6.63, p = .010(α = 0.05):新药组观察事件 18 例、期望 25.65 例,对照组观察事件 23 例、期望 15.35 例,即新药组的死亡数明显少于曲线相同时的预期。Cox 比例风险回归(Efron 处理打结,LR χ²(3) = 30.63, p < .001,Harrell's C = 0.747)中,分组变量(对照 = 0,新药 = 1)β = −1.442, HR = 0.236, 95% CI [0.117, 0.479], p < .001,新药的瞬时死亡风险约为对照组的 24%,即风险下降约 76%;年龄 β = 0.088, HR = 1.092, 95% CI [1.053, 1.132], p < .001,每增加 1 岁风险上升约 9%;性别 HR = 0.942, 95% CI [0.506, 1.753], p = .850,未观察到统计学显著关联。martingale 残差最大绝对值 2.789,「无强影响点」一项未通过,提示存在个别影响个体。

为什么这样解读?

第一,为什么不能用 t 检验或 Mann-Whitney 比较两组的 time 列:19 名删失个体的真实生存时间未知,把他们按随访时长当作实际生存时间会低估生存率,直接删除他们又会浪费信息并引入选择偏倚。KM 与 log-rank 的全部价值就在于「正确地使用不完整的信息」。第二,中位生存时间与 HR 是两个不同层面的结论:中位从 9 个月提升到 21 个月是描述性的、容易沟通的指标,但它只用到曲线上一个点;HR = 0.236 描述的是整条曲线的风险比,二者不冲突也不能互相换算。第三,Harrell's C = 0.747 说明模型的风险排序能力可接受(0.5 为随机猜测,0.7 以上通常认为可用),这是 C 指数的解读要点,不要与相关系数混淆。第四,log-rank 显著只说明曲线整体不同,本例两组曲线在早期就分离且未交叉,与 PH 假定一致;如果曲线后期才分离或发生交叉,HR 这个单一数字会掩盖时间依赖的效应。第五,「无强影响点」未通过不必然是模型失败:martingale 残差的理论范围是 (−∞, 1],长期存活且被删失的个体天然会有较大的负残差,正确做法是再看 deviance 残差(近似对称、界于 ±2)确认是否真的是异常个体。

如何在论文中报告

采用 Kaplan-Meier 法估计生存率并用 log-rank 检验比较两组(α = 0.05)。60 名患者中 41 例发生终点事件、19 例删失,合并中位生存时间 15 个月(95% CI [9, 21])。新药组中位生存时间 21 个月(95% CI [12, 32]),对照组 9 个月(95% CI [5, 16]),两组差异有统计学意义,χ²(1) = 6.63, p = .010。进一步以 Cox 比例风险回归(Efron 法处理打结)控制年龄与性别:新药组相对对照组的 HR = 0.24, 95% CI [0.12, 0.48], p < .001;年龄 HR = 1.09, 95% CI [1.05, 1.13], p < .001;性别 HR = 0.94, 95% CI [0.51, 1.75], p = .850。模型整体 LR χ²(3) = 30.63, p < .001,Harrell's C = 0.747,判别力可接受。martingale 残差最大绝对值 2.79,提示存在个别影响点,已核查 deviance 残差后保留全部观测。

常见错误

对含删失的生存时间直接用 t 检验或 Mann-Whitney 检验

删失观测的真实生存时间未知,既不能当作完整观测也不能简单剔除。含删失的时间-事件数据必须用 Kaplan-Meier + log-rank(两组)或 Cox 回归(含协变量)。

把 status 的 0/1 编码搞反

本工具约定 1 = 发生事件、0 = 删失。编码颠倒时曲线会完全错误但不报错,因此载入数据后必须核对事件数与删失数是否与原始记录一致。

把 HR 当成风险差或存活率之比

HR = 0.236 表示瞬时风险的比值为 0.236(下降约 76%),不是「存活率高 76%」,也不是「死亡人数少 76%」。HR 是相对量,要得到绝对风险差需结合基线生存函数计算。

log-rank 显著就断言两组在整个随访期都不同

log-rank 是对整条曲线的整体检验,无法定位差异出现的时间段。若曲线交叉或仅在后期分离,应改用带时间依赖协变量的 Cox 模型或分段分析,并如实说明 PH 假定被违反。

动手跑一遍

用本案例数据打开 生存分析 计算器,亲手复现统计量、p 值与置信区间,数据只在浏览器内处理。

打开 生存分析 →