如何计算randomForestSRC的中位生存期

时间:2017-07-19 09:41:43

标签: r median survival-analysis

我尝试在randomForestSRC中计算中位数生存期。

library(randomForestSRC)
data(veteran, package = "randomForestSRC")
train <- sample(1:nrow(veteran), round(nrow(veteran) * 0.80))
veteran.grow <- rfsrc(Surv(time, status) ~ ., veteran[train, ], ntree = 100)
veteran.pred <- predict(veteran.grow, veteran[-train , ])
print(veteran.grow)
print(veteran.pred)

我获得生存功能

veteran.pred$survival

我希望获得生存函数的中位数(veteran.pred$time.interest的值veteran.pred$survival== 0.5),足够的第一行

a = as.data.frame(veteran.pred$time.interest)
b= as.data.frame(veteran.pred$survival[1,])
df =cbind(a, b)
df <-rename(df, `time` =`veteran.pred$time.interest`)
df$`veteran.pred$survival[1, ]` = round(df$`veteran.pred$survival[15, ]`, 2)
subset(df, df$`veteran.pred$survival[1, ]`== 0.5 )$time

问题是生存功能很少正是0.5 在我们的例子中,我们得到了

[1] 1.00 1.00 1.00 0.95 0.95 0.95 0.95 0.93 0.93 0.93 0.93 0.93 0.93 0.93 0.90 0.90 0.90 0.87 0.87 0.87
[21] 0.87 0.87 0.86 0.76 0.76 0.67 0.67 0.67 0.67 0.67 0.67 0.66 0.66 0.66 0.66 0.66 0.65 0.64 0.57 0.57
[41] 0.57 0.57 0.57 0.57 0.57 0.48 0.45 0.39 0.39 0.32 0.32 0.29 0.29 0.29 0.29 0.26 0.26 0.25 0.25 0.25
[61] 0.25 0.25 0.25 0.25 0.20 0.20 0.20 0.20 0.20 0.20 0.18 0.18 0.18 0.16 0.16 0.16 0.14 0.14 0.14 0.11
[81] 0.07 0.07

所以我们有最接近的值0.57&amp; 0.48 如何计算中位生存期?

1 个答案:

答案 0 :(得分:1)

我不认为time.interest是用于此目的的正确项目,因为它的长度比验证集中的案例数长得多。 (那就是说,我不确定它到底应该告诉你什么。)如果你看一下str(veteran.pred)的输出,你会看到顶部:

str(veteran.pred)
List of 32
 $ call          : language generic.predict.rfsrc(object = object, newdata = newdata, outcome.target = outcome.target,      importance = impo| __truncated__ ...
 $ family        : chr "surv"
 $ n             : int 27
 $ ntree         : num 100
 $ yvar          :'data.frame': 27 obs. of  2 variables:
  ..$ time  : int [1:27] 100 384 123 22 21 139 31 51 54 132 ...
  ..$ status: int [1:27] 0 1 0 1 1 1 1 1 1 1 ...
 $ yvar.names    : chr [1:2] "time" "status"
 $ xvar          :'data.frame': 27 obs. of  6 variables:
  ..$ trt     : int [1:27] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ celltype: int [1:27] 1 2 2 2 2 2 2 2 2 3 ...
  ..$ karno   : int [1:27] 70 60 40 60 40 80 75 60 70 80 ...
  ..$ diagtime: int [1:27] 6 9 3 4 2 2 3 1 1 5 ...
  ..$ age     : int [1:27] 70 42 55 68 55 64 65 67 67 50 ...
  ..$ prior   : int [1:27] 0 0 0 0 10 0 0 0 0 0 ...
 $ xvar.names    : chr [1:6] "trt" "celltype" "karno" "diagtime" ...
 # --- snipped

我认为因为27是veteran[-train , ]的行数,所以你需要使用预测列表中的yvar项:

 str(veteran.pred$yvar)
#'data.frame':  27 obs. of  2 variables:
# $ time  : int  100 384 123 22 21 139 31 51 54 132 ...
# $ status: int  0 1 0 1 1 1 1 1 1 1 ...
?survfit
 survfit(Surv(time,status)~1  , data=veteran.pred$yvar)
#Call: survfit(formula = Surv(time, status) ~ 1, data = veteran.pred$yvar)
#
      n  events  median 0.95LCL 0.95UCL 
     27      24      54      49     139 
plot( survfit(Surv(time,status)~1  , data=veteran.pred$yvar) )

enter image description here

我对推荐这个程序有严重的保留意见。请注意,在该列表的林节点中还有另一个名为yvar的项,它有110行(因此它是原始数据)。如果您在未经调整的分析中查看传统KM曲线的结果,您将得到:

survfit(Surv(time,status)~1  , data=veteran.pred$forest$yvar) 
Call: survfit(formula = Surv(time, status) ~ 1, data = veteran.pred$forest$yvar)

      n  events  median 0.95LCL 0.95UCL 
    110     104      87      53     111 

我认为来自80:20 CV策略的27个案例将给出一个非常不稳定的中位数估计方法,特别是当存在分类预测因子时。我还认为随机forrest范例应该能够从整个数据集中导出有用的预测而不使用交叉验证类型的数据分割。