Kaplan-Meier 曲线
一、直观理解:有人“中途失访”时,如何估计还活着的比例
生存分析研究的是从起点到事件发生的时间,事件可以是死亡、设备失效、客户流失、产品首次故障等。难点在于删失(censoring):到观察结束时事件尚未发生,或对象失访——我们只知道“至少活过了某个时间”,不知道确切事件时间。
Kaplan–Meier(KM)估计量给出生存函数
的非参数估计,并画成阶梯状的生存曲线。每到一个事件发生时间,曲线按当时“仍在风险集中”的人数往下跳一截;删失点不直接导致跳跃,但会改变后续风险集大小。
没有删失时,KM 就是经验生存函数 ;有删失时,它是处理不完全观察的标准起点。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 含右删失的时间-事件数据;比较两组/多组生存差异;报告中位生存时间;作为 Cox 模型前的描述。 |
| 核心优点 | 不假设具体寿命分布;直观图形;中位生存与置信带可算;对数秩检验可比较曲线。 |
| 局限与缺点 | 难直接纳入多个协变量(需分层或改 Cox);独立删失假定关键;交叉的生存曲线使单一 HR 解释困难;小风险集尾部估计不稳。 |
三、核心原理
设有序事件时间 ,在 有 人发生事件,风险集大小为 (活到 且仍被观察者)。则
性质:
- 在事件时间跳跃,删失时间不跳跃;
- 中位生存时间: 首次 的 ;
- Greenwood 公式给出 ,进而点态置信区间。
对数秩检验(log-rank):在比例风险框架下比较两组生存曲线是否相同,本质是各事件时间超几何期望与观测死亡数的累计对比。
关键假定:删失与生存独立(在给定分组/协变量后)。若“病情重者更容易失访”,KM 会偏倚。
四、关键决策
1. 时间原点与事件定义
必须在分析前写死:入组日、手术日还是首次用药日;事件是死亡还是复合终点。
2. 删失如何编码
MATLAB/survfit 类工具通常:1=事件,0=删失。编码反了会得到荒谬曲线。
3. 何时上 Cox
需要同时调整多个协变量、估计风险比时,用 Cox;KM 仍用于描述与平行性/交叉检查。
4. 曲线交叉
log-rank 可能不显著或解释困难,可报告里程碑生存率(如 1 年、3 年)或使用时间依赖方法。
五、MATLAB 示例
% 需要 Statistics and Machine Learning Toolbox
% 时间、删失指示(1=事件,0=删失)、组别
T = [5 8 12 15 20 22 25 30 35 40 6 9 14 18 21 28 33 38 42 50]';
E = [1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1]';
G = [ones(1,10), 2*ones(1,10)]; % 1=对照,2=处理
% 全体 KM
[f, x] = ecdf(T, "Censoring", 1-E, "Function", "survivor");
figure;
stairs(x, f, "LineWidth", 1.5); ylim([0 1]); grid on;
xlabel("时间"); ylabel("S(t)"); title("总体 Kaplan-Meier");
% 分组 KM + logrank
figure;
ax = gca; hold on;
colors = lines(2);
for g = 1:2
tg = T(G==g); eg = E(G==g);
[fg, xg] = ecdf(tg, "Censoring", 1-eg, "Function", "survivor");
stairs(xg, fg, "Color", colors(g,:), "LineWidth", 1.5);
end
legend("对照","处理"); ylim([0 1]); grid on;
xlabel("时间"); ylabel("S(t)"); title("分组 KM 曲线");
% 对数秩检验
[p, ~, stats] = logrank(T(G==1)', E(G==1)', T(G==2)', E(G==2)');
fprintf("log-rank p = %.4g\n", p);
% 中位生存(简单读取 S(t)<=0.5)
for g = 1:2
tg = T(G==g); eg = E(G==g);
[fg, xg] = ecdf(tg, "Censoring", 1-eg, "Function", "survivor");
idx = find(fg <= 0.5, 1, "first");
if isempty(idx)
fprintf("组%d: 中位生存未达到\n", g);
else
fprintf("组%d: 中位生存约 %.1f\n", g, xg(idx));
end
end
若 logrank 在当前版本不可用,可用 coxphfit 做单因素分组对照,或手写 log-rank 统计量。
六、如何解释结果
- 队列入口、随访截止、事件与删失定义;
- 每组 n、事件数、删失数;
- KM 图(建议加风险表 numbers at risk);
- 中位生存与关键时间点生存率及 CI;
- log-rank p 与方向;
- 删失独立假定是否合理。
七、常见误区
1. 把删失当事件或直接删除删失样本
严重偏倚。
2. 曲线尾部人数很少仍精细解读
风险集变小时区间极宽。
3. 用 t 检验比较生存时间
忽略删失与偏态。
4. 交叉曲线仍强行说“全程都更好”
应分时段描述。
八、小结
Kaplan–Meier 的核心是:
在每个事件时间,用风险集更新生存概率乘积,从而在右删失下估计 。
它是生存分析的描述基石。把时间原点、事件编码和删失机制写清楚,并配合 log-rank 与中位生存,才能构成完整结果。
补充说明(建模写作)
在数学建模论文中,除正文八段结构外,建议把下列材料放进附录或支撑材料,避免主文臃肿却又不失可复核性:
- 原始数据或模拟数据的生成设定:样本量、变量含义、单位、随机种子;
- 软件与函数清单:如
corr、coxphfit、centrality及关键参数; - 对照结果:与更简单基线(均值差、入度排序、不调整分析)并排;
- 失败诊断:不收敛、不连通、删失比例过高、重叠不足时的处理;
- 可复现脚本:保证评阅人按相同步骤得到同号结论。
这些补充不改变方法本身,但能显著提高结果的可信度与答辩时的解释效率。