Какие варианты в модели пропорциональной регрессии рисков, когда остатки Шенфельда не хороши?


15

Я делаю пропорциональную регрессию рисков Кокса в R, используя coxphмножество переменных. Остатки Мартингейла выглядят великолепно, а остатки Шенфельда отлично подходят для ПОЧТИ всех переменных. Есть три переменные, чьи остатки Шенфельда не плоские, и природа переменных такова, что имеет смысл, что они могут изменяться со временем.

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

  In fitter(X, Y, strats, offset, init, control, weights = weights,  :
  Ran out of iterations and did not converge

Я работаю с почти 1000 точками данных и работаю с полдюжиной переменных со многими факторами в каждой, поэтому создается впечатление, что мы раздвигаем границы того, как эти данные можно разрезать и нарезать кубиками. К сожалению, все более простые модели, которые я пробовал с меньшим количеством включенных переменных, явно хуже (например, остатки Шенфельда более грубые для большего количества переменных).

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

* Один - непрерывный, один - целое число с диапазоном более 100, а другой - целое число с диапазоном 6. Возможно, биннинг?


2
Как насчет использования расширенной модели Кокса с временным взаимодействием для зависящих от времени переменных?
Кирк

А как насчет рассмотрения опции ковариат по времени (например, -tvc- в Stata)?
Карло Лаззаро

Ответы:


1

Самый элегантный способ - использовать параметрическую модель выживания (Gompertz, Weibull, Exponential, ...), если у вас есть представление о том, как может выглядеть базовая опасность.

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

Для R см. Здесь: http://cran.r-project.org/web/packages/survival/vignettes/timedep.pdf


1

Пара идей -

1) Попробуйте подход моделирования Ройстона-Пармара, например, http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0047804 и ссылки в нем. У нас были полезные результаты с этим.

2) Центрирование и стандартизация непрерывных переменных могут быть полезны численно.

3) Во многих моделях с факторами с большим количеством уровней есть несколько уровней, где в основном нет данных. Объединение уровней, чтобы удалить их, но основанное на хороших основных критериях, может быть очень полезным.

Удачи!


1

Если использование взаимодействия с основным временем не работает, вы можете попробовать пошаговые функции (для получения дополнительной информации см. Виньетку Therneau 2016 г. ).

Шаговые функции стратифицируют по определенным коэффициентам через определенные интервалы. После того, как вы видите свои построенные остатки Шенфельда для проблемных ковариат (т.е. plot(cox.zph(model.coxph))), вам нужно визуально проверить, где линии меняют угол. Попробуйте найти одну или две точки, в которых бета выглядит заметно иначе. Предположим , что это произошло во время 10 и 20. Таким образом , мы будем создавать данные , используя survSplit()из survivalпакета , который будет создан фрейм данных для модели конкретных данных группирования в указанных случаях:

step.data <- survSplit(Surv(t1, t2, event) ~ 
                      x1 + x2,
                      data = data, cut = c(10, 20), episode = "tgroup")

А затем запустите cox.phмодель с strataфункцией как взаимодействия с проблемными переменными (как и при взаимодействии со временем, не добавляйте основной эффект для времени или слоев):

> model.coxph2 <- coxph(Surv(t1, t2, event) ~ 
                          x1 + x2:strata(tgroup), data = step.data)

И это должно помочь.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.