如何安全地使用Coxph和子集或权重?

时间:2019-07-31 13:16:52

标签: r purrr

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

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

1 个答案:

答案 0 :(得分:0)

这实际上与testdata <- read.table(text = " History Survive 1 111111111111111211111111111111111111 FALSE 2 111111111111111110000000000000000000 TRUE 3 000111222111111111111111111111110000 FALSE 4 111111111111111111111111100000000000 TRUE 5 011231111111111111111111111111111111 FALSE 6 111111234111111111111111110000000000 TRUE", header = TRUE, stringsAsFactors = FALSE, colClasses = c("numeric", "character", "logical")) 没有关系。问题是函数嵌套。考虑:

purrr::safely

其失败的真正原因与the behavior of substitute() inside nested functions有关。 f <- function(...) {coxph(...)} f(Surv(time, status) ~ x, test1) # Works f(Surv(time, status) ~ x, test1, subset=!sex) # Error 使用coxph(),而substitute()创建一个嵌套函数,导致我的链接中所述的情况。

要解决此问题,我们需要将safely()包装到可以正确处理非标准评估(NSE)的函数中:

coxph()

新函数不再遇到相同的嵌套问题,可以安全地传递给coxph_nse <- function(...) {eval(rlang::expr(coxph( !!!rlang::enexprs(...) )))}

safely()