Прогнозирование базовой кумулятивной опасности с использованием predict.coxph в r

#r #predict #survival-analysis #cox-regression #hazard

#r #прогнозировать #анализ выживаемости #cox-регрессия #опасность

Вопрос:

Моя цель — предсказать (предсказать кумулятивную опасность для нового наблюдения из приведенной ниже модели) значение кумулятивной опасности от временной шкалы 0 до времени начала из подобранной модели.

Я установил модель Кокса, используя 2 раза (время начала, которое не равно 0, и время окончания). Таким образом, я могу найти разницу между кумулятивной опасностью в конечное время (т. Е. кумулятивной опасностью от 0 до конечного времени, которую я уже рассчитал, используя ту же подобранную модель) и кумулятивной опасностью во время начала (т. Е. кумулятивной опасностью от 0 до конечного времени, которую я хочу рассчитать здесь), что в конечном итоге даст суммарную опасность между временем начала и окончания каждого наблюдения.

Итак, для получения ожидаемого количества событий я использовал predict(coxph(), newdata, type= "expected") .

Данные, которые я использовал, следующие:

 N <- 10^4 # population
H <- within(data.frame(start_time=runif(N, 0, 50), x1=rnorm(N, 2, 1), x2=rnorm(N, -2, 1)), {
  lp <-   0.05*x1   0.2*x2 
  Tm <- qweibull(runif(N,pweibull(start_time,shape = 7.5, scale = 84*exp(-lp/7.5)),1), shape=7.5, scale=84*exp(-lp/7.5))
  Cens1 <- 100
  event_time <- pmin(Tm,Cens1)
  status <- as.numeric(event_time == Tm)})  
  

и код для прогнозирования является:

 H$X <- rep(1,nrow(H))
D = coxph(Surv(start_time, event_time, status) ~ X, data =  H, x = TRUE )
pred2 <- predict(D, newdata = data.frame(start_time = rep(0,nrow(H)),event_time = H$start_time, status = rep(0,nrow(H)), X = rep(1, nrow(H))), type = "expected")
  

Но pred2 приводит только к значениям «NA». Может кто-нибудь указать, есть ли какая-либо ошибка в моей идее или в коде

Пожалуйста, дайте мне знать, если потребуются дополнительные разъяснения.

Комментарии:

1. Ваш код не воспроизводим. Пожалуйста, предоставьте d .

2. Извините за это, я исправил код, и я думаю, что теперь он воспроизводим. Можете ли вы попробовать это сейчас. Дайте мне знать, требуется ли еще исправление

3. Смысл модели Кокса заключается в оценке <выделено жирным шрифтом>относительных</bold> опасностей. Это всегда относительно гипотетических случаев со средним значением ковариат. Вы просите его оценить относительные опасности, с которыми не с чем сравнивать риски, поскольку ковариат нет. Если все, что вам нужно, это километровая кривая, то cph это неправильная функция.

Ответ №1:

Есть две проблемы. Во-первых, вы сталкиваетесь с проблемой, потому что при указании ~1 , что означает подгонку модели только для перехвата без коэффициентов. итак, все ваши прогнозы дадут вам одно значение?

 library(survival)
D <- coxph(Surv(H$start_time, H$event_time, H$status) ~ 1, x = TRUE )
names(D)
 [1] "loglik"            "linear.predictors" "method"           
 [4] "residuals"         "n"                 "nevent"           
 [7] "terms"             "assign"            "concordance"      
[10] "x"                 "y"                 "timefix"          
[13] "formula"           "call"  

table(predict(D))

    0 
10000
  

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

 D <- coxph(Surv(start_time,event_time,status) ~ x1 x2, data=H )
pred2 <- predict(D, newdata = data.frame(t_0 = rep(0,nrow(H)),time = H$start_time, event_M = rep(0,nrow(H)), X = rep(1, nrow(H))), type = "expected")

predict(D,newdata=data.frame(x1=runif(10,0,1),x2=runif(10,-1,1)))
        1         2         3         4         5         6         7         8 
0.3033206 0.4213120 0.3952827 0.3879701 0.4798670 0.2170032 0.3385253 0.4141698 
        9        10 
0.3690579 0.4128084 
  

Когда вы подбираете модель со всеми значениями X = 1, это дает вам все NAs, потому что уже есть перехват, который делает эту переменную избыточной. Вы можете проверить:

 H$X = 1
D <- coxph(Surv(start_time, event_time, status) ~ X,data=H)

Call:
coxph(formula = Surv(start_time, event_time, status) ~ X, data = H)

  coef exp(coef) se(coef)  z  p
X   NA        NA        0 NA NA
  

Это работает только тогда, когда X является фактической переменной в подогнанных данных, поэтому я использую пример с 2 ковариатами:

 H$X = runif(nrow(H))
D <- coxph(Surv(start_time, event_time, status) ~ X   x1,data=H)
  

И вы можете предсказать, например, установив X равным 1 и изменив x1:

 predict(D,newdata=data.frame(X=1,x1=c(0.1,0.2,0.3)))
         1          2          3 
-0.1132548 -0.1084592 -0.1036637 
  

или X в точке 2:

 predict(D,newdata=data.frame(X=2,x1=c(0.1,0.2,0.3)))
                 1          2          3 
-0.1579480 -0.1531524 -0.1483568
  

Комментарии:

1. Как и в вопросе, я хочу оценить базовую кумулятивную опасность без влияния ковариат, и когда я добавил еще одну переменную H$X = rep(1, nrow(H)) и установил модель с использованием D = coxph(Surv(start_time, event_time, status) ~ X, data = H, x = TRUE ) , код выполняется без каких-либо ошибок, но в результате я получаю значения «NA». Я не уверен, верна ли моя концепция. PS: я только что изменил код, и я думаю, что вы не столкнетесь с промежуточной ошибкой (я также объяснил, что я хочу в нем более подробно в вопросе)

2. В данных, которые вы вводите в модель, X — это все одно. Чем это отличается от подгонки модели coxph(Surv(start_time, event_time, status) ~ 1 ? Теперь вы сталкиваетесь с ошибкой, потому что у вас тоже есть перехват, что делает X избыточным

3. Можете ли вы на самом деле подогнать модель под разумные данные? Я обновил свой ответ. Похоже, что это больше не вопрос программирования. Возможно, вы можете сначала проверить это перед публикацией? socialsciences.mcmaster.ca/jfox/Books/Companion/appendices /…

Ответ №2:

Я сам нашел ответ, это просто быстрый трюк, который, я не уверен, будет работать всегда. Если я использую следующую строку перед predict() функцией:

D$coefficients["X"] <- 0

Но я получаю правильные значения, которые проверяются с помощью nelsonaalen() функции, которая не принимает время запуска (или две переменные одновременно)

Дайте мне знать, есть ли какой-либо другой правильный способ решить эту проблему.