Как написать функцию tryCatch для анализа выживаемости, которая включает переменное число ковариат?

#r #try-catch #survival-analysis

Вопрос:

Я использую модель пропорциональной опасности Кокса, которая повторяется более 20 000 раз (с учетом расчета на основе различных комбинаций генов). Когда я запускаю его на несколько сотен или тысяч, я не получаю ошибок. Однако, учитывая явную вероятность, некоторые из генов заканчиваются (я полагаю) идеальным разделением, которое предотвращает конвергенцию и вызывает это предупреждение

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

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

 **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, чтобы я мог добавить переменное число ковариаблей с между ними?

Ответ №1:

Я думаю, что ошибка исходит из формулы, заданной coxph функцией. Попробуйте что-то подобное приведенному ниже, чтобы создать свою формулу, а затем передайте ее функции coxph внутри coxph.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)
}
 

Комментарии:

1. Обычно нужно было бы обернуть as.formula вокруг текстового объекта, чтобы получить формулу, но, может быть, coxph принудит к формуле? Я мог бы увидеть преимущества такой стратегии, потому что тогда она обеспечит правильность среды для формулы, но это не типично для авторов пакетов в R, чтобы сделать это. Вы действительно проверили свою догадку?

2. @IRTFM, с которым я тестировал lm ; он принуждает строку к формуле. Я не проверял с coxph помощью . Я должен был добавить «как.формула» вместо того, чтобы предполагать coxph , что это тоже сработает.

3. Интересный. Интересно, не могли бы вы использовать substitute вместо paste этого ?