TCGA+biomarker——ROC曲線

2021-02-19 YJY技能修煉

通常情況下,通過以下幾種指標來對模型進行評價

1)區分度:採用指標C-index和ROC曲線來評價區分度,一般文章都是二選一。

2)校準度:通常採用校準曲線(calibration curve)來進行評價一致性/校準度,即預測值和真實值之間的差異

3)DCA:決策曲線(DCA)用來幫助確定高風險的患者進行幹預、低風險的患者避免過度醫療。

前期已經介紹過C-index,Calibration curve,DCA,今天再來說說ROC曲線.

ROC曲線簡介
Receiver Operating Characteristic Curve,簡稱ROC曲線,又稱為感受性曲線。它是根據一系列不同的二分類方式(分界值或決定閾),以真陽性率(敏感性)為縱坐標,假陽性率(1-特異性)為橫坐標繪製的曲線。AUC(Area Under Curve)被定義為ROC曲線下的面積。我們往往使用AUC值作為模型的評價標準是因為很多時候ROC曲線並不能清晰的說明哪個分類器的效果更好,而作為一個數值,對應AUC更大的分類器效果更好。


ROC曲線案例


ROC曲線圖解

解釋:ROC曲線圖是反映敏感性與特異性之間關係的曲線。橫坐標X軸為特異性,也稱為假陽性率(誤報率:1-Specificity ),X軸越接近零準確率越高;縱坐標Y軸稱為敏感度,也稱為真陽性率(敏感度:Sensitivity),Y軸越大代表準確率越好。通過評估不同閾值的真陽性和假陽性,可以構建一條曲線,該曲線從左下方延伸到右上方,並向左上方彎曲。在正、負類之間沒有判別力的分類器將形成一條對角線,在假陽性率0和真陽性率0(坐標:0,0)與假陽性率 1和真陽性率(坐標:1,1)。


根據曲線位置,把整個圖劃分成了兩部分,曲線下方部分的面積被稱為AUC(Area Under Curve),用來表示預測準確性,AUC值越高,也就是曲線下方面積越大,說明預測準確率越高。曲線越接近左上角(X越小,Y越大),預測準確率越高。ROC曲線下的面積值AUC正常在0.5和1之間。在AUC>0.5的情況下,AUC越接近於1,說明診斷效果越好。AUC在 0.5~0.7時有較低準確性,AUC在0.7~0.9時有一定準確性,AUC在0.9以上時有較高準確性。AUC=0.5時,說明診斷方法完全不起作用,無診斷價值。AUC<0.5不符合真實情況,在實際中極少出現。


ROC曲線繪製原理

為了更好理解ROC曲線繪圖思路,我們需要了解X軸和Y軸數據是如何計算的?

「混淆矩陣」:對於二分類問題,可將樣本根據其真實類別與學習器預測類別的組合劃分為TP(true positive)、FP(false positive)、TN(true negative)、FN(false negative)四種情況,TP+FP+TN+FN=樣本總數。

(1) 真陽性(True Positive,TP):檢測陽性,且實際陽性;正確肯定的匹配數目;

(2) 假陽性(False Positive,FP):檢測陽性,但實際陰性;誤報,給出的匹配是不正確的;

(3) 真陰性(True Negative,TN):檢測陰性,且實際陰性;正確拒絕的非匹配數目;

(4) 假陰性(False Negative,FN):檢測陰性,但實際陽性;漏報,沒有正確找到的匹配的數目。

X軸—假陽率(False Positive Rate)的計算方法是:假陽(False Positive)預測的總數除以假陽和真陰(True Negative)的總和。False Positive Rate = False Positives /(False Positives + True Negatives)

Y軸—真陽率(True Positive Rate)是用真陽性(True Positive)預測的總數除以真陽和假陰(False Negative)之和得出的分數。真陽性率稱為敏感性或召回率。True Positive Rate = True Positives /(True Positives +False Negatives )


下面以一個具體的例子來詳細了解ROC曲線是如何繪製的。

如上圖所示,共計10例樣本,根據event分成兩類,event=1的表示陽性樣本,event=0的表示陰性樣本,Riskscore表示測量的某個指標值。

1)首先,依據Riskscore值從大到小對這10例樣本進行排序(上圖已經是按此規則排過序的);

2)接下來,依次把Riskscore值作為閾值(即閾值依次為21.34,21.31,19.42....11.33),共計10個閾值,當Riskscore值大於等於此閾值時被認為是陽性,否則被認為是陰性。比如,當以Riskscore=17.17作為閾值,那麼前4例樣本被分類成陽性樣本,剩餘6例樣本被分類成陰性樣本。

據此,我們可以得到:

真陽性(True Positive,TP):檢測陽性,且實際陽性;TP=2

假陽性(False Positive,FP):檢測陽性,但實際陰性;FP=2

真陰性(True Negative,TN):檢測陰性,且實際陰性;TN=2

假陰性(False Negative,FN):檢測陰性,但實際陽性;FN=4

那麼,根據以上指標可計算:

FPR = FP/(FP+ TN)=2/2+2=0.50

TPR = TP /(TP +FN)=2/2+4=0.33

這樣,依次把這10個Riskscore值作為閾值,我們就可以得到10組(TPR,FPR)值,把這10組(TPR,FPR)繪製出來得到的曲線就是ROC曲線。


ROC曲線的目的目的1——評估某個模型的好壞!在AUC>0.5的情況下,AUC越接近於1,說明診斷效果越好。AUC在 0.5~0.7時有較低準確性,AUC在0.7~0.9時有一定準確性,AUC在0.9以上時有較高準確性。下圖表明AUC=0.79, 說明該模型分類器的準確性處於中等水平。

目的2——比較不同模型的優劣

下圖中有3個模型的ROC曲線,根據AUC面積大小,可直觀展示出3個模型之間的優劣,A模型>B模型>C模型。

但如下圖,上圖中兩條ROC曲線相交於一點,AUC值幾乎一樣:當需要高Sensitivity時,模型A比B好;當需要高Speciticity時,模型B比A好。



目的3——確定最佳臨界點

所謂找到最優臨界點,就是保證真陽性率(敏感高)高的同時假陽性率(特異性)要儘量的小,建立max(TPR+(1-FPR))的模型。例如:交叉點坐標為(95.8%,14.6%),相應的臨界值即可出來,說明敏感度是95.8%,特異度是84.6%。


如何繪製ROC曲線?

以下代碼源自生信技能樹公共號中「學徒帶你7步3251行代碼+300行注釋完成TCGA資料庫挖掘實戰全文復現」這篇教程,寫的非常清楚,採用了三種方式繪製ROC曲線,每一種都很美觀!在此基礎代碼上,也可以靈活運用,繪製不同模型、不同數據集的ROC曲線。

rm(list = ls())options(stringsAsFactors = F)#時間依賴的ROC曲線#載入數據KM.input<-read.csv(file = "KM.input.csv",header = T)head(KM.input)# X event time_year RiskScore# 1 TCGA-A1-A0SE-01A-11R-A085-13     0 3.6191781 0.3686996# 2 TCGA-A1-A0SH-01A-11R-A085-13     0 3.9369863 1.8872376# 3 TCGA-A1-A0SJ-01A-11R-A085-13     0 1.1397260 0.9330429# 4 TCGA-A1-A0SK-01A-12R-A085-13     1 2.6493151 0.5337272# 5 TCGA-A1-A0SM-01A-11R-A085-13     0 0.6630137 3.0229704# 6 TCGA-A1-A0SO-01A-22R-A085-13     0 2.3342466 0.8083318#數據包括樣本名稱、事件(生:0,死:1),生存時間,風險值。該數據源自cox風險比例模型
#---survivalROC包-#1.載入R包#install.packages("survivalROC")#install.packages("timeROC") #2個包都可以繪製生存時間依賴的ROC曲線#1.使用SurvivalROC (不能顯示置信區間和SD)library(survival)library(survivalROC)?survivalROC #查看這個函數的格式#輸入數據Survival_ROC_input<-KM.input#這裡我預測五年的生存率survival_ROC<-survivalROC(Stime=Survival_ROC_input$time_year, #生存時間,Event time or censoring time for subjects status=Survival_ROC_input$event, #生存狀態,dead or alive marker=Survival_ROC_input$RiskScore, #風險得分,Predictor or marker value predict.time=5, #預測5年的生存時間 method="KM" #使用KM法進行擬合,默認的方法是method="NNE")survival_ROC_AUC<-round(survival_ROC$AUC,3)#ROC曲線的AUC保留3位小數(文章保留了3位)#畫圖#x軸為False positive rate,y軸為True positive rateplot(survival_ROC$FP,survival_ROC$TP,type="l",xlim=c(0,1),ylim=c(0,1), xlab="False positive rate", ylab="True positive rate", main=paste0("ROC Curve", " (", "AUC = ",survival_ROC_AUC," )"), #標題 cex.main=1.5,#放大標題 cex.lab=1.3,#坐標軸標籤(名稱)的縮放倍數 cex.axis=1.3, font=1.2, #放大軸上的數字 lwd=1.5, #指定線條寬度 col="red" #紅色)abline(a=0,b=1) #添加一條y=x的線#計算最佳cutoffcutoff<-survival_ROC$cut.values[which.max(survival_ROC$TP-survival_ROC$FP)]cutoff
#----timeROC包--#2.使用timeROC(可以計算置信區間和SD)#Time ROC可以時計算多個時間的AUC#文章沒有說明計算的幾年的,我這裡計算3,5,10年library(timeROC)library(survival)?timeROC #看一下說明書#輸入數據time_ROC_input<-KM.inputtime_ROC<-timeROC(T=time_ROC_input$time_year, #生存時間(dead和alive的生存時間). delta=time_ROC_input$event, #生存結局,Censored的樣本必須用0表示 marker=time_ROC_input$RiskScore, #預測的變量,這裡是風險評分,在沒有特殊情況下,值越大,越容易發生危險事件 cause=1, #陽性結局的賦值(必須是1或2),也就是dead的賦值,這裡dead是1表示的 weighting = "marginal", #權重計算方法,這是默認方法,選擇KM計算刪失分布,weighting="aalen" [選用COX],weighting="aalen" [選用Aalen] times = c(3,5,10), #計算3、5、10年的ROC曲線 ROC=TRUE, iid=TRUE #計算AUC)time_ROC #查看結果,可以看到,還包括了SE#繪製ROC曲線啦summary(time_ROC) #返回12個參數time_ROC$AUC#繪製3年的ROCplot(time_ROC,time=3,col="red",title=FALSE,lwd=2) #將生成一條兩倍於 默認寬度的線條#在此基礎上添加5年的ROCplot(time_ROC,time=5,col="blue",add=TRUE,title=FALSE,lwd=2)#add 10年的ROCplot(time_ROC,time=10,col="black",add=TRUE,title=FALSE,lwd=2)#添加圖例?legendlegend("bottomright", #圖例設置在右下角 c(paste0("AUC at 3 years = ", round(time_ROC$AUC[1],3)), paste0("AUC at 5 years = ", round(time_ROC$AUC[2],3)), paste0("AUC at 10 years = ", round(time_ROC$AUC[3],3))), col=c("red","blue","black"),lwd=2,bty="n")
#3. 在timeroc包分析基礎上使用ggplot2來畫圖library(ggplot2)time_ROC$TPsummary(time_ROC)#整理成數據框,gpplot需要數據框time_ROC.res<-data.frame(TP_3year=time_ROC$TP[,1], #獲取3年的ROC的TP FP_3year=time_ROC$FP[,1], #獲取3年的ROC的FP TP_5year=time_ROC$TP[,2], #獲取5年的ROC的TP FP_5year=time_ROC$FP[,2], #獲取5年的ROC的FP TP_10year=time_ROC$TP[,3], #獲取10年的ROC的TP FP_10year=time_ROC$FP[,3]) #獲取10年的ROC的FPtime_ROC$AUC #這裡放了3,5,10年的AUC,後續分別取子集time_ROC$AUC[[1]],time_ROC$AUC[[2]],time_ROC$AUC[[3]]TimeROC_plot<-ggplot()+ geom_line(data=time_ROC.res,aes(x=FP_3year,y=TP_3year),size=1,color="red")+ geom_line(data=time_ROC.res,aes(x=FP_5year,y=TP_5year),size=1,color="blue")+ geom_line(data=time_ROC.res,aes(x=FP_10year,y=TP_10year),size=1,color="black")+ geom_line(aes(x=c(0,1),y=c(0,1)),color = "grey",size=1, linetype = 2 #添加虛線 )+ theme_bw()+ annotate("text",x=0.75,y=0.25,size=4.5, label=paste0("AUC at 3 years = ",round(time_ROC$AUC[[1]],3)),color="red")+ annotate("text",x=0.75,y=0.15,size=4.5, label=paste0("AUC at 5 years = ",round(time_ROC$AUC[[2]],3)),color="blue")+ annotate("text",x=0.75,y=0.05,size=4.5, label=paste0("AUC at 10 years = ",round(time_ROC$AUC[[3]],3)),color="black")+ labs(x="False positive rate",y="True positive rate")+ theme(axis.text=element_text(face="bold", size=11, color="black"),#加粗刻度標籤 axis.title=element_text(face="bold", size=14, color="black")) #加粗xy軸標籤名字TimeROC_plot

往期回顧

TCGA+biomarker——常見結果展示TCGA+biomarker——Sample基線表

長按識別二維碼,關注"YJY技能修煉"

相關焦點

  • Logistic回歸—結合ROC曲線應用於聯合診斷
    () 建立ROC曲線,如下所示:library(pROC) # 記載pROC包roc_CA125 <- roc(lung_cancer$Y, lung_cancer$CA125) # 生成CA125的ROC曲線roc_CEA <- roc(lung_cancer$Y, lung_cancer$CEA) # 生成CEA的ROC曲線
  • 畫ROC曲線的R包總結
    /在這篇文章中,我將描述如何在CRAN中搜索繪製ROC曲線的包,並強調六個有用的包。下面的代碼使用包附帶的合成數據集並繪製默認的ROCR ROC曲線。在本文中,我將使用相同的數據集。輸入的術語有點折衷,但是一旦您理解了ROC.curve()函數,就可以輕鬆地繪製出一條乾淨的ROC曲線。正如vignette所指示,PRROC的創建實際上是為了做precision-recall曲線。
  • 基於R、Python和SPSS繪製ROC曲線並計算AUC
    通過取不同的閾值,我們便可以得到多個坐標點並且繪製出曲線,這一曲線便稱為ROC曲線,如下圖所示:ROC曲線根據ROC曲線的繪製原理,如果曲線上各點越靠近左方和上方,則真陽性率越高,假陰性率越低,模型的分類效果也就越好。
  • 運維丨Python中ROC曲線繪製
    首先以支持向量機模型為例先導入需要使用的包,我們將使用roc_curve這個函數繪製ROC曲線!
  • R與生物專題 | 第五十講 R-ROC曲線
    在「R與生物統計專題」中,我們會從介紹R的基本知識展開到生物統計原理及其在R中的實現。同時在真陽性率 TPR(敏感度) = TP / ( TP + FN ) 算式中的 FN = 0,所以 TPR=100%。→ 當閾值設定為最低時,必得出ROC座標系右上角的點 (1, 1)。
  • 影像組學 | 18.ROC曲線和AUC
    今天起開始推出影像組學系列筆記第十八期:ROC曲線和AUC理論基礎 關於ROC曲線和AUC下面積的知識,如果看過往期推送,相信大家都有所了解。曲線追求從左上角到右下角的對角線,與ROC曲線連線的交點到左上角點(0,1)的距離假設為X,可以看出距離X越小越好,最理想的情況即距離為0。
  • 機器學習中的AUC-ROC曲線
    AUC-ROC曲線你已經建立了你的機器學習模型-那麼接下來呢?你需要對它進行評估,並驗證它有多好(或有多壞),這樣你就可以決定是否實現它。這時就可以引入AUC-ROC曲線了。AUC-ROC曲線正好解決了這個問題!AUC-ROC曲線是什麼?ROC曲線是二值分類問題的一個評價指標。它是一個概率曲線,在不同的閾值下繪製TPR與FPR的關係圖,從本質上把「信號」與「噪聲」分開。
  • ROC曲線
    關鍵詞 import matplotlib.pylab as pltfrom scipy import interpfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import roc_curve,aucfrom sklearn.model_selection
  • 多分類結局的ROC分析
    近日,有朋友在《統計諮詢》公眾號諮詢:如果結局為多分類,還能計算AUC或繪製ROC曲線嗎?
  • 多分類變量居然也可以做ROC曲線
    from sklearn.metrics import roc_auc_scoredef load_data():(y_test[:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # Compute micro-average ROC curve and ROC
  • 一文詳解 ROC/AUC
    ,通過遍歷不同的閾值也就得到了整條曲線,曲線下的面積也就是AUC。ROC曲線的閾值問題看完上述內容後,很多同學可能還並不是很能理解ROC曲線,下面我們通過一張圖來進一步來解釋一下。同理roc曲線你也可以畫出來。另外多分類問題最好每一類分別都看看,因為有可能存在總體效果好,有一部分類別預測的很準,另外一些類別根本分不出來的情況。5.
  • R語言可視化(三十八):ROC曲線圖繪製
    ROC曲線圖繪製清除當前環境中的變量rm(list=ls())設置工作目錄setwd("C:/Users/Dell/Desktop/R_Plots/38roc/")使用ROCR包繪製ROC曲線# 安裝並加載所需的
  • ROC評價指標最全攻略及Python實現
    與上述評價指標還有一個孿生兄弟,就是ROC曲線和AUC值。接下來我們就針對這個孿生兄弟進行詳細的學習。ROC曲線:全稱是「受試者工作特性」曲線(Receiver Operating Characteristic),源於二戰中用於敵機檢測的雷達信號分析技術,是反映敏感性和特異性的綜合指標。
  • 使用python+sklearn實現具有交叉驗證的ROC
    本文是一個使用交叉驗證來評估分類器性能的ROC度量指標的示例。
  • 性能度量(三)PR曲線、ROC曲線和Cost代價曲線
    前面兩章調用了API繪製了PR曲線和ROC曲線,本章將自己編程來繪製他們。
  • ROC-AUC 與 PR-AUC 的區別與聯繫
    一個沒有任何分類能力的模型,意味著 TPR 和 FPR 將會相等 (所有正例將會有一半被預測為正例,所有負例也將會有一半被預測為正例),這時 ROC 曲線將會如下圖藍色虛線所示。通過以上幾個閾值可以發現一個隨機模型的 PR 曲線 Precision 值為正樣本佔總樣本的比例,Recall 的範圍在 0-1之間。
  • 機器學習系列-ROC曲線以及AUC計算
    計算方法有兩種:         1:繪製ROC曲線,ROC下面的曲線面試就是AUC的值         2:假設總共有(m+n)個樣本,其中正樣本m個,負樣本n個,總共有m*n個樣本對,計數,正樣本預測為正樣本的概率值大於負樣本預測為正樣本的概率值記為1,累加計數,然後除以(m*n)就是AUC的值那麼ROC又是什麼呢?
  • roc指標如何解讀 散戶們要注意以下幾點
    這裡小編我就給大家介紹一下roc指標的相關內容,看看roc指標如何解讀?提醒散戶們要注意以下幾點分析方法。roc指標如何解讀 ROC指標,又稱變動率指標,以交du易日當天的收盤價與其N天前的收盤價的差除以
  • roc指標應用買賣技巧 投資者千萬不要錯過了
    目前roc指標應用買賣技巧揭曉了,究竟有哪些呢?roc指標 據悉,目前ROC買賣技巧公布,有不少投資者表示很想要知道的,所以現在小編給大家介紹一下另外,我們也是需要注意買賣信號的,因為兩種方式結合在一起,也是有著不少好處,目前當75日ROC取消和38日ROCMA曲線經過長時間的中地位整理後,一旦75日ROC曲線開始向上突破38日ROCMA曲線,說明股價的中長期強勢上升趨勢開始形成,這是ROC指標發出的中長期買入信號,特別對於那些股價已經帶量突破中長期均線壓力的股票,這種買入信號則更可確認,此時,投資者應及時買入股票。
  • roc指標怎麼看 這個指標使用技巧介紹
    那麼,在股票市場上,roc指標怎麼看呢?接下來小編為大家帶來這個指標使用技巧介紹,一起來了解一下。roc指標 ROC的意義:ROC指標是以當日收盤價和N天前的收盤價作比較,通過計算股價在某一時段內收盤價變動的速率