2017-03-16 132 views
2

我比較了兩個模型與ROC曲線的性能,我想填充兩條曲線之間的區域來顯示一個模型的性能優於另一個。我試過使用geom_ribbon,但問題是兩根軸對於每條曲線都不相同。ggplot2:用不同軸線填充空間

這裏有一個重複的例子:

##Simulate Data 
set.seed(123456) 
n <- 10000 
q <- 0.8 

#Simulate predictions 
Real <- c(sample(c(0,1), n/2, replace = TRUE, prob = c(1-q,q)), 
      sample(c(0,1), n/2, replace = TRUE, prob = c(0.7,0.3))) 

#Simulate Response 
p <- c(rep(seq(0.4,0.9, length=100), 50), 
     rep(seq(0.2,0.6, length=100), 50)) 
p2 <- c(rep(seq(0.5,0.9, length=100), 50), 
     rep(seq(0.2,0.7, length=100), 50)) 
p <- data.frame(cbind(Real, p, p2)) 

#install and load package 
#install.packages("pROC") 
library(pROC) 

#apply roc function 
analysis <- roc(response=p$Real, predictor=p$p) 
analysis2 <- roc(response=p$Real, predictor=p$p2) 

#Plot ROC Curve 
#install.packages("ggplot2") 
library(ggplot2) 
ggplot() + 
    geom_line(aes(x=1-analysis$specificities,y=analysis$sensitivities)) + 
    geom_line(aes(x=1-analysis2$specificities,y=analysis2$sensitivities), color = "red") 

ROC plot

我怎樣才能填補這兩條線之間的空間?

回答

3

我不知道爲什麼roc正在爲每個模型生成不同長度的載體。我認爲可能有辦法設置計算ROC曲線的x值的數量,但我找不到一個。相反,讓我們使用插值來獲取每個ROC曲線在相同x值處的y值。

library(pROC) 
library(reshape2) 
library(ggplot2) 

#apply roc function 
analysis <- roc(response=p$Real, predictor=p$p) 
analysis = data.frame(x=1-analysis$specificities, y=analysis$sensitivities) 

analysis2 <- roc(response=p$Real, predictor=p$p2) 
analysis2 = data.frame(x=1-analysis2$specificities, y=analysis2$sensitivities) 

# Use interpolation to get y-values at the same x-values for each ROC curve 
dat = as.data.frame(approx(analysis, n=194)) 
dat = cbind(dat, y2=approx(analysis2, n=194)$y) 
names(dat) = c("x", "Model 1", "Model 2") 

ggplot() + 
    geom_ribbon(data=dat, aes(x, ymin=`Model 1`, ymax=`Model 2`), fill="yellow") + 
    geom_line(data=melt(dat, id.var="x"), aes(x, value, colour=variable), size=0.8) + 
    labs(x="1 - Specificity", y="Sensitivity", colour="") + 
    theme_classic() 

enter image description here

+0

謝謝,這真是棒極了!對於那些感興趣的人,如果你想根據哪種模型更好而使顏色不同,請在'aes()'中設置'fill = Model 1'Model 2'。 –