ggplot2:填充具有不同轴的线之间的空间

时间:2017-03-16 03:40:52

标签: r ggplot2

我正在将两个模型的性能与ROC曲线进行比较,我想填写两条曲线之间的区域,以显示一个模型优于另一个模型的位置。我尝试过使用geom_ribbon,但问题是每条曲线的两个轴都不同。

这是一个可重复的例子:

##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

如何填写这两行之间的空格?

1 个答案:

答案 0 :(得分:3)

我不确定为什么roc为每个模型生成不同长度的向量。我想可能有办法设置计算ROC曲线的x值的数量,但我找不到一个。相反,让我们使用插值来获得相同x值的每个ROC曲线的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