在 coxph 对象中使用公式限定范围

Scoping with formulae in coxph objects

我正在尝试编写一组函数,其中第一个函数适合 cox 模型(通过 Rsurvival 包中的 coxph),第二个函数给定来自第一个函数的拟合模型对象,获取新数据集的估计生存率。我正在 运行 遇到某种范围界定问题,我不太清楚如何在不实质性重构我的代码的情况下解决这个问题(我能想到的唯一方法是不那么通用,也更难阅读)。

我有一组非常相似的函数,它们基于 glm 函数,但不会 运行 进入同一问题并给我我期望的答案。我在下面提供了一个简短的示例来演示该问题。 glue.coxglue.glm 是具有我想要获得的基本功能的函数。 glue.glm 按预期工作(从全局环境中的计算产生相同的值),但 glue.cox 抱怨它找不到用于拟合 cox 模型的数据并以错误。我不明白如何用 substitute 做到这一点,但我怀疑这是前进的方向。我在试验中碰壁了。

 library(survival)

 data.global = data.frame(time=runif(20), x=runif(20))
 newdata.global = data.frame(x=c(0,1))
 f1 = Surv(time) ~ x # this is the part that messes it up!!!!! Surv gets eval
 f2 = time ~ x # this is the part that messes it up!!!!! Surv gets eval
 myfit.cox.global = coxph(f1, data=data.global)
 myfit.glm.global = glm(f2, data=data.global)
 myfit.glm.global2 = glm(time ~ x, data=data.global)


 myfit.cox <- function(f, dat.local){
   coxph(f, data=dat.local)
 }

 myfit.glm <- function(f, dat.local){
   glm(f, data=dat.local)
 }

 mypredict.cox <- function(ft, dat.local){
   newdata = data.frame(x=c(0,1))
   tail(survfit(ft, newdata)$surv, 1)
 }

 mypredict.glm <- function(ft, dat.local){
   newdata = data.frame(x=c(0,1))
   predict(ft, newdata)
 }

 glue.cox <- function(f, dat.local){
   fit = myfit.cox(f, dat.local)
   mypredict.cox(fit, dat.local)
 }

 glue.glm <- function(f, dat.local){
   fit = myfit.glm(f, dat.local)
   mypredict.glm(fit, dat.local)
 }

 # these numbers are the goal for non-survival data
 predict(myfit.glm.global, newdata = newdata.global)               

0.5950440 0.4542248

 glue.glm(f2, data.global) 

0.5950440 0.4542248 # this works

 # these numbers are the goal for survival data
 tail(survfit(myfit.cox.global, newdata = newdata.global)$surv, 1)

[20,] 0.02300798 0.03106081

 glue.cox(f1, data.global) 

Error in eval(predvars, data, env) : object 'dat.local' not found

这似乎有效,至少在使 glue.cox() 按预期工作的狭义意义上是这样:

myfit.cox <- function(f, dat.local){
    environment(f) <- list2env(list(dat.local=dat.local))
    coxph(f, data=dat.local)
}

这里的技巧是大多数 R modeling/model-processing 函数在环境 中查找与公式 相关的数据。

我不知道为什么 glue.glm 不做更多挖掘就可以工作,除了 [g]lm 对象在内部存储下游处理所需的更多信息的一般声明(例如在 $qr 元素)比其他模型类型。