在 R 公式中使用 package::function 会给出不同的结果(特别是 coxph 内部的 survival::strata)

Using package::function inside formula in R gives different results (specifically survival::strata inside coxph)

提问人:AP30 提问时间:5/11/2023 更新时间:5/11/2023 访问量:26

问:

我认为以下两个公式调用应该是等效的。

install.packages("survival")
library(survival)

型号 1

coxph(Surv(futime, fustat) ~ age + strata(rx), data=ovarian)

Call:
coxph(formula = Surv(futime, fustat) ~ age + strata(rx), data = ovarian)

       coef exp(coef) se(coef)     z       p
age 0.13735   1.14723  0.04741 2.897 0.00376

Likelihood ratio test=12.69  on 1 df, p=0.0003678
n= 26, number of events= 12 

型号 2

coxph(Surv(futime, fustat) ~ age + survival::strata(rx), data=ovarian)

Call:
coxph(formula = Surv(futime, fustat) ~ age + survival::strata(rx), 
    data = ovarian)

                             coef exp(coef) se(coef)      z       p
age                       0.14733   1.15873  0.04615  3.193 0.00141
survival::strata(rx)rx=2 -0.80397   0.44755  0.63205 -1.272 0.20337

Likelihood ratio test=15.89  on 2 df, p=0.0003551
n= 26, number of events= 12 

然而,事实并非如此。第二个模型专门使用 “::” 运算符引用 'strata',将其视为模型中的固定效应变量,而不是将模型单独拟合在 'strata' 水平内。我不知道这是否是:

A) 在 R 的公式中使用“package::function”类型调用时出现问题,或者 B) 生存包和命名空间/依赖项的问题

我想使用对 Model 2 的调用,因为我正在构建一个包,并且不想在加载我的包时附加整个生存包(很大)。

对此的任何帮助将不胜感激。

依赖项命名 空间 R-Package 生存

评论


答:

3赞 bretauv 5/11/2023 #1

在 中,有以下几行:coxph()

special <- c("strata", "tt", "frailty", "ridge", "pspline")
tform$formula <- if (missing(data)) 
  terms(formula, special)
else terms(formula, special, data = data)

因此,在第一种情况下,正确检测,但在第二种情况下则不然。我们可以通过您的示例看到这一点:coxphstrata

library(survival)

formula1 <- Surv(futime, fustat) ~ age + strata(rx)
formula2 <- Surv(futime, fustat) ~ age + survival::strata(rx)
special <- c("strata", "tt", "frailty", "ridge", "pspline")
data <- ovarian

t1 <- terms(formula1, special, data = data)
t2 <- terms(formula2, special, data = data)

attr(t1, "specials")$strata
#> [1] 3
attr(t2, "specials")$strata
#> NULL

虽然我不知道具体细节,但我想说这种差异后来导致了结果的差异。coxph()


因此,应避免在公式中使用前缀。如果由于某种原因,您必须使用此前缀,则可以使用以下技巧:survival::

library(survival)

# here
strata <- survival::strata
coxph(Surv(futime, fustat) ~ age + strata(rx), data=ovarian)
#> Call:
#> coxph(formula = Surv(futime, fustat) ~ age + strata(rx), data = ovarian)
#> 
#>        coef exp(coef) se(coef)     z       p
#> age 0.13735   1.14723  0.04741 2.897 0.00376
#> 
#> Likelihood ratio test=12.69  on 1 df, p=0.0003678
#> n= 26, number of events= 12

评论

0赞 AP30 5/11/2023
谢谢,绝对正确!这个技巧效果很好,所以我想我将使用它来避免在我的包裹中附加生存。非常感谢您的回复。