【问题标题】:Passing predictors to a cox model from a list将预测变量从列表传递给 cox 模型
【发布时间】:2020-05-07 16:56:07
【问题描述】:

我正在运行来自 survminer 包的非常简单的 cox 模型。

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

我需要运行多个 Cox 模型,并且对于每个模型,我的预测变量都会发生变化。我将所有预测变量都存储在一个单独的数据框中,例如这样(我们称之为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 实际上理解这一点并运行模型。但是输出是无法解释的。该模型似乎运行但不输出单个预测变量,即femaleageethnicityimd。相反,它只输出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

一定有更简单的方法吗?

【问题讨论】:

  • 您是否要拟合一系列模型,每个模型只有一个 predictors 向量元素?或者您是否想一次将一个模型与所有模型一起拟合?
  • 您的代码与输出不匹配。代码为~eval(predictor_list),输出为~eval(pred_vars)。是哪个?
  • 一个模型同时包含所有模型。我找到了一个很棒的包,叫做“ezcox”来做前者。
  • 啊,好吧,那你就用as.formula(paste(..., collapse = " + ")吧。我会在几秒钟内编辑我的答案。
  • 感谢@alanocallaghan - 修复了我的代码。我注意到你也在 UoE!

标签: r list parameter-passing batch-processing cox-regression


【解决方案1】:

尝试重新制定。

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

【讨论】:

    【解决方案2】:

    您可以在 base R 中使用 as.formulapaste(..., collapse = " + ") 执行此操作,例如...

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

    该行的结果:

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

    然后您只需将foo 传递给您对coxph 的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-17
      • 2015-09-12
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2021-06-15
      • 2017-11-10
      相关资源
      最近更新 更多