【问题标题】:How do I use safely with coxph and subset or weights?如何安全地使用 coxph 和子集或权重?
【发布时间】:2019-07-31 13:16:52
【问题描述】:

我正在尝试将 purrr::safely 与 coxph 一起使用,以便捕获错误消息。我制作了一个安全版本的 coxph,如下所示

library(survival)
library(purrr)

coxph_safe <- safely(coxph)

当我的唯一输入是公式和数据时,这非常有效,但是,如果我添加另一个输入,例如子集或权重,我会收到以下错误消息:

simpleError in eval(substitute(subset), data, env): ..3 在不正确的上下文中使用,没有 ... 可以查看

有谁知道在需要额外输入时如何安全地申请 coxph?我也得到同样的错误,使用安静而不是安全,如果我制作一个安全版本的 lm 并指定一个子集。我正在使用 R 3.6.1 和 purrr 0.3.2。目前,我编写了一个解决方法,在应用 coxph_safe 之前对数据进行子集化,但如果有更好的解决方案,我会很高兴。

这是一个简单的例子:

test1 <- list(time=c(4,3,1,1,2,2,3), 
              status=c(1,1,1,0,1,1,0), 
              x=c(0,2,1,1,1,0,0), 
              sex=c(0,0,0,0,1,1,1))

# Without subset
coxph(Surv(time, status) ~ x, test1) # Works as expected
coxph_safe(Surv(time, status) ~ x, test1) # Works as expected

# With subset
coxph(Surv(time, status) ~ x, test1, subset = !sex) # Works as expected
coxph_safe(Surv(time, status) ~ x, test1, subset = !sex) # Error!

编辑

在相关说明中,我在将 anova 应用于通过 coxph_safe 生成的 coxph 对象时也遇到了类似的错误。

cox_1 <- coxph(Surv(time, status) ~ x, test1) # Works as expected
anova(cox_1) # Works as expected

cox_1s <- coxph_safe(Surv(time, status) ~ x, test1) # Works as expected
anova(cox_1s$result) # Error in is.data.frame(data) : ..2 used in an incorrect context, no ... to look in

据我所知,这与呼叫的存储方式有关。我可以通过覆盖调用来修复它。

cox_1$call # coxph(formula = Surv(time, status) ~ x, data = test1)
cox_1s$result$call # .f(formula = ..1, data = ..2)
cox_1s$result$call <- cox_1$call
anova(cox_1s$result) # Now works as expected

有没有更好的方法解决这个问题?

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    这实际上与purrr::safely 无关。问题是函数嵌套。考虑:

    f <- function(...) {coxph(...)}
    
    f(Surv(time, status) ~ x, test1)               # Works
    f(Surv(time, status) ~ x, test1, subset=!sex)  # Error
    

    失败的真正原因与the behavior of substitute() inside nested functions有关。 coxph() 使用 substitute(),safely() 创建了一个嵌套函数,导致了我的链接中描述的场景。

    为了解决这个问题,我们需要将coxph() 包装到一个能够正确处理非标准评估 (NSE) 的函数中:

    coxph_nse <- function(...) {eval(rlang::expr(coxph( !!!rlang::enexprs(...) )))}
    

    新函数不再遇到同样的嵌套问题,可以安全地传递给safely():

    coxph_safe <- safely(coxph_nse)
    
    coxph_safe(Surv(time, status) ~ x, test1)                     # works
    cx1 <- coxph_safe(Surv(time, status) ~ x, test1, subset=!sex) # now also works!
    
    anova(cx1$result)                                             # works as well!
    

    【讨论】:

    • 非常感谢您的详细解答和解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多