r - 使用 coxph 对象中的公式确定范围
问题描述
我正在尝试编写一组函数,其中第一个函数适合 cox 模型(通过coxph
in 中的survival
包中R
),并且在给定第一个函数的拟合模型对象的情况下,第二个函数获取新数据集的估计生存率。我遇到了某种范围界定问题,如果不大幅重构我的代码,我不太知道如何解决(我认为这样做的唯一方法将不那么普遍,而且更难阅读)。
我有一组非常相似的函数,它们基于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
推荐阅读
- ios13 - 暗模式和多窗口/场景
- python - 如何在python中返回void
- imagemagick - ImageMagick 如何将选项传递给 cwebp Linux
- android - Tasker:在 xml 文件中编辑 android 应用程序的设置
- storage - 我正在尝试使用rocksdb作为存储后端进行缓存
- mysql - Spring Boot MySQL Docker 引起:java.net.ConnectException:连接被拒绝(连接被拒绝)
- javascript - 无法从本地文件系统加载 pdf (IONIC 4 - Android)
- optimization - 为什么我的移动平均算法这么慢?
- saml - Weblogic12c 使用 ADFS 配置 SAML SSO
- python-3.x - 如何从打字模块导入列表以识别类中的类型列表[int]?