在 coxph 对象中使用公式限定范围
Scoping with formulae in coxph objects
我正在尝试编写一组函数,其中第一个函数适合 cox 模型(通过 R
中 survival
包中的 coxph
),第二个函数给定来自第一个函数的拟合模型对象,获取新数据集的估计生存率。我正在 运行 遇到某种范围界定问题,我不太清楚如何在不实质性重构我的代码的情况下解决这个问题(我能想到的唯一方法是不那么通用,也更难阅读)。
我有一组非常相似的函数,它们基于 glm
函数,但不会 运行 进入同一问题并给我我期望的答案。我在下面提供了一个简短的示例来演示该问题。 glue.cox
和 glue.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
元素)比其他模型类型。
我正在尝试编写一组函数,其中第一个函数适合 cox 模型(通过 R
中 survival
包中的 coxph
),第二个函数给定来自第一个函数的拟合模型对象,获取新数据集的估计生存率。我正在 运行 遇到某种范围界定问题,我不太清楚如何在不实质性重构我的代码的情况下解决这个问题(我能想到的唯一方法是不那么通用,也更难阅读)。
我有一组非常相似的函数,它们基于 glm
函数,但不会 运行 进入同一问题并给我我期望的答案。我在下面提供了一个简短的示例来演示该问题。 glue.cox
和 glue.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
元素)比其他模型类型。