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

library(survival)
library(purrr)

coxph_safe <- safely(coxph)

当我的唯一输入是公式和数据时,此方法非常有效,但是,如果添加其他输入(例如子集或权重),则会收到以下错误消息:

eval(substitute(subset),data,env)中的simpleError:.. 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!


编辑

与此相关的是,将方差分析应用于通过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

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

最佳答案

实际上,这与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!

关于r - 如何安全地使用coxph和子集或权重?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57291701/

10-12 17:32