#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
этого ?