首页 > 解决方案 > 使用 coxph 对象中的公式确定范围

问题描述

我正在尝试编写一组函数,其中第一个函数适合 cox 模型(通过coxphin 中的survival包中R),并且在给定第一个函数的拟合模型对象的情况下,第二个函数获取新数据集的估计生存率。我遇到了某种范围界定问题,如果不大幅重构我的代码,我不太知道如何解决(我认为这样做的唯一方法将不那么普遍,而且更难阅读)。

我有一组非常相似的函数,它们基于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 # 这行得通

 # 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) 

eval 中的错误(predvars、data、env):找不到对象“dat.local”

标签: rscopesurvival

解决方案


这似乎是可行的,至少在按需要工作的狭义上是glue.cox()这样:

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

这里的诀窍是大多数 R 建模/模型处理函数在与公式关联的环境中查找数据。

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


推荐阅读