Визуализация модели Каплана–Майера

Анализ выживаемости в Python

Shae Wang

Senior Data Scientist

Как построить кривую выживаемости Каплана–Майера?

Учебные данные при $n=5$:

duration observed
2 1
5 0
3 1
5 1
2 0

Шаг 1: Упорядочьте данные по возрастанию. При совпадении значений цензурированные наблюдения идут после нецензурированных.

Шаг 2: Для каждого $t_i$ вычислите $d_i$, $n_i$ и $\big(1-\frac{d_i}{n_i}\big)$

Шаг 3: Для каждого $t_i$ перемножьте $\big(1-\frac{d_i}{n_i}\big)$ с $\big(1-\frac{d_{i-1}}{n_{i-1}}\big)$, $\big(1-\frac{d_{i-2}}{n_{i-2}}\big)$, ... , $\big(1-\frac{d_0}{n_0}\big)$

Анализ выживаемости в Python

Как построить кривую выживаемости Каплана–Майера?

Шаг 1: Упорядочьте длительности по возрастанию. При совпадении значений цензурированные наблюдения идут после нецензурированных.

duration
2
5+
3
5
2+

Для обозначения цензурированных данных используйте знак «+»: 2, 5+, 3, 5, 2+

Анализ выживаемости в Python

Как построить кривую выживаемости Каплана–Майера?

Шаг 1: Упорядочьте длительности по возрастанию. При совпадении значений цензурированные наблюдения идут после нецензурированных.

$t_i$
2, 2+
3
5, 5+
Анализ выживаемости в Python

Как построить кривую выживаемости Каплана–Майера?

Шаг 2: Для каждого $t_i$ вычислите $d_i$, $n_i$ и $\big(1-\frac{d_i}{n_i}\big)$

$t_i$
2, 2+
3
5, 5+
Анализ выживаемости в Python

Как построить кривую выживаемости Каплана–Майера?

Шаг 2: Для каждого $t_i$ вычислите $d_i$, $n_i$ и $\big(1-\frac{d_i}{n_i}\big)$

$t_i$ $d_i$
2, 2+ 1
3 1
5, 5+ 1
Анализ выживаемости в Python

Как построить кривую выживаемости Каплана–Майера?

Шаг 2: Для каждого $t_i$ вычислите $d_i$, $n_i$ и $\big(1-\frac{d_i}{n_i}\big)$

$t_i$ $d_i$ $n_i$
2, 2+ 1 5
3 1 3
5, 5+ 1 2
Анализ выживаемости в Python

Как построить кривую выживаемости Каплана–Майера?

Шаг 2: Для каждого $t_i$ вычислите $d_i$, $n_i$ и $\big(1-\frac{d_i}{n_i}\big)$

$t_i$ $d_i$ $n_i$ $\big(1-\frac{d_i}{n_i}\big)$
2, 2+ 1 5 $4/5$
3 1 3 $2/3$
5, 5+ 1 2 $1/2$
Анализ выживаемости в Python

Как построить кривую выживаемости Каплана–Майера?

Шаг 3: Для каждого $t_i$ перемножьте $\big(1-\frac{d_i}{n_i}\big)$ с $\big(1-\frac{d_{i-1}}{n_{i-1}}\big)$, $\big(1-\frac{d_{i-2}}{n_{i-2}}\big)$, ... , $\big(1-\frac{d_0}{n_0}\big)$

$t_i$ $d_i$ $n_i$ $\big(1-\frac{d_i}{n_i}\big)$ $S(t_i)$
2, 2+ 1 5 4/5 4/5 = 0,8
3 1 3 2/3 4/5 $\cdot$ 2/3 = 0,53
5, 5+ 1 2 1/2 4/5 $\cdot$ 2/3 $\cdot$ 1/2 = 0,27
Анализ выживаемости в Python

Как построить кривую выживаемости Каплана–Майера?

$t_i$ $d_i$ $n_i$ $\big(1-\frac{d_i}{n_i}\big)$ $S(t_i)$
2, 2+ 1 5 $4/5$ 0,8
3 1 3 $2/3$ 0,53
5, 5+ 1 2 $1/2$ 0,27

Кривая Каплана–Майера, построенная по таблице.

Анализ выживаемости в Python

Интерпретация кривой выживаемости

Кривая Каплана–Майера, построенная по таблице.

  • Вероятности выживаемости в каждый момент времени от 0 до 5.

  • Распространённое заблуждение: если кривая опускается до 0, ни один субъект не выжил.

  • Кривая достигает нуля, если последнее наблюдение не является цензурированным (истинная длительность события известна).
Анализ выживаемости в Python

Построение кривой выживаемости Каплана–Майера

from lifelines import KaplanMeierFitter
import matplotlib.pyplot as plt

kmf = KaplanMeierFitter()
kmf.fit(durations, event_observed)
kmf.survival_function_.plot()
plt.show()
Анализ выживаемости в Python

Пример задачи об ипотеке

Имя DataFrame: mortgage_df

id duration paid_off
1 25 0
2 17 1
3 5 0
... ... ...
100 30 1
from lifelines import KaplanMeierFitter
from matplotlib import pyplot as plt
mortgage_kmf = KaplanMeierFitter()
mortgage_kmf.fit(duration=mortgage_df["duration"], 
        event_observed=mortgage_df["paid_off"])
mortgage_kmf.survival_function_.plot()
Анализ выживаемости в Python

Пример задачи об ипотеке

plt.show()

Визуализация кривой выживаемости для задачи об ипотеке.

Анализ выживаемости в Python

Доверительный интервал кривой выживаемости

mortgage_kmf.plot_survival_function()
plt.show()

Визуализация кривой выживаемости с доверительным интервалом для задачи об ипотеке.

Анализ выживаемости в Python

Зачем нужен доверительный интервал?

  • Способ оценить неопределённость каждой точечной оценки вероятности выживаемости
  • Широкий доверительный интервал означает меньшую уверенность — как правило, из-за малого объёма выборки
  • Узкий доверительный интервал означает большую уверенность — как правило, из-за большого объёма выборки
Анализ выживаемости в Python

Способы построения кривой выживаемости Каплана–Майера

Отображение точечных оценок функции выживаемости в виде непрерывной линии.

kmf.survival_function_.plot()
plt.show()

График функции выживаемости в виде непрерывной линии.

Отображение функции выживаемости в виде ступенчатой линии без доверительного интервала.

kmf.plot(ci_show=False)
plt.show()

График функции выживаемости в виде ступенчатой линии.

Анализ выживаемости в Python

Способы построения кривой выживаемости Каплана–Майера

Отображение функции выживаемости в виде ступенчатой линии с доверительным интервалом.

kmf.plot()
plt.show()

График функции выживаемости в виде ступенчатой линии с доверительным интервалом.

Ещё один способ...

kmf.plot_survival_function()
plt.show()
Анализ выживаемости в Python

Давайте потренируемся!

Анализ выживаемости в Python

Preparing Video For Download...