拟合 Kaplan-Meier 估计量

Python 中的生存分析

Shae Wang

Senior Data Scientist

什么是 Kaplan-Meier 估计量?

一种非参数统计量,用于估计事件发生时间数据的生存函数。

  • 亦称为:
    • 乘积-极限估计量
    • K-M 估计量
  • 非参数:直接由观测数据构建生存曲线,不假设分布形式
Python 中的生存分析

数学直觉

定义:

  • $t_i$:一次持续时间
  • $d_i$:在 $t_i$ 时发生的事件数
  • $n_i$:在 $t_i$ 前被确认仍存活的个体数

 

生存函数 $S(t)$ 的估计: $$S(t)=\prod_{i:t_i\leq t}\bigg(1-\frac{d_i}{n_i}\bigg)$$

Python 中的生存分析

为何称为乘积-极限估计量?

设事件发生在 3 个时点:1、2、3

$t=2$ 的生存率: $$S(t=2)=\bigg(1-\frac{d_1}{n_1}\bigg)*\bigg(1-\frac{d_2}{n_2}\bigg)$$

$t=3$ 的生存率: $$S(t=3)=S(t=2)*\bigg(1-\frac{d_3}{n_3}\bigg)$$

时点 t 的生存率等于该时点及此前各时点存活概率的乘积。

Python 中的生存分析

需注意的假设

  • 明确事件:关注的事件在确切时间发生。
  • 可比性:所有受试者的生存概率可比,与入组时间无关。
  • 非信息性删失:被删失个体与继续随访者具有相同生存前景。
Python 中的生存分析

使用 lifelines 的 Kaplan-Meier 估计量

from lifelines import KaplanMeierFitter

KaplanMeierFitterlifelines 库中的一个类

kmf = KaplanMeierFitter()
kmf.fit(durations, event_observed)
Python 中的生存分析

房贷问题示例

DataFrame 名称:mortgage_df

id duration paid_off
1 25 0
2 17 1
3 5 0
... ... ...
100 30 1
Python 中的生存分析

房贷问题示例

DataFrame 名称:mortgage_df

id duration paid_off
1 25 0
2 17 1
3 5 0
... ... ...
100 30 1
from lifelines import KaplanMeierFitter
mortgage_kmf = KaplanMeierFitter()
mortgage_kmf.fit(duration=mortgage_df["duration"], 
        event_observed=mortgage_df["paid_off"])
<lifelines.KaplanMeierFitter:"KM_estimate", 
fitted with 100 total observations, 
18 right-censored observations>
Python 中的生存分析

使用 Kaplan-Meier 估计量

未结清房贷的中位时长是多少?

print(mortgage_kmf.median_survival_time_)
4.0

每年启动后房贷仍未结清的概率是多少?

print(mortgage_kmf.survival_function_)
          KM_estimate
timeline             
0.0          1.000000
1.0          0.983267
2.0          0.950933
3.0          0.892328
Python 中的生存分析

使用 Kaplan-Meier 估计量

启动后第 34 年仍未结清的概率是多少?

mortgage_kmf.predict(34)
0.037998
Python 中的生存分析

优点与局限

优点
  • 生存概率易于解释。
  • 适用于任意事件发生时间数据。
  • 通常是此类数据的首选起步模型。
局限
  • 生存曲线不平滑。
  • 若有 ≥50% 数据被删失,无法计算 .median_survival_time_
  • 不适合分析协变量对生存函数的影响。
Python 中的生存分析

Passons à la pratique !

Python 中的生存分析

Preparing Video For Download...