2017-03-16 18 views
2

2つのモデルのパフォーマンスをROC曲線と比較していますが、2つの曲線の間の領域を埋めると、あるモデルが他のモデルよりも優れている場所を示しています。私は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

は、どのように私はこれらの2行の間のスペースを埋めることができますか?

答えて

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

+0

おかげで、これは素晴らしい仕事を!興味のある人は、どのモデルが良いかに基づいて色を変えたい場合は、 'aes()'の中で 'fill = Model 1> Model 2'を設定してください。 –

関連する問題