美文网首页
ROC曲线绘制-plotROC和survivalROC

ROC曲线绘制-plotROC和survivalROC

作者: 医学小白学生信 | 来源:发表于2021-03-09 12:19 被阅读0次

    ROC曲线

    1. ROC曲线是反应一个分类器在某个阈值时对样本的识别能力。
    2. 可以借助ROC曲线选择出某一诊断方法最佳的诊断界限值。ROC曲线越是靠近左上角,试验的FPR越高和FPR越低,即灵敏度越高,误判率越低,则诊断方法的性能越好。

    1. 下面的这个方法做ROC曲线适用于只有一个因素标签,如有无疗效,是否耐药等,不适合用于生存的ROC制作(两个因素time and censor)。

    1. 导入包和数据

    library('plotROC')
    test=read.table("test.txt",sep="\t",header=T,check.names=F)
    
    test.txt
    2.plotROC提供的函数melt_roc()可以将多个变量列变为长格式,方便数据的绘制:
    longtest <- melt_roc(test, "survival", c("CCR2", "UCHL1"))
    head(longtest)
    
    longtest

    3. 画比较图

    ggplot(longtest, aes(d = D, m = M, color = name)) + geom_roc() + style_roc()
    
    image.png

    4. 自定义函数

    plotROC <- function(.data, predict_col, target, group, positive=1, all=TRUE){
      if(!(require(tidyverse) & require(plotROC))){
        stop("--> tidyverse and plotROC packages are required..")
      } 
      
      predict_col <- enquo(predict_col)
      target <- enquo(target)
      group  <- enquo(group)
      
      predictN <- quo_name(predict_col)
      groupN   <- quo_name(group)
      
      df <- .data %>% dplyr::select(!! predict_col, !! target, !! group) %>%
        mutate(targetN = ifelse(!! target == positive, 1, 0)) %>% as.data.frame()
      if (all){
        df2 <- df 
        df2[, groupN] <- "ALL"
        
        df <- rbind(df, df2)
      }
      p  <- df %>%  ggplot(aes_string(m = predictN, 
                                      d = "targetN",
                                      color = groupN)) + geom_roc(show.legend = TRUE, labels=FALSE)
      p <- p + ggpubr::theme_classic2()
      
      ng <- levels(factor(df[, groupN]))
      if(length(ng) == 3){
        auc <- calc_auc(p)$AUC
        names(auc) <- ng
        auc <- base::sort(auc, decreasing = TRUE)
        p <- p + annotate("text", x = .75, y = .25, 
                          label = paste(names(auc)[1], " AUC =", round(auc[1], 3), "\n",
                                        names(auc)[2], " AUC =", round(auc[2], 3), "\n",
                                        names(auc)[3], " AUC =", round(auc[3], 3), "\n"),
                          size = 6)
      }
      
      p + xlab("1 - Specificity") + ylab("Sensitivity") + 
        scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0))
    }
    

    ** 5. 绘图**

    plotROC(longtest, predict_col = M, target = D, group = name, positive = 1)
    # 参数1:提供数据框
    # 参数2:提供预测数值列
    # 参数3:提供二分类信息列(尽量为0-1,字符也可以)
    # 参数4:提供一个组别
    # 参数5:这里1表示成功,如果target是success和failure,可以知道positive="success"
    # 注意,这里只有3条曲线绘制时才会给出AUC在图上,可以修改函数进行自定
    
    image.png

    参考资料

    [roc曲线分析和可视化] https://blog.csdn.net/u013066730/article/details/96476546
    

    2. 生存资料的结果涉及生存状态和生存时间两个变量,所有不能用普通的ROC曲线,必须用时间依赖性ROC曲线,也就是survivalROC,这样才能把两个因素都分析进去。

    1. 导入数据

    Sys.setlocale('LC_ALL','C')
    library(survivalROC)
    CCR2=read.table("CCR2.txt",sep="\t",header=T,check.names=F)
    
    CCR2.txt

    2. 计算相应的TP和FP

    nobsCCR2 <- NROW(CCR2)
    cutoff <- 1095 #这里就是时间节点的设置
    
    Mayo4.1= survivalROC(Stime=CCR2$time,##生存时间
                         status=CCR2$censor,## 终止事件    
                         marker = CCR2$CCR2, ## marker value    
                         predict.time = cutoff,## 预测时间截点
                         method = 'KM')##span,NNE法的namda
    str(Mayo4.1)## list结构,是每一个marker的cutoff值都计算出相应的TP,FP
    
    Mayo4.2= survivalROC(Stime=CCR2$time,  
                         status=CCR2$censor,      
                         marker = CCR2$UCHL1,     
                         predict.time = cutoff, method="KM")
    
    Mayo4.3= survivalROC(Stime=CCR2$time,  
                         status=CCR2$censor,      
                         marker = CCR2$combine,     
                         predict.time = cutoff, method="KM")
    
    Mayo4.1

    3. 画图

    require(ggsci)
    library("scales")
    pal_nejm("default")(8)
    show_col(pal_nejm("default")(8))
    
    plot(Mayo4.1$FP, Mayo4.1$TP, ## x=FP,y=TP
         type="l",col="#BC3C29FF", ##线条设置
         xlim=c(0,1), ylim=c(0,1), 
         xlab=("1 - Specificity"), ##连接
         ylab="Sensitivity",
         main="Time dependent ROC")## \n换行符
    abline(0,1,col="gray",lty=2)##线条颜色
    
    #lines函数在原有基础上继续绘图 #E18727FF
    #legend函数增加legend
    lines(Mayo4.2$FP, Mayo4.2$TP, type="l",col="#0072B5FF",xlim=c(0,1), ylim=c(0,1))
    lines(Mayo4.3$FP, Mayo4.3$TP, type="l",col="#E18727FF",xlim=c(0,1), ylim=c(0,1))
    legend(0.45,0.3,c(paste("AUC of CCR2 =",round(Mayo4.1$AUC,3)),
                     paste("AUC of UCHL1 =",round(Mayo4.2$AUC,3)),
                     paste("AUC of Combine =",round(Mayo4.2$AUC,3))),
           x.intersp=1, y.intersp=0.8, #调整lengend在图中的位置
           lty= 1 ,lwd= 2,col=c("#BC3C29FF","#0072B5FF",'#E18727FF'),
           bty = "n",# bty框的类型
           seg.len=1,cex=0.8)# 
    
    survivalROC

    相关文章

      网友评论

          本文标题:ROC曲线绘制-plotROC和survivalROC

          本文链接:https://www.haomeiwen.com/subject/eowvqltx.html