我正在尝试对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/