【发布时间】:2015-08-22 10:00:06
【问题描述】:
我正在尝试使用 R 中的“rpart”包来构建生存树,我希望使用这棵树来预测其他观察结果。
我知道有很多关于 rpart 和预测的 SO 问题;但是,我找不到任何解决(我认为)特定于将 rpart 与“Surv”对象一起使用的问题。
我的特殊问题涉及解释“预测”功能的结果。一个例子很有帮助:
library(rpart)
library(OIsurv)
# Make Data:
set.seed(4)
dat = data.frame(X1 = sample(x = c(1,2,3,4,5), size = 1000, replace=T))
dat$t = rexp(1000, rate=dat$X1)
dat$t = dat$t / max(dat$t)
dat$e = rbinom(n = 1000, size = 1, prob = 1-dat$t )
# Survival Fit:
sfit = survfit(Surv(t, event = e) ~ 1, data=dat)
plot(sfit)
# Tree Fit:
tfit = rpart(formula = Surv(t, event = e) ~ X1 , data = dat, control=rpart.control(minsplit=30, cp=0.01))
plot(tfit); text(tfit)
# Survival Fit, Broken by Node in Tree:
dat$node = as.factor(tfit$where)
plot( survfit(Surv(dat$t, event = dat$e)~dat$node) )
到目前为止一切顺利。我对这里发生的事情的理解是,rpart 正试图将指数生存曲线拟合到我的数据子集。基于这种理解,我相信当我调用predict(tfit) 时,对于每个观察,我都会得到一个与该观察的指数曲线参数相对应的数字。因此,例如,如果 predict(fit)[1] 是 0.46,那么这意味着对于我的原始数据集中的第一次观察,曲线由公式 P(s) = exp(−λt) 给出,其中 λ=.46。
这似乎正是我想要的。对于每个观察(或任何新观察),我可以获得该观察在给定时间点内存活/死亡的预测概率。 (编辑:我意识到这可能是一个误解——这些曲线没有给出生/死的概率,而是给出了在一个区间内存活的概率。不过,这不会改变下面描述的问题。)
但是,当我尝试使用指数公式时...
# Predict:
# an attempt to use the rates extracted from the tree to
# capture the survival curve formula in each tree node.
rates = unique(predict(tfit))
for (rate in rates) {
grid= seq(0,1,length.out = 100)
lines(x= grid, y= exp(-rate*(grid)), col=2)
}
我在这里所做的是以与生存树相同的方式拆分数据集,然后使用survfit 为每个分区绘制非参数曲线。那是黑线。我还绘制了与将(我认为是)“速率”参数插入(我认为是)生存指数公式的结果相对应的线条。
我知道非参数拟合和参数拟合不一定相同,但这似乎不止于此:似乎我需要缩放我的 X 变量或其他东西。
基本上,我似乎不明白 rpart/survival 在幕后使用的公式。谁能帮我从 (1) rpart 模型到 (2) 任意观察的生存方程?
【问题讨论】:
标签: r tree survival-analysis rpart