Передача предикторов в модель Кокса из списка - PullRequest
1 голос
/ 21 января 2020

Я использую довольно простую модель Кокса из пакета survminer.

surv_object <- Surv(time, event)
model <- coxph(surv_object ~ female + age + ethnicity + imd, data = df)

Мне нужно запустить несколько моделей Кокса, и для каждой модели мои предикторы меняются. Все мои предикторы хранятся в отдельном фрейме данных, таком как этот (назовем его pred_df):

> pred_df    

# A tibble: 4 x 2
       predictor    endpoint 
       <chr>        <chr>    
     1 female       Mortality
     2 age          Mortality
     3 ethnicity    Mortality
     4 imd          Mortality

Есть ли простой способ передать элементы из столбца predictor в coxph()? Примерно так:

coxph(surv_object ~ predictors, data = df)

То, что я уже пробовал:

Я попробовал довольно неуклюжий взлом по этим направлениям:

pred_vars <- pred_df %>% 
     pull(predictor) %>%                 # extract column values as a vector
     paste(collapse = " + ") %>%         # combine values in a string
     parse(text = . )                    # parse the string as an expression

model <- coxph(surv_object ~ eval(pred_vars), data = df)

R фактически понимает это и запускает модель. Но вывод не интерпретируется. Модель, кажется, работает, но не выводит отдельные предикторы, например female, age, ethnicity и imd. Вместо этого он просто выводит eval(pred_vars)

Call:
coxph(formula = Surv(time, event) ~ eval(pred_vars), data = df)

  n= 62976, number of events= 12882 
   (3287 observations deleted due to missingness)

                     coef exp(coef)  se(coef)     z Pr(>|z|)    
eval(pred_vars) 3.336e-05 1.000e+00 5.339e-06 6.249 4.14e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                exp(coef) exp(-coef) lower .95 upper .95
eval(pred_vars)         1          1         1         1

Concordance= 0.515  (se = 0.003 )
Rsquare= 0.001   (max possible= 0.989 )
Likelihood ratio test= 38.28  on 1 df,   p=6e-10
Wald test            = 39.04  on 1 df,   p=4e-10
Score (logrank) test = 39.07  on 1 df,   p=4e-10

Должен быть более простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 21 января 2020

Попробуй переформулировать.

formula <- reformulate(
  termlabels = pred_df[[1, "predictor"]],
  response = pred_df[[1, "endpoint"]]
)
coxph(formula = formula, data = df)

0 голосов
/ 21 января 2020

Вы можете сделать это в базе R с as.formula и paste(..., collapse = " + "), например ...

foo <- as.formula(paste0("Surv(time, event) ~ ", paste(pred_df$predictors, collapse = " + ")))

Результат этой строки:

> foo
Surv(time, event) ~ female + age + ethnicity + imd

И тогда вы просто передать foo на ваш звонок coxph.

...