我正在尝试与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
有没有更好的办法解决这个问题?
答案 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()