Стратифицированная модель пропорциональной регрессии рисков Кокса

Учебное пособие по созданию стратифицированной модели Кокса с использованием Python и Lifelines.

Модель пропорциональных рисков Кокса используется для изучения влияния различных параметров на мгновенную опасность, с которой сталкиваются люди или «вещи».

Модель Кокса делает следующие предположения о вашем наборе данных:

  1. Все люди или объекты в наборе данных подвержены одинаковому базовому уровню опасности.
  2. Переменные регрессии X не меняются со временем.
  3. Коэффициенты регрессии β не меняются со временем.

После обучения модели на наборе данных вы должны протестировать и проверить эти предположения с помощью обученной модели, прежде чем принимать результат модели. Если эти предположения нарушаются, вы все равно можете использовать модель Кокса после изменив его одним или несколькими из следующих способов:

  1. Стратификация: базовый уровень опасности может быть постоянным только в определенных диапазонах или для определенных значений регрессионных переменных. Например, Если предполагается, что базовый уровень риска заболевания одинаковым для 15-25-летних, 26-55-летних и для тех, кто старше 55 лет, то мы разбиваем возрастную переменную на разные страты следующим образом: ' 15–25, 26–55 и ›55. Точно так же категориальные переменные, такие как страна, являются естественными кандидатами на стратификацию. Мы можем предположить, что исходная опасность смерти в дорожно-транспортном происшествии в Германии отличается от риска для людей в Соединенных Штатах. После стратификации данных мы подбираем модель пропорциональных рисков Кокса для каждой страты. Можно также разбить набор данных на комбинации слоев, таких как [Возрастной диапазон, Страна]. Недостатком этого подхода является то, что если исходный набор данных не очень большой и хорошо сбалансирован по выбранным стратам, количество точек данных, доступных модели в каждой страте, значительно уменьшается с включением каждой переменной в лидирующую стратификацию. Если для модели не хватает количества точек данных для обучения в каждой комбинации слоев, статистическая мощность стратифицированной модели будет меньше.
  2. Изменение функциональной формы регрессионных переменных. Идея здесь проста. Возьмем, например, возраст в качестве переменной регрессии. Ваша модель Кокса предполагает, что логарифм отношения рисков между двумя людьми пропорционален возрасту. Но на самом деле журнал (коэффициент риска) может быть пропорционален возрасту², возрасту³ и т. Д. В дополнение к возрасту. В этом случае добавление термина Age² может «исправить» вашу модель. Обратите внимание, что ваша модель по-прежнему линейна по коэффициенту для возраста. Пока модель Кокса линейна по коэффициентам регрессии, мы не нарушаем предположение о линейности модели Кокса, изменяя функциональную форму переменных.
  3. Добавление терминов взаимодействия во времени. Здесь концепция не так проста и заслуживает отдельной статьи! Мы не будем вдаваться в подробности этого средства правовой защиты.

В этой статье мы увидим, как исправить непропорциональность с помощью стратификации.

Набор данных

Набор данных, который мы будем использовать для иллюстрации процедуры построения стратифицированной модели пропорциональных рисков Кокса, - это данные исследования рака легких Управления ветеранов США. Он содержит данные о 137 пациентах с запущенным неоперабельным раком легкого, которые лечились по стандартному и экспериментальному режиму химиотерапии. Их прогресс отслеживался во время исследования до тех пор, пока пациент не умер или не покинул испытание при жизни, или пока испытание не закончилось. В двух последних случаях данные считаются подвергнутыми цензуре справа. Набор данных представлен в книге Джона Д. Калбфляйша и Росса Л. Прентиса «Статистический анализ данных о времени отказа, второе издание».

Используя Python и Pandas, загрузим набор данных в DataFrame:

import pandas as pd
data_types = {'TREATMENT_TYPE':'int', 'CELL_TYPE':'category', 'SURVIVAL_IN_DAYS':'int', 'STATUS':'int', 'KARNOFSKY_SCORE':'int', 'MONTHS_FROM_DIAGNOSIS':'int', 'AGE':'int', 'PRIOR_THERAPY':'int'}
df = pd.read_csv(filepath_or_buffer='va_lung_cancer_dataset.csv', dtype=data_types)
df.head()

Вот результат:

Наши регрессионные переменные X будут следующими:

TREATMENT_TYPE: 1 = стандартный. 2 = Экспериментальный
CELL_TYPE: 1 = Плоскоклеточный, 2 = Мелкоклеточный, 3 = Адено, 4 = большой
KARNOFSKY_SCORE: мера общей производительности. пациента. 100 = Лучшее
MONTHS_FROM_DIAGNOSIS: количество месяцев после постановки диагноза рака легких, в течение которых пациент участвовал в исследовании.
ВОЗРАСТ: возраст в годах пациент, когда он был введен в испытание.
PRIOR_THERAPY: получал ли пациент какую-либо предшествующую терапию рака легкого перед включением в испытание.

Наша зависимая переменная y будет:
SURVIVAL_IN_DAYS: Указывающая, сколько дней прожил пациент после включения в след.
Переменная события:
STATUS: 1 = Dead. 0 = жив

Используя Пэтси, давайте разберем категориальную переменную CELL_TYPE на разные категории переменных столбца. Не беспокойтесь о том, что SURVIVAL_IN_DAYS находится по бокам от выражения модели. Просто чтобы осчастливить Пэтси.

from patsy import dmatrices
#Build the model expression in Patsy syntax. 
model_expr = 'SURVIVAL_IN_DAYS ~ TREATMENT_TYPE + CELL_TYPE + KARNOFSKY_SCORE + MONTHS_FROM_DIAGNOSIS + AGE + PRIOR_THERAPY + SURVIVAL_IN_DAYS + STATUS'
#Use the model expression to break out the CELL_TYPE categorical variable into 1-0 type columns
y, X = dmatrices(model_expr, df, return_type='dataframe')
#Print out the first few rows
X.head()

Обучение модели пропорциональной опасности Кокса

Затем давайте построим и обучим обычную (не стратифицированную) модель пропорциональных рисков Кокса на этих данных с помощью библиотеки Lifelines Survival Analysis:

from lifelines import CoxPHFitter

#Create the Cox model
cph_model = CoxPHFitter()
#Train the model on the data set
cph_model.fit(df=X, duration_col='SURVIVAL_IN_DAYS', event_col='STATUS')
#Print the model summary
cph_model.print_summary()

Мы видим следующую сводку модели:

Выполнение теста пропорциональной опасности

Чтобы проверить предположения о пропорциональных рисках на обученной модели, мы будем использовать метод proportional_hazard_test, предоставленный Lifelines для класса CPHFitter:

CPHFitter.proportional_hazard_test(fitted_cox_model, training_df, time_transform, precomputed_residuals)

Давайте посмотрим на каждый параметр этого метода:

fitted_cox_model: этот параметр ссылается на подобранную модель Кокса. В нашем примере fitted_cox_model=cph_model

training_df: это ссылка на набор обучающих данных. В нашем примере training_df=X

time_transform: эта переменная принимает список строк: {‘all’, ‘km’, ‘rank’, ‘identity’, ‘log’}. Каждая строка указывает функцию, применяемую к переменной y (продолжительность) модели Кокса, чтобы уменьшить чувствительность теста к выбросам в данных, то есть к экстремальным значениям продолжительности. . Вспомните, что в наборе данных VA переменная y равна SURVIVAL_IN_DAYS. 'km' применяет преобразование: (1-KaplanMeirFitter.fit (durations, event_observed). Преобразование 'rank' сопоставляет отсортированный список длительностей с набором упорядоченных натуральных чисел [1, 2, 3,…]. «Identity» сохранит длительности неизменными, а «log» преобразует значения длительности в журнал.

precomputed_residuals: вы можете предоставить тип остаточных ошибок по вашему выбору из следующих типов: Шенфельд, оценка, дельта_бета, отклонение, мартингейл и шкала дисперсии Шенфельда.

Давайте вычислим масштабированные по шкале дисперсии остатки Шенфельда модели Кокса, которую мы обучили ранее:

scaled_schoenfeld = cph_model.compute_residuals(training_dataframe=X, kind='scaled_schoenfeld')

Чтобы узнать больше об остатках Шенфельда, вы можете обратиться к следующей статье:



Теперь давайте проведем тест пропорциональных рисков:

from lifelines.statistics import proportional_hazard_test
proportional_hazard_test(fitted_cox_model=cph_model, training_df=X, time_transform='log', precomputed_residuals=scaled_schoenfeld)

Получаем такой вывод:

Статистика теста подчиняется распределению хи-квадрат (1) при нулевой гипотезе о том, что переменная следует критерию пропорциональных рисков. Согласно гипотезе Null, ожидаемое значение тестовой статистики равно нулю. Любые отклонения от нуля можно считать статистически значимыми при некотором интересующем уровне значимости, таком как 0,01, 0,05 и т. Д.

Генезис этой тестовой статистики сам по себе является увлекательной темой для изучения. Для заинтересованного читателя следующая статья является хорошей отправной точкой:



Возвращаясь к нашей маленькой проблеме, я выделил красным цветом переменные, которые не прошли тест хи-квадрат (1) с уровнем значимости 0,05 (уровень достоверности 95%).

Мы постараемся решить эти проблемы, разделив AGE, CELL_TYPE [T.4] и KARNOFSKY_SCORE.

Стратификация AGE, CELL_TYPE [T.4] и KARNOFSKY_SCORE

Мы будем стратифицировать AGE и KARNOFSKY_SCORE, разделив их на 4 группы на основе 25%, 50%, 75% и 99% квартилей. CELL_TYPE [T.4] - это категориальная индикаторная переменная (1/0), поэтому она уже разделена на две группы: 1 и 0.

Чтобы стратифицировать AGE и KARNOFSKY_SCORE, мы будем использовать метод Pandas qcut(x, q). Мы установим x для объекта серии Pandas df [‘AGE’] и df [‘KARNOFSKY_SCORE’] соответственно. q - это список точек квантиля, как показано ниже:

age_strata = pd.qcut(x=df['AGE'], q=[0, .25, .5, .75, 1.])
karnofsky_strata = pd.qcut(x=df['KARNOFSKY_SCORE'], q=[0, .25, .5, .75, 1.])

Результатом qcut(x, q) также является объект серии Pandas. Мы снова добавим столбцы age_strata и karnofsky_strata в нашу матрицу X. Вспомните, что мы вырезали X с помощью Пэтси:

X['AGE_STRATA'] = age_strata
X['KARNOFSKY_SCORE_STRATA'] = karnofsky_strata

Давайте посмотрим, как будут выглядеть стратифицированные AGE и KARNOFSKY_SCORE при отображении рядом с AGE и KARNOFSKY_SCORE соответственно:

Это AGE и AGE_STRATA:

print(X[['AGE', 'AGE_STRATA']])

А вот и расслоенный KARNOFSKY_SCORE:

print(X[['KARNOFSKY_SCORE', 'KARNOFSKY_SCORE_STRATA']])

Затем давайте добавим серии AGE_STRATA и KARNOFSKY_SCORE_STRATA в нашу матрицу X:

X['AGE_STRATA'] = age_strata
X['KARNOFSKY_SCORE_STRATA'] = karnofsky_strata

Мы отбросим AGE и KARNOFSKY_SCORE, поскольку наша стратифицированная модель Кокса не будет использовать нестратифицированные переменные AGE и KARNOFSKY_SCORE:

X = X.drop(['AGE', 'KARNOFSKY_SCORE'], axis=1)

Давайте рассмотрим столбцы в обновленной матрице X:

print(X.columns)
Index(['Intercept', 'CELL_TYPE[T.2]', 'CELL_TYPE[T.3]', 'CELL_TYPE[T.4]', 'TREATMENT_TYPE', 'MONTHS_FROM_DIAGNOSIS', 'PRIOR_THERAPY', 'SURVIVAL_IN_DAYS', 'STATUS', 'AGE_STRATA', 'KARNOFSKY_SCORE_STRATA'], dtype='object')

Теперь давайте создадим экземпляр стратифицированной модели пропорциональной опасности Кокса, передав ей AGE_STRATA, KARNOFSKY_SCORE_STRATA и CELL_TYPE [T.4]:

cph_model = CoxPHFitter(strata=['CELL_TYPE[T.4]', 'KARNOFSKY_SCORE_STRATA', 'AGE_STRATA'])

Давайте поместим модель на X. На этот раз модель будет соответствовать каждому слою в списке: [‘CELL_TYPE [T.4]’, ‘KARNOFSKY_SCORE_STRATA’, ‘AGE_STRATA’].

cph_model.fit(df=X, duration_col='SURVIVAL_IN_DAYS', event_col='STATUS')

Давайте еще раз проверим допущение о пропорциональных рисках на стратифицированной модели пропорциональных рисков Кокса:

scaled_schoenfeld = cph_model.compute_residuals(training_dataframe=X, kind='scaled_schoenfeld')
proportional_hazard_test(fitted_cox_model=cph_model, training_df=X, time_transform='log', precomputed_residuals=scaled_schoenfeld)

Получаем такой вывод:

Отметим две вещи об этом выводе:

  1. Тестовая статистика и p-значения: Как отмечалось ранее, тестовая статистика - это хи-квадрат (1), распределенный в соответствии с нулевой гипотезой H0, что переменная учитывает пропорциональную предположение об опасностях. В разделе H0 ожидаемое значение тестовой статистики равно нулю. Любые отклонения от нуля можно считать статистически значимыми при некотором приемлемом значении p. Мы видим, что все p-значения комфортно выше 0,2. Таким образом, ни одно из отклонений от нуля не является статистически значимым при уровне достоверности ≥ 80%. Поэтому мы категорически отвергаем альтернативную гипотезу и принимаем H0, что все переменные подчиняются предположению о пропорциональных рисках.
  2. Отсутствие CELL_TYPE [T.4], AGE, KARNOFSKY_SCORE: Так как мы стратифицируем эти три переменные, они больше не являются частью регрессионных переменных модели.

Нам удалось построить модель пропорциональных рисков Кокса на основе данных о раке легких VA таким образом, чтобы регрессионные переменные модели (и, следовательно, модели в целом) удовлетворяли допущениям о пропорциональных рисках.

Как интерпретировать результаты модели пропорциональных рисков Кокса

Распечатаем сводку по обучению модели:

cph_model.print_summary()

Мы видим, что модель учитывала следующие переменные для стратификации:

Частичное логарифмическое правдоподобие модели составляет -137,76. Это число будет полезно, если мы хотим сравнить степень соответствия модели с другой версией той же модели, стратифицированной таким же образом, но с меньшим или большим количеством переменных. Модель с увеличенным Partial Log-LL будет иметь лучшее соответствие.

Теперь давайте посмотрим на коэффициенты:

На выходе показаны как коэффициент, так и его показатель степени.

CELL_TYPE [T.2] - это индикаторная переменная (1 или 0), которая показывает, относятся ли опухолевые клетки пациента к типу «малые клетки». Коэффициент 0,92 интерпретируется следующим образом:

Если опухоль относится к типу «малая клетка», мгновенная опасность смерти в любой момент времени t увеличивается на (2,51–1) * 100 = 151%.

TREATMENT_TYPE - еще одна индикаторная переменная со значениями 1 = СТАНДАРТНОЕ ЛЕЧЕНИЕ и 2 = ЭКСПЕРИМЕНТАЛЬНОЕ ЛЕЧЕНИЕ. Мы интерпретируем коэффициент для TREATMENT_TYPE следующим образом:

Пациенты, получавшие экспериментальное лечение, испытали (1,34–1) * 100 = 34% увеличение мгновенного риска смерти по сравнению с пациентами, получавшими стандартное лечение.

Аналогичным образом мы можем интерпретировать влияние других коэффициентов.

Теперь давайте посмотрим на p-значения и доверительные интервалы для различных регрессионных переменных.

Вот p-значения:

P-значения говорят нам, что CELL_TYPE [T.2] и CELL_TYPE [T.3] очень важны. Их p-значение меньше 0,005, что подразумевает статистическую значимость при (100–0,005) = 99,995% или более высоком уровне достоверности. Точно так же PRIOR_THERAPY является статистически значимым при уровне достоверности ›95%. P-значения TREATMENT_TYPE и MONTH_FROM_DIAGNOSIS составляют ›0,25. Таким образом, мы не можем сказать, что коэффициенты статистически отличаются от нуля даже при уровне достоверности (1–0,25) * 100 = 75%. Следовательно, нам не следует слишком углубляться в влияние TREATMENT_TYPE и MONTHS_FROM_DIAGNOSIS на пропорциональную степень опасности. Этот вывод также подтверждается, если вы посмотрите, насколько велики их стандартные ошибки как пропорция значения коэффициента и, соответственно, широкие доверительные интервалы TREATMENT_TYPE и MONTH_FROM_DIAGNOSIS.

Резюме

  • Модель пропорциональных рисков Кокса используется для изучения влияния различных параметров на мгновенную опасность, с которой сталкиваются люди или «вещи».
  • Модель Кокса предполагает, что все участники исследования испытывают одинаковый исходный уровень опасности, а переменные регрессии и их коэффициенты не зависят от времени.
  • Если ваша модель не соответствует этим предположениям, вы можете «исправить» ситуацию, используя один или несколько из следующих методов для переменных регрессии, не прошедших тест пропорциональных рисков: 1) Стратификация переменных регрессии, 2) Изменение функциональной формы переменные регрессии и 3) Добавление условий взаимодействия времени к переменным регрессии.

Ссылки, цитаты и авторские права

Набор данных

Набор данных по раку легких VA взят из следующего источника:
http://www.stat.rice.edu/~sneeley/STAT553/Datasets/survivaldata.txt

Ссылки на статьи и книги:

Кокс, Д. Р. Модели регрессии и таблицы продолжительности жизни. Журнал Королевского статистического общества. Серия Б (Методологическая) 34, вып. 2 (1972): 187–220. По состоянию на 20 ноября 2020 г. http://www.jstor.org/stable/2985181.

Пак, Сунхи и Хендри, Дэвид Дж. (2015) Переоценка остаточных критериев Шенфельда для пропорциональных рисков в анализе истории политических событий . Американский журнал политических наук, 59 ( 4). 1072–1087. ISSN 0092–5853. Http://eprints.lse.ac.uk/84988/

Грамбш, Патриция М. и Терри М. Терно. Тесты и диагностика пропорциональных опасностей на основе взвешенных остатков. Биометрика, т. 81, нет. 3, 1994, стр. 515–526. JSTOR, www.jstor.org/stable/2337123. Проверено 5 декабря 2020 г.

Терно, Терри М. и Патриция М. Грамбш. « Моделирование данных о выживаемости: расширение модели Кокса ». 2000. Нью-Йорк: Springer

Маккаллах П., Нелдер Джон А., Обобщенные линейные модели, 2-е изд., CRC Press, 1989, ISBN 0412317605, 9780412317606

Изображения

Все изображения в этой статье являются собственностью Sachin Date в разделе CC-BY-NC-SA, если под изображением не указаны другой источник и авторские права.

Статьи по Теме





Спасибо за внимание! Если вам понравилась эта статья, следуйте за мной, чтобы получать советы, инструкции и советы по программированию по регрессии и анализу временных рядов.