为“生存:: surv()编写包装器功能,默认值
我最近一直在使用具有预先指定的列名称以及对生存数据编码方式的某些期望来构建的CDISC数据。
我想为使用CDISC格式的结构化数据编写一个生存:: surv()
的包装器。我的功能在大多数情况下都可以使用,但是我无法将其与生存:: coxph()
一起使用。
如何获得我的 surv()
包装器函数以使用默认值并在 coxph()
中工作?以下是使用 visr :: adtte
数据集的示例,以CDISC格式。除最后一个示例外,所有示例都没有问题。
Surv_CDISC <- function(AVAL, CNSR) {
# set default values if not passed by user -----------------------------------
if (missing(AVAL) && exists("AVAL", envir = rlang::caller_env()))
AVAL <- get("AVAL", envir = rlang::caller_env())
else if (missing(AVAL))
stop("Default 'AVAL' value not found. Specify argument in `Surv_CDISC(AVAL=)`.")
if (missing(CNSR) && exists("CNSR", envir = rlang::caller_env()))
CNSR <- get("CNSR", envir = rlang::caller_env())
else if (missing(CNSR))
stop("Default 'CNSR' value not found. Specify argument in `Surv_CDISC(CNSR=)`.")
# pass args to `survival::Surv()` --------------------------------------------
survival::Surv(time = AVAL, event = 1 - CNSR)
}
# passing the arguments, everything works
with(visR::adtte, Surv_CDISC(AVAL = AVAL, CNSR = CNSR)) |> head()
#> [1] 2 3 3 28+ 58 46+
# letting the arguments use default value, everything still works
with(visR::adtte, Surv_CDISC()) |> head()
#> [1] 2 3 3 28+ 58 46+
# using function in model.frame() and defining argument values, everything works
model.frame(Surv_CDISC(AVAL, CNSR) ~ SEX, data = visR::adtte) |> head(n = 2)
#> Surv_CDISC(AVAL, CNSR) SEX
#> 1 2 F
#> 2 3 M
# using function in model.frame() with default arguments, everything works
model.frame(Surv_CDISC() ~ SEX, data = visR::adtte) |> head(n = 2)
#> Surv_CDISC() SEX
#> 1 2 F
#> 2 3 M
# using function in survfit() and defining argument values, everything works
survival::survfit(Surv_CDISC(AVAL, CNSR) ~ SEX, data = visR::adtte)
#> Call: survfit(formula = Surv_CDISC(AVAL, CNSR) ~ SEX, data = visR::adtte)
#>
#> n events median 0.95LCL 0.95UCL
#> SEX=F 143 80 64 47 96
#> SEX=M 111 72 41 30 57
# using function in survfit() with default arguments, everything works
survival::survfit(Surv_CDISC() ~ SEX, data = visR::adtte)
#> Call: survfit(formula = Surv_CDISC() ~ SEX, data = visR::adtte)
#>
#> n events median 0.95LCL 0.95UCL
#> SEX=F 143 80 64 47 96
#> SEX=M 111 72 41 30 57
# using function in coxph() and defining argument values, everything works
survival::coxph(Surv_CDISC(AVAL, CNSR) ~ SEX, data = visR::adtte)
#> Call:
#> survival::coxph(formula = Surv_CDISC(AVAL, CNSR) ~ SEX, data = visR::adtte)
#>
#> coef exp(coef) se(coef) z p
#> SEXM 0.3147 1.3699 0.1626 1.935 0.053
#>
#> Likelihood ratio test=3.71 on 1 df, p=0.05412
#> n= 254, number of events= 152
# DOES NOT WORK TRYING TO RELY ON DEFAULT VALUES
survival::coxph(Surv_CDISC() ~ SEX, data = visR::adtte)
#> Error in x[[2]]: subscript out of bounds
由
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这看起来像是
生存
软件包中的一个错误,或者可能误用了(我对内部设备并不那么熟悉)。编辑以添加评论:
我认为以下分析是错误的。更仔细地读取代码,我认为
生存
软件包中的当前代码除非您在公式中使用显式surch(aval,cnsr)
,否则不会可靠地工作。这是似乎有效的分析,但我不信任它:
问题是
生存::: terms.inner
专门寻找名为surch
的函数,此处:。由于您的函数具有不同的名称,因此它并没有处理好像是同一件事。您也可以通过将函数命名
surch
来解决此问题。当我这样做时,事情似乎有效。当然,当您想要原始surv
而没有生存>:
前缀时,这可能会导致其他地方的问题,但我不知道一种解决这个问题的方法。我仍然担心使用
caller_env()
。这是我创建您的假surv
的方式:这比您的概括不多,但我认为这更安全。
This looks like a bug in the
survival
package, or maybe a mis-use of it (I'm not so familiar with the internals).EDITED TO ADD A COMMENT:
I think the analysis below is wrong. Reading the code more carefully, I think the current code in the
survival
package won't work reliably unless you use the explicitSurv(AVAL, CNSR)
in the formula.HERE'S THE ANALYSIS THAT APPEARED TO WORK, BUT I DON'T TRUST IT:
The problem is that
survival:::terms.inner
looks specifically for a function namedSurv
, here: https://github.com/therneau/survival/blob/b5238a42867a931954cf222b871a7b3a1c2fcd24/R/xtras.R#L65 . Since your function has a different name, it's not handled as if it is the same thing.You could fix this by naming your function
Surv
as well. When I do that, things appear to work. Of course, this may cause problems elsewhere when you want the originalSurv
without thesurvival::
prefix, but I don't know a way to fix that.I'd still worry about using
caller_env()
. Here's how I'd create your fakeSurv
:This is less general than yours, but I think it's safer.