Mam dane z testu, który można by wykorzystać do rozróżnienia komórek normalnych i nowotworowych. Zgodnie z krzywą ROC wygląda dobrze do tego celu (pole pod krzywą wynosi 0,9):
Moje pytania to:
- Jak ustalić punkt odcięcia dla tego testu i przedział ufności, w którym odczyty należy oceniać jako niejednoznaczne?
- Jaki jest najlepszy sposób na wizualizację tego (użycie
ggplot2
)?
Wykres jest renderowany za pomocą ROCR
i ggplot2
pakietów:
#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 zawiera następujące dane:
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
źródło
Moim zdaniem istnieje wiele opcji odcięcia. Możesz inaczej oceniać czułość i swoistość (na przykład być może dla ciebie ważniejszy jest test o wysokiej czułości, mimo że oznacza to test o niskiej czułości lub odwrotnie).
Jeśli czułość i swoistość mają dla Ciebie to samo znaczenie, jednym ze sposobów obliczenia wartości odcięcia jest wybranie tej wartości, która minimalizuje odległość euklidesową między krzywą ROC a lewym górnym rogiem wykresu.
Innym sposobem jest użycie wartości, która maksymalizuje (czułość + specyficzność - 1) jako punkt odcięcia.
Niestety nie mam referencji dla tych dwóch metod, ponieważ nauczyłem się ich od profesorów lub innych statystyk. Słyszałem tylko, że odwoływałem się do tej drugiej metody jako do „indeksu Youdena” [1]).
[1] https://en.wikipedia.org/wiki/Youden%27s_J_statistic
źródło
Oprzyj się pokusie znalezienia granicy. O ile nie masz z góry określonej funkcji użyteczności / straty / kosztu, odcięcie staje w obliczu optymalnego podejmowania decyzji. A krzywa ROC nie ma znaczenia dla tego problemu.
źródło
Z matematycznego punktu widzenia potrzebujesz innego warunku do rozwiązania dla granicy.
Możesz przetłumaczyć punkt @ Andrei na: „skorzystaj z wiedzy zewnętrznej na temat problemu”.
Przykładowe warunki:
do tej aplikacji potrzebujemy czułości> = x i / lub specyficzności> = y.
fałszywie ujemny jest 10 x tak zły jak fałszywie dodatni. (To dałoby ci modyfikację najbliższego punktu idealnego rogu.)
źródło
Wizualizuj dokładność w porównaniu z odcięciem. Możesz przeczytać więcej szczegółów w dokumentacji ROCR i bardzo ładną prezentację z tego samego.
źródło
Co ważniejsze - za tą krzywą kryje się niewiele punktów danych. Kiedy zdecydujesz, w jaki sposób zamierzasz dokonać kompromisu czułości / swoistości, zdecydowanie zachęcam cię do rozpoczęcia ładowania krzywej i wynikowej liczby odcięcia. Może się okazać, że w twoim szacunkowym najlepszym punkcie odcięcia jest dużo niepewności.
źródło