使用multipleROC快速繪制ROC曲線

之前我寫過一篇使用pROC包畫好看的ROC曲線的教程,那篇教程中使用的是pROC撩轰,這個(gè)包可以快速擬合ROC曲線胯甩,然而這個(gè)包需要提前進(jìn)行運(yùn)算結(jié)果堪嫂,并且不能直接顯示AUC值等偎箫,今天推薦一個(gè)另一個(gè)繪制ROC的包multipleROC皆串,顧名思義淹办,這個(gè)包是可以一次性繪制多條ROC曲線的恶复,并且也是基于ggplot2怜森。

目前這個(gè)包作者沒有上傳CRAN或BiocManager谤牡,只能通過Github安裝副硅,地址為https://github.com/cardiomoon/multipleROC

安裝multipleROC

remotes::install_github("cardiomoon/multipleROC")

如果無法訪問GitHub翅萤,也可以導(dǎo)入到Gitee后進(jìn)行安裝

remotes::install_git("https://gitee.com/swcyo/multipleROC/")

數(shù)據(jù)演示

我們使用仙桃學(xué)術(shù)上的一個(gè)診斷性ROC示例數(shù)據(jù)為例進(jìn)行演示(下載請(qǐng)點(diǎn)擊xlxs鏈接)恐疲。

library(readxl) 
ROC <- read_excel("~/Desktop/ROC曲線.xlsx")

探索性分析

我們可以事先看一下group1和group2兩組在a變量中的差別套么,使用webr包培己,先看看結(jié)果如何

library(webr)
library(ggplot2)
library(dplyr)
library(tidyr) 
ROC %>% 
  group_by(outcome) %>% 
  numSummaryTable(a)
outcome n mean sd median trimmed mad min max range
group1 40.00 1.51 0.55 1.45 1.51 0.63 0.59 2.44 1.86
group2 32.00 1.00 0.55 1.00 0.99 0.63 0.13 1.99 1.86

也可以使用箱示圖和密度圖進(jìn)行展示胚泌,見Figure 1所示省咨。

p1<- ggplot(data=ROC)+geom_density(aes(x=a,fill=outcome),alpha=0.5)  
p2<-ggplot(data=ROC)+geom_boxplot(aes(x=outcome,y=a,fill=outcome),alpha=0.5)  
cowplot::plot_grid(p1,p2)
Figure 1: group1和group2兩組在a變量中的差別

同法可以顯示b和c變量的結(jié)果诸迟,我們暫時(shí)以boxplot展示

p3<-ggplot(data=ROC)+geom_boxplot(aes(x=outcome,y=b,fill=outcome),alpha=0.5) 
p4<-ggplot(data=ROC)+geom_boxplot(aes(x=outcome,y=c,fill=outcome),alpha=0.5) 
cowplot::plot_grid(p2,p3,p4,labels = "AUTO",nrow = 1)
Figure 2: group1和group2兩組在三變量中的差別

-- 雖然探索性分析可以判斷兩組的差異茸炒,但是無法確定最佳截?cái)嘀嫡笪矡o妨評(píng)估預(yù)測效能壁公。

ROC曲線的繪制

繪制ROC曲線是確定最佳截?cái)嘀档挠杏梅椒ㄖ簧鹣睢D梢允褂靡韵翿命令執(zhí)行ROC分析紊册。下面的R命令使一個(gè)類為multipleROC的對(duì)象,并進(jìn)行繪圖囊陡。
由于默認(rèn)的函數(shù)中分組需為0和1芳绩,因此需要將group1和group2進(jìn)行賦值撞反,我們將group1定義為0妥色,group2定義為1,我們繪制a變量在兩組中的ROC圖片嘹害,我們可以使用multipleROC()語句一步計(jì)算,可以看到最佳截?cái)嘀邓北悖珹UC值笔呀,另外敏感度、特異度都是可以直接顯示的髓需,見Figure 3所示。僚匆。

ROC$group<-ifelse(ROC$outcome=='group1',0,1) # 將group1定義為0微渠,否則為1 
library(multipleROC) 
a=multipleROC(group~a,data=ROC)
Figure 3: a變量在兩組的ROC曲線

如果不想顯示那么多結(jié)果的話,也可以plot_ROC()函數(shù)一個(gè)個(gè)設(shè)置是否顯示

plot_ROC(a, 
         show.points = TRUE, 
         show.eta = TRUE, 
         show.sens = TRUE, 
         show.AUC = TRUE, 
         facet = FALSE )

AUC和p值

在Figure 3的右下角敛助,您可以看到曲線下面積(AUC)和Wilcoxon秩和檢驗(yàn)的p值。p值來自以下計(jì)算結(jié)果屋确。

wilcox.test(ROC$a,ROC$group)

##  
##  Wilcoxon rank sum test with continuity correction 
##  
## data:  ROC$a and ROC$group
## W = 4416, p-value = 1.294e-13
## alternative hypothesis: true location shift is not equal to 0

AUC值則通過multipleROC包的simpleAUC()函數(shù)進(jìn)行運(yùn)算纳击,函數(shù)如下:

simpleAUC <- function(df){
     df=df[order(df$x,decreasing=TRUE),]
     TPR=df$sens
     FPR=df$fpr

     dFPR <- c(diff(FPR), 0)
     dTPR <- c(diff(TPR), 0)

     sum(TPR * dFPR) + sum(dTPR * dFPR)/2
}

那么,我們直接直接只有simpleAUC(adf) 進(jìn)行提取焕数,或者簡單的的aauc直接看到完整的AUC值

simpleAUC(a$df)  ## 函數(shù)法
## [1] 0.7328125

a$auc # 直接提取法
## [1] 0.7328125

同樣的,我們直接提取截?cái)帱c(diǎn)(cutpoint)和最佳截?cái)嘀担∣ptimal Cutoff value)

a$cutpoint
## [1] 0.5136663

a$cutoff
##  a ## 54 1.082828

將結(jié)果轉(zhuǎn)換為pROC對(duì)象

如果你更習(xí)慣pROC的結(jié)果刨啸,使用multipleROC2roc()函數(shù)堡赔,可以直接將結(jié)果轉(zhuǎn)換為 pROC的roc 對(duì)象

a2<-multipleROC2roc(a)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases

class(a) ##a的類型為multipleROC
## [1] "multipleROC"

class(a2) ##a2已經(jīng)轉(zhuǎn)換為roc的類型了
## [1] "roc"

pROC::auc(a2) ## 我們用pROC看auc的結(jié)果
## Area under the curve: 0.7328

我們可以使用pROC的繪圖函數(shù)對(duì)a2進(jìn)行繪圖了设联,我們比較以下兩種結(jié)果吧善已,見Figure 4所示。

library(pROC)
p5<-ggroc(a2, legacy.axes = TRUE)+
  geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), 
               color="darkgrey",linetype=4)+
  theme_bw()+ggtitle("pROC")
p6<-plot(a)+ggtitle("multipleROC")
cowplot::plot_grid(p5,p6)
Figure 4: pROC和multipleROC的結(jié)果對(duì)比

多個(gè)ROC曲線的繪制

可以用多個(gè)函數(shù)進(jìn)行多個(gè)ROC的曲線换团,可以使用plot_ROC(list())一個(gè)個(gè)繪制曲線,見Figure 5所示宫蛆。

a=multipleROC(group~a,data=ROC,plot=FALSE)
b=multipleROC(group~b,data=ROC,plot=FALSE)
c=multipleROC(group~c,data=ROC,plot=FALSE)
plot_ROC(list(a,b,c),
         show.eta=FALSE,#不顯示截點(diǎn)
         show.sens=FALSE #不顯示各種率
         )
Figure 5: 三條曲線同時(shí)繪制

當(dāng)然艘包,如果你不想寫那么多代碼的話,也可以直接使用plot_ROC2()函數(shù)直接繪制想虎,是不是簡單的多卦尊。

plot_ROC2(yvar="group",xvars=c("a","b","c"),dataname="ROC")
Figure 6: 三條曲線同時(shí)繪制簡單函數(shù)

分面顯示

將三張圖放在一起舌厨,可以看到數(shù)值重疊影響顏值岂却,我們可以用ggplot2的facet進(jìn)行分面繪制邓线。

plot_ROC(list(a,b,c),facet=TRUE)
Figure 7: 三條曲線的分面顯示

可以發(fā)現(xiàn)分面的標(biāo)簽?zāi)J(rèn)是1淌友,2骇陈,3,我們可以使用Y叔團(tuán)隊(duì)開發(fā)的ggfun這個(gè)包的facet_set()函數(shù)進(jìn)行快速的修改

library(ggfun) ## 必須要先安裝好
plot_ROC(list(a,b,c),facet=TRUE)+
  facet_set(label=c(`1`="a", `2`="b", `3`="c"))
分面顯示該標(biāo)簽名稱

換一種分面顯示

使用ggplot2包的facet_grid可以換一個(gè)分面顯示方式

plot_ROC(list(a,b,c))+facet_grid(no~.)+
  facet_set(label=c(`1`="a", `2`="b", `3`="c"))
換一個(gè)分面顯示方式

由于是基于ggplot2語句你雌,所以我們可以使用ggtitle添加標(biāo)題,還可以更換主題等等二汛。婿崭。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肴颊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婿着,更是在濱河造成了極大的恐慌授瘦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟宋,死亡現(xiàn)場離奇詭異,居然都是意外死亡丘侠,警方通過查閱死者的電腦和手機(jī)徒欣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜗字,“玉大人打肝,你說我怎么就攤上這事挪捕〈炙螅” “怎么了担神?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵楼吃,是天一觀的道長。 經(jīng)常有香客問我孩锡,道長酷宵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任浇垦,我火速辦了婚禮,結(jié)果婚禮上荣挨,老公的妹妹穿的比我還像新娘男韧。我一直安慰自己,他們只是感情好默垄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著口锭,像睡著了一般朦前。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹃操,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音荆隘,去河邊找鬼恩伺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛椰拒,可吹牛的內(nèi)容都是我干的晶渠。 我是一名探鬼主播耸三,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼乱陡,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼仪壮!你這毒婦竟也來了憨颠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤爽彤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缚陷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體适篙,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年箫爷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聂儒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硫痰,死狀恐怖衩婚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情效斑,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布缓屠,位于F島的核電站奇昙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敌完。R本人自食惡果不足惜储耐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一蠢挡、第九天 我趴在偏房一處隱蔽的房頂上張望弧岳。 院中可真熱鬧业踏,春花似錦、人聲如沸涧卵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伐脖。三九已至,卻和暖如春乐设,著一層夾襖步出監(jiān)牢的瞬間讼庇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工蠕啄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戈锻。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓歼跟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親格遭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哈街,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345