跳到主要内容

Kaplan-Meier 曲线

一、直观理解:有人“中途失访”时,如何估计还活着的比例​

生存分析研究的是从起点到事件发生的时间,事件可以是死亡、设备失效、客户流失、产品首次故障等。难点在于删失(censoring):到观察结束时事件尚未发生,或对象失访——我们只知道“至少活过了某个时间”,不知道确切事件时间。

Kaplan–Meier(KM)估计量给出生存函数

S(t)=P(T>t)S(t)=P(T>t)

的非参数估计,并画成阶梯状的生存曲线。每到一个事件发生时间,曲线按当时“仍在风险集中”的人数往下跳一截;删失点不直接导致跳跃,但会改变后续风险集大小。

没有删失时,KM 就是经验生存函数 1−Fn(t)1-F_n(t);有删失时,它是处理不完全观察的标准起点。

二、适用场景与优缺点​

类型说明
适用场景含右删失的时间-事件数据;比较两组/多组生存差异;报告中位生存时间;作为 Cox 模型前的描述。
核心优点不假设具体寿命分布;直观图形;中位生存与置信带可算;对数秩检验可比较曲线。
局限与缺点难直接纳入多个协变量(需分层或改 Cox);独立删失假定关键;交叉的生存曲线使单一 HR 解释困难;小风险集尾部估计不稳。

三、核心原理​

设有序事件时间 t1<t2<⋯t_1<t_2<\cdots,在 tjt_j 有 djd_j 人发生事件,风险集大小为 njn_j(活到 tjt_j 且仍被观察者)。则

S^(t)=∏tj≤t(1−djnj)\hat S(t)=\prod_{t_j\le t}\left(1-\frac{d_j}{n_j}\right)

性质:

  • S^(t)\hat S(t) 在事件时间跳跃,删失时间不跳跃;
  • 中位生存时间:S^(t)\hat S(t) 首次 ≤0.5\le 0.5 的 tt;
  • Greenwood 公式给出 Var^(S^(t))\widehat{\mathrm{Var}}(\hat S(t)),进而点态置信区间。

对数秩检验(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 统计量。

六、如何解释结果​

  1. 队列入口、随访截止、事件与删失定义;
  2. 每组 n、事件数、删失数;
  3. KM 图(建议加风险表 numbers at risk);
  4. 中位生存与关键时间点生存率及 CI;
  5. log-rank p 与方向;
  6. 删失独立假定是否合理。

七、常见误区​

1. 把删失当事件或直接删除删失样本​

严重偏倚。

2. 曲线尾部人数很少仍精细解读​

风险集变小时区间极宽。

3. 用 t 检验比较生存时间​

忽略删失与偏态。

4. 交叉曲线仍强行说“全程都更好”​

应分时段描述。

八、小结​

Kaplan–Meier 的核心是:

在每个事件时间,用风险集更新生存概率乘积,从而在右删失下估计 S(t)S(t)。

它是生存分析的描述基石。把时间原点、事件编码和删失机制写清楚,并配合 log-rank 与中位生存,才能构成完整结果。

补充说明(建模写作)​

在数学建模论文中,除正文八段结构外,建议把下列材料放进附录或支撑材料,避免主文臃肿却又不失可复核性:

  1. 原始数据或模拟数据的生成设定:样本量、变量含义、单位、随机种子;
  2. 软件与函数清单:如 corr、coxphfit、centrality 及关键参数;
  3. 对照结果:与更简单基线(均值差、入度排序、不调整分析)并排;
  4. 失败诊断:不收敛、不连通、删失比例过高、重叠不足时的处理;
  5. 可复现脚本:保证评阅人按相同步骤得到同号结论。

这些补充不改变方法本身,但能显著提高结果的可信度与答辩时的解释效率。