Tengo los datos de una prueba que podría usarse para distinguir células normales y tumorales. De acuerdo con la curva ROC, se ve bien para este propósito (el área bajo la curva es 0.9):
Mis preguntas son:
- ¿Cómo determinar el punto de corte para esta prueba y su intervalo de confianza donde las lecturas deben considerarse ambiguas?
- ¿Cuál es la mejor manera de visualizar esto (usando
ggplot2
)?
El gráfico se representa usando ROCR
y ggplot2
paquetes:
#install.packages("ggplot2","ROCR","verification") #if not installed yet
library("ggplot2")
library("ROCR")
library("verification")
d <-read.csv2("data.csv", sep=";")
pred <- with(d,prediction(x,test))
perf <- performance(pred,"tpr", "fpr")
auc <-performance(pred, measure = "auc")@y.values[[1]]
rd <- data.frame(x=perf@x.values[[1]],y=perf@y.values[[1]])
p <- ggplot(rd,aes(x=x,y=y)) + geom_path(size=1)
p <- p + geom_segment(aes(x=0,y=0,xend=1,yend=1),colour="black",linetype= 2)
p <- p + geom_text(aes(x=1, y= 0, hjust=1, vjust=0, label=paste(sep = "", "AUC = ",round(auc,3) )),colour="black",size=4)
p <- p + scale_x_continuous(name= "False positive rate")
p <- p + scale_y_continuous(name= "True positive rate")
p <- p + opts(
axis.text.x = theme_text(size = 10),
axis.text.y = theme_text(size = 10),
axis.title.x = theme_text(size = 12,face = "italic"),
axis.title.y = theme_text(size = 12,face = "italic",angle=90),
legend.position = "none",
legend.title = theme_blank(),
panel.background = theme_blank(),
panel.grid.minor = theme_blank(),
panel.grid.major = theme_line(colour='grey'),
plot.background = theme_blank()
)
p
data.csv contiene los siguientes datos:
x;group;order;test
56;Tumor;1;1
55;Tumor;1;1
52;Tumor;1;1
60;Tumor;1;1
54;Tumor;1;1
43;Tumor;1;1
52;Tumor;1;1
57;Tumor;1;1
50;Tumor;1;1
34;Tumor;1;1
24;Normal;2;0
34;Normal;2;0
22;Normal;2;0
32;Normal;2;0
25;Normal;2;0
23;Normal;2;0
23;Normal;2;0
19;Normal;2;0
56;Normal;2;0
44;Normal;2;0
fuente
En mi opinión, hay múltiples opciones de corte. Puede ponderar la sensibilidad y la especificidad de manera diferente (por ejemplo, tal vez para usted es más importante hacerse una prueba de alta sensibilidad, aunque esto significa tener una prueba específica baja o viceversa).
Si la sensibilidad y la especificidad tienen la misma importancia para usted, una forma de calcular el límite es elegir ese valor que minimice la distancia euclidiana entre su curva ROC y la esquina superior izquierda de su gráfico.
Otra forma es usar el valor que maximiza (sensibilidad + especificidad - 1) como punto de corte.
Desafortunadamente, no tengo referencias para estos dos métodos, ya que los aprendí de profesores u otros estadísticos. Solo he escuchado referirse al último método como el 'índice de Youden' [1]).
[1] https://en.wikipedia.org/wiki/Youden%27s_J_statistic
fuente
Resista la tentación de encontrar un límite. A menos que tenga una función de utilidad / pérdida / costo preespecificada, un límite va en contra de la toma de decisiones óptima. Y una curva ROC es irrelevante para este problema.
fuente
Matemáticamente hablando, necesitas otra condición para resolver el límite.
Puede traducir el punto de @ Andrea a: "usar conocimiento externo sobre el problema subyacente".
Condiciones de ejemplo:
para esta aplicación, necesitamos sensibilidad> = x, y / o especificidad> = y.
un falso negativo es 10 veces más malo que un falso positivo. (Eso le daría una modificación del punto más cercano a la esquina ideal).
fuente
Visualice la precisión versus el corte. Puede leer más detalles en la documentación de ROCR y una muy buena presentación de la misma.
fuente
Lo que es más importante: hay muy pocos puntos de datos detrás de esta curva. Cuando decida cómo va a hacer la compensación de sensibilidad / especificidad, le recomiendo encarecidamente que inicie la curva y el número de corte resultante. Puede encontrar que hay mucha incertidumbre en su mejor corte estimado.
fuente