将预测变量从列表传递到考克斯模型
Passing predictors to a cox model from a list
我正在 运行从 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)
我已经尝试过的:
我已经按照这些思路尝试了一个相当笨拙的 hack:
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 实际上理解这一点,运行s 模型。但输出是无法解释的。该模型似乎 运行 但不输出单个预测变量,即 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
一定有更简单的方法吗?
尝试重新制定。
formula <- reformulate(
termlabels = pred_df[[1, "predictor"]],
response = pred_df[[1, "endpoint"]]
)
coxph(formula = formula, data = df)
您可以使用 as.formula
和 paste(..., collapse = " + ")
在 base R 中执行此操作,例如...
foo <- as.formula(paste0("Surv(time, event) ~ ", paste(pred_df$predictors, collapse = " + ")))
该行的结果:
> foo
Surv(time, event) ~ female + age + ethnicity + imd
然后您只需将 foo
传递给您对 coxph
的调用。
我正在 运行从 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)
我已经尝试过的:
我已经按照这些思路尝试了一个相当笨拙的 hack:
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 实际上理解这一点,运行s 模型。但输出是无法解释的。该模型似乎 运行 但不输出单个预测变量,即 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
一定有更简单的方法吗?
尝试重新制定。
formula <- reformulate(
termlabels = pred_df[[1, "predictor"]],
response = pred_df[[1, "endpoint"]]
)
coxph(formula = formula, data = df)
您可以使用 as.formula
和 paste(..., collapse = " + ")
在 base R 中执行此操作,例如...
foo <- as.formula(paste0("Surv(time, event) ~ ", paste(pred_df$predictors, collapse = " + ")))
该行的结果:
> foo
Surv(time, event) ~ female + age + ethnicity + imd
然后您只需将 foo
传递给您对 coxph
的调用。