R語(yǔ)言——ROC 終結(jié)者- - 科研貓

# ROC 曲線(xiàn)——科研貓

數(shù)據(jù)解釋

第一列為二分類(lèi)結(jié)局變量,第2~n列為模型預(yù)測(cè)概率雅倒。


代碼如下:

options(stringsAsFactors = F)

options(warn = -1)

# 安裝包

#install.packages("pROC")

#install.packages("wesanderson")

#install.packages("openxlsx")

# 加載包

library(pROC)

library(wesanderson)

library(openxlsx)

# 數(shù)據(jù)要求,第一列為 y,后面為 x_1~x_n

data = read.xlsx("data.xlsx",sheet=1,rowNames = F,colNames = T,startRow = 1,

? ? ? ? ? ? ? ? detectDates = F,na.strings = "#NA")

# check groups (should be <= 5)

num.value = ncol(data) - 1

if(num.value > 5){

? print("Error: Too many groups of observations!")

? q(save="no")

}

name.value = colnames(data)[2:ncol(data)]

# define favoritable colors

col = wes_palette("Darjeeling1",num.value,type=c("discrete"))

# ROC curve

pdf("1.ROC_Combined.pdf",height = 4,width = 4)

for (i in 1:num.value){

? if(i == 1){

? ? roc.data = roc(data[,1],data[,i+1],

? ? ? ? ? ? ? ? ? percent=T,plot=T, grid=T,lty=i,

? ? ? ? ? ? ? ? ? print.auc=F,col=col[i])

? ? text(30,50,"AUC",font = 2,col="darkgray")

? ? text(30,50-10*i,

? ? ? ? paste(name.value[i],":",sprintf("%0.4f",as.numeric(roc.data$auc))),

? ? ? ? col=col[i])

? }else{

? ? roc.data = roc(data[,1],data[,i+1],

? ? ? ? ? ? ? ? ? percent=T,plot=T, grid=T, add=T,lty=i,

? ? ? ? ? ? ? ? ? print.auc=F,col=col[i])

? ? text(30,50-10*i,

? ? ? ? paste(name.value[i],":",sprintf("%0.4f",as.numeric(roc.data$auc))),

? ? ? ? col=col[i])

? }

}

dev.off()

# smooth ROC curve

pdf("2.ROC_with_smooth_curve_Combined.pdf",height = 4,width = 4)

for (i in 1:num.value){

? if(i == 1){

? ? roc.data = roc(data[,1],data[,i+1],

? ? ? ? ? ? ? ? ? percent=T,plot=T, grid=T,lty=i,smooth = T,

? ? ? ? ? ? ? ? ? print.auc=F,col=col[i])

? ? text(30,50,"AUC",font = 2,col="darkgray")

? ? text(30,50-10*i,

? ? ? ? paste(name.value[i],":",sprintf("%0.4f",as.numeric(roc.data$auc))),

? ? ? ? col=col[i])

? }else{

? ? roc.data = roc(data[,1],data[,i+1],

? ? ? ? ? ? ? ? ? percent=T,plot=T, grid=T, add=T,lty=i,smooth = T,

? ? ? ? ? ? ? ? ? print.auc=F,col=col[i])

? ? text(30,50-10*i,

? ? ? ? paste(name.value[i],":",sprintf("%0.4f",as.numeric(roc.data$auc))),

? ? ? ? col=col[i])

? }

}

dev.off()

## ROC with Confidence intervals ##

transparentColor <- function(col,alpha=200){

? # alpha is an integer >= 1 and <= 255


? col.rgb = as.numeric(col2rgb(col))

? col.rgb.alpha = rgb(col.rgb[1],col.rgb[2],col.rgb[3],alpha=alpha,maxColorValue = 255)

? return(col.rgb.alpha)

}

## CI of the curve

# curve shape

pdf("3.ROC_with_confidence_level_ribbon.pdf",height = 3,width = 3*num.value)

par(mfrow=c(1,num.value))

for (i in 1:num.value){

? roc.data = roc(data[,1],data[,i+1],

? ? ? ? ? ? ? ? percent=T,plot=T, grid=T,

? ? ? ? ? ? ? ? print.auc=F,col=transparentColor("white",255))

? sens.ci <- ci.se(roc.data, boot.n=100,conf.level = 0.95,specificities=seq(0, 100, 5))

? plot(sens.ci,type="shape",col=transparentColor(col[i],100))


? text(30,40,"AUC",font = 2,col="darkgray")

? text(30,30,

? ? ? paste(name.value[i],":",sprintf("%0.4f",as.numeric(roc.data$auc))),

? ? ? col=col[i])

}

dev.off()

#curve bar

pdf("4.ROC_with_confidence_level_bars_Combined.pdf",height = 3,width = 3*num.value)

par(mfrow=c(1,num.value))

for (i in 1:num.value){

? roc.data = roc(data[,1],data[,i+1],

? ? ? ? ? ? ? ? percent=T,plot=T, grid=T,

? ? ? ? ? ? ? ? print.auc=F,col=col[i])

? sens.ci <- ci.se(roc.data, boot.n=100,conf.level = 0.95,specificities=seq(0, 100, 5))

? plot(sens.ci,type="bars",col=col[i])


? text(30,40,"AUC",font = 2,col="darkgray")

? text(30,30,

? ? ? paste(name.value[i],":",sprintf("%0.4f",as.numeric(roc.data$auc))),

? ? ? col=col[i])

}

dev.off()

## Performance ##

getROCPerformance <- function(rocdata){

? performance = coords(roc.data, "best", best.method = "youden",

? ? ? ? ? ? ? ? ? ? ? ret=c("threshold", "sensitivity","specificity",

? ? ? ? ? ? ? ? ? ? ? ? ? ? "npv","ppv","tpr","fpr",

? ? ? ? ? ? ? ? ? ? ? ? ? ? "tnr","fnr","fdr","accuracy",

? ? ? ? ? ? ? ? ? ? ? ? ? ? "precision","youden"),

? ? ? ? ? ? ? ? ? ? ? transpose = F)

? res = t(as.data.frame(performance))

? auc = as.numeric(roc.data$auc)

? res = rbind(auc,res)

? return(res)

}

perf.all = NULL

roc.data.all = NULL

for (i in 1:num.value){

? roc.data = roc(data[,1],data[,i+1],

? ? ? ? ? ? ? ? percent=T,plot=F)

? roc.data.all = c(roc.data.all,roc.data)

? perf = getROCPerformance(roc.data)

? colnames(perf) = name.value[i]

? perf.all = cbind(perf.all,perf)

}

perf.all = as.data.frame(perf.all)

perf.all$Index = c("AUC","Best Cut-off Value","Sensitivity","Specificity",

? ? ? ? ? ? ? ? ? "Negative Predictive Value","Positive Predictive Value",

? ? ? ? ? ? ? ? ? "True Positive Rate","False Positive Rate",

? ? ? ? ? ? ? ? ? "True Negatice Rate","False Negative Rate",

? ? ? ? ? ? ? ? ? "False Discovery Rate","Accuracy","Precision","Youden Index")

perf.all = perf.all[,c(ncol(perf.all),1:(ncol(perf.all)-1))]

write.table(perf.all,"5.Model.Performance.csv",row.names = F,col.names = T,quote=F,sep=",")

## Delong Comparisons ##

pair = t(combn(2:ncol(data),2))

compair.result = NULL

for (i in 1:nrow(pair)){

? name1 = colnames(data)[pair[i,1]]

? compair.result$Model1.ROC = c(compair.result$Model1.ROC,name1)

? roc1 = roc(data[,1],data[,pair[i,1]],

? ? ? ? ? ? percent=T,plot=F)


? name2 = colnames(data)[pair[i,2]]

? compair.result$Model2.ROC = c(compair.result$Model2.ROC,name2)

? roc2 = roc(data[,1],data[,pair[i,2]],

? ? ? ? ? ? percent=T,plot=F)


? p = roc.test(roc1, roc2, reuse.auc=FALSE, boot.n = 1000, boot.stratified = F)$p.value

? compair.result$Pvalue.Delong.test = c(compair.result$Pvalue.Delong.test,p)

}

compair.result = as.data.frame(compair.result)

write.table(compair.result,"6.Delong.Comparision.csv",row.names = F,col.names = T,quote=F,sep=",")

print('finish')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末震放,一起剝皮案震驚了整個(gè)濱河市比默,隨后出現(xiàn)的幾起案子幻捏,更是在濱河造成了極大的恐慌,老刑警劉巖命咐,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篡九,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡醋奠,警方通過(guò)查閱死者的電腦和手機(jī)榛臼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)伊佃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沛善,你說(shuō)我怎么就攤上這事航揉。” “怎么了金刁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵帅涂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我尤蛮,道長(zhǎng)媳友,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任产捞,我火速辦了婚禮醇锚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坯临。我一直安慰自己焊唬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布尿扯。 她就那樣靜靜地躺著求晶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衷笋。 梳的紋絲不亂的頭發(fā)上芳杏,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音辟宗,去河邊找鬼爵赵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泊脐,可吹牛的內(nèi)容都是我干的空幻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼容客,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秕铛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缩挑,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤但两,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后供置,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谨湘,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了紧阔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坊罢。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖擅耽,靈堂內(nèi)的尸體忽然破棺而出活孩,到底是詐尸還是另有隱情,我是刑警寧澤秫筏,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布诱鞠,位于F島的核電站挎挖,受9級(jí)特大地震影響这敬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蕉朵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一崔涂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧始衅,春花似錦冷蚂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至诸老,卻和暖如春隆夯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背别伏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工蹄衷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厘肮。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓愧口,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親类茂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耍属,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360