Какое значение по умолчанию для функции преобразования времени в команде coxph?
Краткое введение:
Модель пропорциональных рисков Кокса (PH) может быть оценена с coxph
функция survival
пакет. Очевидное требование для получения разумных результатов от модели этого типа состоит в том, что опасности пропорциональны, то есть они постоянны во времени. Если это не относится к определенной переменной, ее можно решить, изменяя коэффициент времени этой переменной. (Теперь это технически расширенная модель Кокса.) Это делается путем добавления tt()
к этой переменной и указав функцию с течением времени (см. vignette("timedep", package = "survival")
страница 19+).
Вопрос:
Какая функция используется, если tt()
используется без указания функции?
Вот пример:
library(survival)
data(lung)
cox_model <- coxph(Surv(time, status) ~ age + sex + ph.karno, data = lung)
cox_model_ph <- cox.zph(cox_model)
# rho chisq p
# age 0.00701 0.00871 0.92566
# sex 0.12249 2.42336 0.11954
# ph.karno 0.23135 8.24167 0.00409
# GLOBAL NA 11.54750 0.00911
Мы видим, что ph.karno
нарушает предположение PH (малое значение p), поэтому добавить tt()
:
cox_model_tt <- coxph(Surv(time, status) ~ age + sex + tt(ph.karno), data = lung)
cox_model_tt_ph <- cox.zph(cox_model_tt)
# rho chisq p
# age -0.00907 0.0142 0.9052
# sex 0.12844 2.7270 0.0987
# tt(ph.karno) 0.11643 2.3846 0.1225
# GLOBAL NA 5.0220 0.1702
Теперь предположение PH выполнено, но я понятия не имею, что tt()
функция на самом деле сделал. Я попробовал некоторые часто используемые функции, такие как tt = function(x, t, ...) x*t
, tt = function(x, t, ...) x + t
, tt = function(x, t, ...) x*log(t)
, Но все дали разные результаты (и не смогли исправить нарушение PH).
Любая помощь приветствуется.
1 ответ
Просматривая код для coxph
Я думаю, если бы я нашел это. Вы не предложили никакого значения для параметра 'tt', поэтому я думаю, что это будет выполнено:
if (is.null(tt)) {
tt <- function(x, time, riskset, weights) {
obrien <- function(x) {
r <- rank(x)
(r - 0.5)/(0.5 + length(r) - r)
}
unlist(tapply(x, riskset, obrien))
}
И вот экспериментальное подтверждение:
> cox_model_OB <- coxph(Surv(time, status) ~ age + sex + tt(ph.karno), data = lung, tt= function(x, time, riskset, weights) {
+ obrien <- function(x) {
+ r <- rank(x)
+ (r - 0.5)/(0.5 + length(r) - r)
+ }
+ unlist(tapply(x, riskset, obrien))
+ }
+ )
> ( cox_model_tt_ph <- cox.zph(cox_model_tt) )
rho chisq p
age -0.00907 0.0142 0.9052
sex 0.12844 2.7270 0.0987
tt(ph.karno) 0.11643 2.3846 0.1225
GLOBAL NA 5.0220 0.1702
Мне интересно, было ли это намеренно. Я подозреваю, что это код, оставленный во время сеанса разработки. Я подозреваю, что Терно намеревается, что отказ от 'tt-функции должен вызвать хотя бы предупреждение, но, вероятно, предпочел бы ошибку. Так что это было предположение, и я обнаружил, что ошибся, просматривая виньетки и обнаружив, что это предназначено: "Это основано на том факте, что входные аргументы для tt() упорядочены по номеру события или набору риска. Эта функция используется по умолчанию, если в вызове coxph нет аргумента tt, но в формуле модели есть термины tt (это позволило мне отказаться от функции Survobrien)." см. стр. 23 "Использование зависимых от времени ковариат и зависящих от времени коэффициентов в модели Кокса" из текущей справочной страницы Индекса пакета поддержки, ссылающейся на виньетки.