2017-03-16 6 views
2

Ich vergleiche die Leistung von zwei Modellen mit ROC-Kurven, und ich würde gerne die Regionen zwischen den beiden Kurven ausfüllen, um zu zeigen, wo das eine Modell das andere übertrifft. Ich habe versucht, geom_ribbon zu verwenden, aber das Problem ist, dass beide Achsen für jede Kurve unterschiedlich sind.ggplot2: Abstand zwischen Linien mit verschiedenen Achsen

Hier ist ein reproduzierbares Beispiel:

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

Wie kann ich in den Räumen zwischen diesen beiden Linien zu füllen?

Antwort

3

Ich bin mir nicht sicher, warum roc Vektoren unterschiedlicher Länge für jedes Modell produziert. Ich dachte, es könnte eine Möglichkeit geben, die Anzahl der X-Werte zu bestimmen, bei denen die ROC-Kurve berechnet wird, aber ich konnte keine finden. Verwenden wir stattdessen eine Interpolation, um für jede ROC-Kurve bei den gleichen x-Werten y-Werte zu erhalten.

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

Danke, das hat super funktioniert! Wenn Sie möchten, dass die Farbe abhängig davon, welches Modell besser ist, schattiert werden soll, setzen Sie 'fill = Model 1> Model 2' in' aes() '. –

Verwandte Themen