Cómo trazar la curva ROC en R con solo información conocida de SN/PPV/CORTEOF
Pregunta
Dados dichos datos:
#Cutpoint SN (1-PPV)
5 0.56 0.01
7 0.78 0.19
9 0.91 0.58
¿Cómo puedo trazar la curva ROC con R que produce resultados similares como el adjunto ?
Conozco el paquete ROCR pero no requiere tales aportes.
Solución
Si solo desea crear la gráfica (sin esa tonta spline de interpolación entre los puntos), simplemente traiga los datos que da de la manera estándar, preparando un punto en (0,0) y agregando uno a (1,1) para dar el Puntos finales de la curva.
## your data with different labels
dat <- data.frame(cutpoint = c(5, 7, 9),
TPR = c(0.56, 0.78, 0.91),
FPR = c(0.01, 0.19, 0.58))
## plot version 1
op <- par(xaxs = "i", yaxs = "i")
plot(TPR ~ FPR, data = dat, xlim = c(0,1), ylim = c(0,1), type = "n")
with(dat, lines(c(0, FPR, 1), c(0, TPR, 1), type = "o", pch = 25, bg = "black"))
text(TPR ~ FPR, data = dat, pos = 3, labels = dat$cutpoint)
abline(0, 1)
par(op)
Para explicar el código: El primero plot()
Llamar establece la región de trazado, sin hacer una trama en absoluto. Tenga en cuenta que obligo a la gráfica a cubrir el rango (0,1) en ambos ejes. los par()
Llam le dice a R que traza los ejes que cubren el rango de los datos: el valor predeterminado los extiende en un 4 por ciento del rango en cada eje.
La siguiente línea, with(dat, lines(....))
Dibuja la curva ROC y aquí prependemos y agregamos los puntos a (0,0) y (1,1) para dar la curva completa. Aquí yo uso type = "o"
Para dar a los puntos y líneas sobrepotrados, los puntos están representados por el carácter 25 que permite que se llene con un color, aquí negro.
Luego agrego etiquetas a los puntos usando text(....)
; la pos
El argumento se usa para colocar la etiqueta lejos de las coordenadas de trazado reales. Tomo las etiquetas del cutpoint
objeto en el marco de datos.
los abline()
la llamada dibuja la línea 1: 1 (aquí el 0
, y 1
significa una intersección de 0
y una pendiente de 1
respectivamente.
La línea final restablece los parámetros de trazado a los valores predeterminados que guardamos op
Antes de trazar (en la primera línea).
La trama resultante se ve así:
No es un facsímil exacto y prefiero la gráfica usando el valor predeterminado para los rangos de eje (agregando 4 por ciento):
plot(TPR ~ FPR, data = dat, xlim = c(0,1), ylim = c(0,1), type = "n")
with(dat, lines(c(0, FPR, 1), c(0, TPR, 1), type = "o", pch = 25, bg = "black"))
text(TPR ~ FPR, data = dat, pos = 3, labels = dat$cutpoint)
abline(0, 1)
Nuevamente, no es un verdadero facsímil sino cercano.