【问题标题】:Suppressing specific warning in coxph leads to error with cox.zph抑制 coxph 中的特定警告会导致 cox.zph 出错
【发布时间】:2020-05-26 03:10:04
【问题描述】:

我想取消在 coxph 分析中经常出现的警告。已知警告“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 调用整个函数,以记录错误等并继续下一个案例,这工作正常。但是,如果我向 tryCatch 添加警告处理程序,仅抑制此警告,则会退出函数,并且我无法确定如何从函数内发生警告的位置继续。我在警告处理程序中尝试了各种重启命令组合,但我真的不知道我在做什么,想知道是否有更好的方法?欢迎提出任何建议!

【问题讨论】:

    标签: r error-handling suppress-warnings cox-regression


    【解决方案1】:

    这是一个棘手的问题。包装器中生成的模型不起作用的原因是 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
    

    【讨论】:

    • 非常感谢。我从未听说过 match.call,更不知道如何使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2011-12-28
    • 2010-10-03
    • 2010-11-04
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多