Подавление специфического c предупреждения в coxph приводит к ошибке с cox.zph - PullRequest
0 голосов
/ 10 февраля 2020

Я хотел бы подавить предупреждение, которое часто возникает при анализе Кокса. Известно, что предупреждение «Loglik сходится до переменной 1; коэффициент может быть бесконечным» является сверхчувствительным, и у меня есть другие способы проверки результатов. Моей первой попыткой было обернуть coxph в вызывающий обработчик:

coxMW <- function(...){
  withCallingHandlers(coxph(...),
                      warning=function(w) {
                        if (grepl("coefficient may be infinite", w$message))
                          invokeRestart("muffleWarning")
                      })
}

Это дает ожидаемые ответы

library(survival)
coxObj1 <- coxph(Surv(futime, fustat) ~ rx, data=ovarian)
coxObj2 <- coxMW(Surv(futime, fustat) ~ rx, data=ovarian)
summary(coxObj1)
summary(coxObj2))

Однако, когда я пытаюсь использовать результат в cox.zph:

zph1 <- cox.zph(coxObj1)
zph2 <- cox.zph(coxObj2)

Второй случай с использованием новой функции приводит к следующему: «Ошибка в is.data.frame (data): ..2 используется в неверном контексте, нет ... искать в»

Я сейчас изо всех сил пытаюсь найти способ подавить это конкретное предупреждение. Я много раз использую coxph внутри большой функции и не очень хочу заключать каждый вызов coxph в withCallingHandlers. Вся функция вызывается с помощью tryCatch с обработчиком ошибок, чтобы зарегистрировать ошибку et c. и перейдем к следующему делу, которое работает нормально. Однако, если я добавлю обработчик предупреждений в tryCatch, подавляя только это предупреждение, выход из функции, и я не могу понять, как продолжить с того места, где произошло предупреждение внутри функции. Я пробовал различные комбинации команд перезапуска в обработчике предупреждений, но я действительно не знаю, что делаю, и задаюсь вопросом, есть ли лучший подход? Любые предложения приветствуются!

1 Ответ

0 голосов
/ 10 февраля 2020

Это хитрый. Причина, по которой модель, создаваемая в вашей оболочке, не работает, заключается в том, что объект coxph ведет запись вызова, который его произвел, который сам по себе cox.zph использует повторно. Когда вы используете ... в своей оболочке, они сохраняются в качестве параметров вызова без подстановки. Когда этот вызов передается на cox.zph, он не знает, как обращаться с параметрами ....

Это можно увидеть, посмотрев call объекты, хранящиеся в ваших двух моделях:

coxObj1$call
#> coxph(formula = Surv(futime, fustat) ~ rx, data = ovarian)
coxObj2$call
#> coxph(formula = ..1, data = ..2)

Итак, ваша обертка должна подставить ... в слот call модели:

coxMW <- function(...){
  withCallingHandlers(result <- coxph(...),
                      warning=function(w) {
                        if (grepl("coefficient may be infinite", w$message))
                          invokeRestart("muffleWarning")
                      })

  cox_call      <- match.call()   # Contains the substituted parameters we want
  cox_call[[1]] <- quote(coxph)   # Change the wrapper's name to coxph in the call

  if(names(cox_call)[2] == "") names(cox_call)[2] <- "formula"
  result$call <- cox_call
  return(result)
}

Так что теперь вы можете сделать:

coxObj2 <- coxMW(Surv(futime, fustat) ~ rx, data=ovarian)
zph2    <- cox.zph(coxObj2)
zph2
#>        chisq df   p
#> rx      2.68  1 0.1
#> GLOBAL  2.68  1 0.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...