生存模型的AUC

前面的文章总结了分类模型的AUC评价,但是对于生存模型如Cox比例风险模型,是否有类似的评价指标呢?

比较简单粗暴的想法是,确定一个生存终点,从而将生存模型的评价转化为分类模型的评价,比如3年DFS,此时生存时间和生存状态便依据3年这个时间点,转化成第3年那个时刻的“生存状态”,即模型因变量变成了分类变量。这个时候可以直接用分类模型的AUC计算方式直接计算(但是预测模型应该仍然是用Cox模型,暂时没实际操作过)。这种方法有个局限性,就是只能评价单个时间点的预测能力,而不能评价整个模型的性能;比如有可能3年生存的AUC比较大,但是5年生存的AUC却很小,模型的评价很片面。

由于这种局限性,不得不引出本文将叙述的方法,叫Time-Dependent ROC(risksetROC系列方法),在生存模型上计算AUC,也就是本文将叙述的方法。当然除了AUC这个指标,生存数据还可以用C-index(concordance)进行评价,C-index很接近AUC,本文不展开叙述了。

Time-Dependent ROC方法是由Heagerty等人于2005年在一篇论文中提出来的(Survival Model Predictive Accuracy and ROC Curves)。

先贴一个链接:Time-dependent ROC for Survival Prediction Models in R

这个系列主要分为2大块内容:敏感度和特异度定义的拓展、一致性评价指标的构建。

1、敏感度和特异度定义的拓展

Cumulative case/dynamic control ROC

image

Incident case/dynamic control ROC

image

2、一致性评价指标的构建

这个指标的构建是基于C-index的思想,或者说是将C-index的思想和ROC的思想融合而成。计算方法如下

这个指标也就是iAUC,即Integrated AUC using w(t)= 2 ∗ f(t) ∗ S(t)。

代码实现:一般使用R包risksetROC(timeROC包、survAUC等也可以)。下面的例子是我根据结肠癌数据用分期预测DFS建立Cox模型,并使用Bootstrap验证计算iAUC。

rc<-read.table("data.csv",header=TRUE,row.names = "id",sep = ",")

survival.status<-rc[,97]
survival.time<-rc[,98]
data.grade<-rc[,82]
data.size = length(data.grade)

## calculate iAUC using bootstrap
iAUC <- list()
for (i in 1:1000) {
  cat(i);cat(" ")
  select.index <- sample(1:data.size, data.size, replace  = T)
  select.index <- sort(unique(select.index))
  
  dis.survival.status <- survival.status[select.index]
  val.survival.status <- survival.status[-select.index]
  dis.survival.time <- survival.time[select.index]
  val.survival.time <- survival.time[-select.index]
  dis.grade <- data.grade[select.index]
  val.grade <- data.grade[-select.index]
  
  grade <- dis.grade
  coxmodel <- coxph( Surv(dis.survival.time,dis.survival.status)~ grade, na.action=na.omit )
  
  ## calculate the estimated survival probabilities at unique failure times
  surv.prob <- unique(survfit(Surv(val.survival.time,val.survival.status)~1)$surv)
  ## get the estimated linear predictor from a set of covariates. 
  marker <- predict(coxmodel,newdata = data.frame(grade=val.grade))
  utimes <- unique( val.survival.time[ val.survival.status == 1 ] )
  utimes <- utimes[ order(utimes) ]
  ## find AUC at unique failure times
  AUC <- rep( NA, length(utimes) )
  for( j in 1:length(utimes) )
  {
    out <- CoxWeights( marker, val.survival.time, val.survival.status, utimes[j])
    AUC[j] <- out$AUC
  }
  ## integrated AUC to get concordance measure
  iAUC[i] <- IntegrateAUC( AUC, utimes, surv.prob, tmax=365)
}

auc <- quantile(unlist(iAUC), probs = c(0.025, 0.5, 0.975))

## AUC distribution
library(beeswarm)
par(mar = c(3,5,3,1))
beeswarm(unlist(iAUC),col = "grey", pch = 19,
         ylab = "iAUC",
         cex.lab = 1,
         cex.axis = 1)
x <- quantile(unlist(iAUC), c(0.025, 0.5, 0.975))
segments(x0 =0.8, y0 = x[2], x1 = 1.2, y1 = x[2], lwd = 3, col = "tomato")
segments(x0 =0.9, y0 = x[1], x1 = 1.1, y1 = x[1], lwd = 3, col = "tomato")
segments(x0 =0.9, y0 = x[3], x1 = 1.1, y1 = x[3], lwd = 3, col = "tomato")
segments(x0 =1, y0 = x[1], x1 = 1, y1 = x[3], lwd = 3, col = "tomato")
text(x = 1.3, y = x[1], labels = "0.634", cex = 1.3, col = "tomato")
text(x = 1.3, y = x[2], labels = "0.649", cex = 1.3, col = "tomato")
text(x = 1.3, y = x[3], labels = "0.666", cex = 1.3, col = "tomato")
segments(x0 =1.35, y0 = x[1], x1 = 1.35, y1 = x[3], lwd = 1, lty = 2)
text(x = 1.39, y = x[2], labels = "95% CI", cex = 1.3, srt = 90)

这篇文章早就该写了的,今年暑假时就因为想借鉴一篇肠癌免疫评分的文章的统计方法,但是由于杂事多,一直拖到现在。

最近仍然比较忙,以后有空再酌情完善本文。

哈哈R语言也还不熟练,C系列写多了就不太习惯R的思维。

留下几个疑惑,具体的risksetAUC方法和integratedAUC方法究竟有什么区别?

再就是上面代码中的Bootstrap方法应该是有问题的,重复的样本应当保留,好像应该这样。但是保留的话,如何获取验证集数据呢?

还有一个疑惑,这些情况是否需要使用svycoxph建模,关于svydesign和svycoxph,先贴两个链接

Understanding survey design (svydesign)

survey-Reference Manual

另外这个是生存分析的R工具手册:Survival-Reference Manual

参考文献:

Time-dependent ROC for Survival Prediction Models in R

risksetROC-Reference Manual

如何在R软件中求一致性指数

Heagerty, P.J., Zheng Y. (2005) Survival Model Predictive Accuracy and ROC curves Biometrics, 61, 92 – 105

猜你喜欢

转载自blog.csdn.net/fjsd155/article/details/84668716
auc