首页 > 解决方案 > 如何为包含可变数量协变量的生存分析编写 tryCatch 函数?

问题描述

我正在运行一个重复超过 20,000 次的 cox 比例风险模型(根据不同基因组合的计算)。当我运行它几百或几千时,我没有收到任何错误。然而,考虑到绝对的概率,一些基因最终会(我假设)完美分离,这会阻止收敛并产生这个警告

Warning message:
In coxph.fit(X, Y, istrat, offset, init, control, weights = weights,  ... :
  Loglik converged before variable  1 ; coefficient may be infinite. 

这会杀死该功能。因此,我想做一个 tryCatch 来解决我的问题,以便这个 coxph 的结果只是一个 NA 表(与通常的输出具有相同的维度)。

**Sample DF**
time - in days
status - censored(0), failed(1)
A,B,C - covariables

time    status    A    B    C
134       0       4    5    12  
324       0       32   3    2   
93        1       4    23   54
23        1       65   9    3

这是我尝试过的:

**original coxph() in the model**
results <- coxph(Surv(time, status) ~ A + B + C, data=data)


**tryCatch version of coxph()**
coxph.conv = function(time, status, preds, data) {
  tryCatch(
    coxph(Surv(time, status) ~ paste0(preds, collapse="+"), data=data),
    warning = function(w) NA)
}

results <- coxph.conv(time, status, preds=c("A", "B", "C"), data=cox_df)

我尝试运行时收到的错误是

Error in model.frame.default(formula = Surv(time, status) ~ paste0(preds,  : 
  variable lengths differ (found for 'paste0(preds, collapse = "+")') 

如何编写这个 tryCatch 函数,以便我可以添加可变数量的协变量,它们之间有一个 +?

标签: rtry-catchsurvival-analysis

解决方案


我认为错误来自给定coxph函数的公式。尝试类似下面的方法来制作您的公式,然后将其传递给函数内部的 coxphcoxph.conv函数。

my_formula <- paste0("Surv(", time, " , " status,") ~ ", paste0(preds, collapse =" + "))

那是,

coxph.conv = function(time, status, preds, data) {

   my_formula <- paste0("Surv(", time, " , ", status,") ~ ", paste0(preds, collapse =" + "))

   # As suggested in comments by @IRTFM, you may need the following line
   my_formula <- as.formula(my_formula)

  tryCatch(
    coxph(my_formula, data=data), warning = function(w) NA)
}

推荐阅读