我正试图编写一组函数,其中第一个函数适合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#这适用于
# 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">
这似乎是有效的,至少在使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
元素中(存储了比其他模型类型更多的下游处理所需的信息这一一般说法。