2017-03-16 92 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'。 –