Прогнозирование относительного риска с помощью Foret.coxph, SimPH и формулы - PullRequest
0 голосов
/ 03 июля 2018

Существует отличный пост о интерпретации вывода predict.coxph(). Тем не менее, я продолжаю получать разные результаты, сравнивая выходные данные из predict.coxph, simPH и формулы для относительного риска. Поскольку моя гипотеза включает в себя квадратичный эффект, в моем примере я собираюсь включить многочлен со степенью 2.

Я использую пример из этой записи.

data("lung")

Прогнозирование относительного риска с помощью предиката ()

# Defining the quadratic predictor
lung$meal.cal_q <- lung$meal.cal^2

# conduct a cox regression with the predictor meal.cal, its quadratic version and some covariates.
cox_mod <- coxph(Surv(time, status) ~
                 ph.karno + pat.karno + meal.cal + meal.cal_q,
                 data = lung)

# a vector of fitted values to predict for
meal.cal_new <- seq(min(lung$meal.cal, na.rm= TRUE), max(lung$meal.cal, 
na.rm= TRUE), by= 1)

# a vector of fitted values to predict for, the quadratic effect
meal.cal_q_new <- meal.cal_new^2

# the length of the vector with the values to predict for
n <- length(meal.cal_new)

# a dataframe with all the values to predict for
lung_new <- data.frame(ph.karno= rep(mean(lung$ph.karno, na.rm= TRUE), n), 
                       pat.karno= rep(mean(lung$pat.karno, na.rm= TRUE), n), 
                       meal.cal= meal.cal_new, 
                       meal.cal_q = meal.cal_q_new)

# predict the relative risk
lung_new$rel_risk <- predict(cox_mod, lung_new,  type= "risk")

Прогнозирование относительного риска по формуле (см. post , упомянутый выше)

# Defining the quadratic predictor
lung$meal.cal_q <- lung$meal.cal^2

# run a cox regression with the predictor meal.cal, its quadratic version and some covariates.
cox_mod <- coxph(Surv(time, status) ~
               ph.karno + pat.karno + meal.cal + meal.cal_q,
             data = lung)

# a vector of fitted values to predict for
meal.cal_new <- seq(min(lung$meal.cal, na.rm= TRUE), max(lung$meal.cal, 
                                                     na.rm= TRUE), by= 1)

# a vector of fitted values to predict for, the quadratic effect
meal.cal_q_new <- meal.cal_new^2

# length of the vector to predict for
n <- length(meal.cal_new)

# A dataframe with the values to make the prediction for
lung_new2 <- data.frame(
             ph.karno= rep(mean(lung$ph.karno, na.rm= TRUE), n), 
             pat.karno= rep(mean(lung$pat.karno, na.rm= TRUE), n), 
             meal.cal= meal.cal_new, 
             meal.cal_q = meal.cal_q_new)

# A dataframe with the values to compare the prediction with
lung_new_mean <- data.frame(
                 ph.karno= rep(mean(lung$ph.karno, na.rm= TRUE), n), 
                 pat.karno= rep(mean(lung$pat.karno, na.rm= TRUE), n), 
                 meal.cal= rep(mean(lung$meal.cal, na.rm= TRUE), n), 
                 meal.cal_q = rep(mean(lung$meal.cal_q, na.rm= TRUE), n))

# extract the coefficients
coefCPH <- coef(cox_mod)

# make the prediction for the values of interest
cox_risk <-
exp(coefCPH["ph.karno"] * lung_new2[ , "ph.karno"] +
    coefCPH["pat.karno"] * lung_new2[ , "pat.karno"] +
    coefCPH["meal.cal"] * lung_new2[ , "meal.cal"] +
    coefCPH["meal.cal_q"] * lung_new2[ , "meal.cal_q"])

# make the predictions for the values to compare with
cox_risk_mean <-
exp(coefCPH["ph.karno"] * lung_new_mean[ , "ph.karno"] +
    coefCPH["pat.karno"] * lung_new_mean[ , "pat.karno"] +
    coefCPH["meal.cal"] * lung_new_mean[ , "meal.cal"] +
    coefCPH["meal.cal_q"] * lung_new_mean[ , "meal.cal_q"])

# calculate the relative risk
lung_new2$rel_risk <- unlist(cox_risk)/ unlist(cox_risk_mean)

Теперь график с прогнозируемым относительным риском, используя predict() и используя формулу:

ggplot(lung_new, aes(meal.cal, rel_risk)) +
       geom_smooth() +
       geom_smooth(data= lung_new2, col= "red")

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

Из-за этой путаницы я попытался решить проблему с пакетом simPH. Вот что я сделал:

# Defining the quadratic predictor
lung$meal.cal_q <- lung$meal.cal^2

# run a cox regression with the predictor, its quadratic version and some covariates.

cox_mod <- coxph(Surv(time, status) ~
                 ph.karno + pat.karno + meal.cal + meal.cal_q,
                 data = lung)

# a vector of fitted values to predict for
meal.cal_new <- seq(min(lung$meal.cal, na.rm= TRUE),
                    max(lung$meal.cal, na.rm= TRUE), by= 1)

# length of the vector to predict for
n <- length(meal.cal_new)

# A vector with the values to compare the prediction with
meal.cal_new_mean <- rep(mean(lung$meal.cal, na.rm= TRUE), n)

# running 100 simulations per predictor value with coxsimPoly
Sim <- coxsimPoly(obj= cox_mod, b = "meal.cal", pow = 2,
                  qi = "Relative Hazard",
                  Xj = meal.cal_new,
                  Xl = meal.cal_new_mean,
                  ci = .95,
                  nsim = 100,
                  extremesDrop = FALSE)

# plot the result
simGG(Sim)

Это дает пустой график с предупреждением

Warning messages:
1: In min(obj$sims[, x]) : no non-missing arguments to min; returning Inf
2: In max(obj$sims[, x]) : no non-missing arguments to max; returning -Inf

И объект Sim $ sims кажется действительно пустым.

Мои вопросы:

  1. Почему результаты из predict() и использование формулы отличаются?

  2. Почему пакет simPH не рассчитывает относительный риск?

  3. Какой метод выбрать? Моя гипотеза - квадратичный эффект в регрессии Кокса, и мне нужен график для этого предиктора с его относительным риском (по сравнению со средним значением предиктора), как в примере.

1 Ответ

0 голосов
/ 23 сентября 2018

Быстрый ответ на вопрос simPH : полиномиальные термины необходимо указать в вызове coxph с помощью функции I, например ::

cox_mod <- coxph(Surv(time, status) ~
                 ph.karno + pat.karno + meal.cal + I(meal.cal^2),
             data = lung)

(Обработка ошибок в вашем случае использования довольно плохая.)

При использовании этой модификации (и 1000 симуляций) с вашим кодом выше должно получиться что-то вроде:

enter image description here

Различия между simPH и predict

Я думаю, что различия в том, что simPH не создает доверительные интервалы вокруг преобразованных точечных оценок, таких как predict. Он рисует моделирование из многомерного нормального распределения, указанного в подобранной модели, затем показывает центральные 50% и 95% этого смоделированного распределения. Центральная линия - это просто медиана симов. Это явно отличная логика от predict. Для очень немонотонных интересующих величин, таких как эта, predict точечные оценки дают весьма существенные вводящие в заблуждение результаты по сравнению с simPH. Существует мало доказательств такой формы, основанной на 4 наблюдениях.

...