2016-05-05 34 views
1

我試圖使用rpart中的決策樹進行生存分析,類似於這裏:Using a survival tree from the 'rpart' package in R to predict new observations。爲了將決策樹生存模型與其他模型(如Cox迴歸)進行比較,我想使用交叉驗證來獲得Dxy並比較c指數。當我嘗試將validate.rpart與包含Surv對象的rpart配合使用時,我收到錯誤消息。借鑑的例子從前面的問題:試圖做一個生存樹的交叉驗證

library(rms) 

# Make Data: 
set.seed(4) 
dat = data.frame(X1 = sample(x = c(1,2,3,4,5), size = 100, replace=T)) 
dat$t = rexp(100, rate=dat$X1) 
dat$t = dat$t/max(dat$t) 
dat$e = rbinom(n = 100, size = 1, prob = 1-dat$t) 

# Survival Fit: 
sfit = survfit(Surv(t, event = e) ~ 1, data=dat) 
plot(sfit) 

# Tree Fit: 
require(rpart) 
tfit = rpart(formula = Surv(t, event = e) ~ X1 , data = dat, model=TRUE, control=rpart.control(minsplit=30, cp=0.01)) 
plot(tfit); text(tfit) 
validate(tfit) 

錯誤:

Error in unclass(x)[i, , drop = FALSE] : 
(subscript) logical subscript too long 

任何想法,針對此問題的方法?有沒有其他方法可以從rpart生存模型中獲得c-index?

回答

2

R rmsvalidate.rpart函數目前不實現生存模型(它實際上是簡單的指數分佈模型)。我已經改進了代碼,這個功能將在幾周後發佈到CRAN的rms包的下一個版本中。新的源代碼可以在明天在https://github.com/harrelfe/rms處獲得,但這不會有太大的幫助,因爲validate.rpart方法

請注意,遞歸分區的樣本量可能過大,例如在某些情況下,100,000個主題,迴歸樹可靠和穩定。

+0

感謝您的代碼更新,它現在看起來給我一個合理的結果,但是您的意思是「這不會有什麼幫助,因爲validate.rpart是一種方法」?它似乎非常有幫助!如果您是以我的例子中的數據爲例,那麼我的生產數據中實際上有25萬個科目。 –

+0

對不起,我沒有寫清楚。我的意思是,如果你只是在新版本的函數中使用source(),而不重新編譯軟件包,或者在軟件包中有更多的代碼文件,系統會忽略'validate.rpart'的新版本。 –

+0

如果你只是在'source()'後添加了一個額外的命令:'environment(validate.rpart)< - environment(cph)',那麼rms 4.5-1版本的新代碼就完好無損。 –