Jak określić najlepszy punkt odcięcia i jego przedział ufności za pomocą krzywej ROC w R?

51

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):

Krzywa ROC

Moje pytania to:

  1. Jak ustalić punkt odcięcia dla tego testu i przedział ufności, w którym odczyty należy oceniać jako niejednoznaczne?
  2. Jaki jest najlepszy sposób na wizualizację tego (użycie ggplot2)?

Wykres jest renderowany za pomocą ROCRi ggplot2pakietó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
Jurij Pietrowski
źródło

Odpowiedzi:

30

Dziękujemy wszystkim, którzy odpowiedzieli na to pytanie. Zgadzam się, że nie może być jednej poprawnej odpowiedzi, a kryteria w dużym stopniu zależą od celów, które stoją za pewnym testem diagnostycznym.

Wreszcie znalazłem pakiet R OptimalCutpoints dedykowany właśnie do znalezienia punktu odcięcia w tego rodzaju analizach. W rzeczywistości istnieje kilka metod określania punktu odcięcia.

  • „CB” (metoda kosztów i korzyści);
  • „MCT” (minimalizuje czas kosztu błędnej klasyfikacji);
  • „MinValueSp” (minimalna wartość ustawiona dla swoistości);
  • „MinValueSe” (minimalna wartość ustawiona dla czułości);
  • „RangeSp” (zakres wartości ustawiony dla Specyficzności);
  • „RangeSe” (zakres wartości ustawiony dla czułości);
  • „ValueSp” (wartość ustawiona dla Specyficzności);
  • „ValueSe” (wartość ustawiona dla czułości);
  • „MinValueSpSe” (minimalna wartość ustawiona dla swoistości i czułości);
  • „MaxSp” (maksymalizuje swoistość);
  • „MaxSe” (maksymalizuje czułość);
  • „MaxSpSe” (jednocześnie maksymalizuje czułość i swoistość);
  • „Max-SumSpSe” (maksymalizuje sumę czułości i swoistości);
  • „MaxProdSpSe” (maksymalizuje iloczyn czułości i swoistości);
  • „ROC01” (minimalizuje odległość między działką ROC a punktem (0,1));
  • „SpEqualSe” (czułość = swoistość);
  • „Youden” (indeks Youdena);
  • „MaxEfficiency” (maksymalizuje wydajność lub dokładność);
  • „Minimax” (minimalizuje najczęstszy błąd);
  • „AUC” (maksymalizuje zgodność, która jest funkcją AUC);
  • „MaxDOR” (maksymalizuje iloraz szans diagnostycznych);
  • „MaxKappa” (maksymalizuje indeks Kappa);
  • „MaxAccuracyArea” (maksymalizuje obszar dokładności);
  • „MinErrorRate” (minimalizuje współczynnik błędów);
  • „MinValueNPV” (minimalna wartość ustawiona dla ujemnej wartości predykcyjnej);
  • „MinValuePPV” (minimalna wartość ustawiona dla dodatniej wartości predykcyjnej);
  • „MinValueNPVPPV” (minimalna wartość ustawiona dla wartości predykcyjnych);
  • „PROC01” (minimalizuje odległość między działką PROC a punktem (0,1));
  • „NPVEqualPPV” (ujemna wartość predykcyjna = dodatnia wartość predykcyjna);
  • „ValueDLR.Negative” (wartość ustawiona dla ujemnego wskaźnika wiarygodności diagnostycznej);
  • „ValueDLR.Positive” (wartość ustawiona dla dodatniego wskaźnika prawdopodobieństwa diagnostycznego);
  • „MinPvalue” (minimalizuje wartość p związaną ze statystycznym testem chi-kwadrat, który mierzy związek między markerem a wynikiem binarnym uzyskanym przy użyciu punktu odcięcia);
  • „ObservedPrev” (najbliższa obserwowana częstość występowania);
  • „MeanPrev” (wartość najbliższa średniej wartości z testów diagnostycznych);
  • „PrevalenceMatching” (wartość, dla której przewidywana częstość jest praktycznie równa obserwowanej częstości).

Teraz zadanie ogranicza się do wyboru metody, która najlepiej pasuje do każdej sytuacji.

Istnieje wiele innych opcji konfiguracji opisanych w dokumentacji pakietu, w tym kilka metod określania przedziałów ufności i szczegółowy opis każdej z metod.

Jurij Pietrowski
źródło
18
Sama liczba metod jest oznaką arbitralności granicy. A ponieważ stosowanie wartości odcięcia dla zmiennych wejściowych jest całkowicie niewłaściwe i właściwe jest jedynie wyszukiwanie wartości odcięcia (jeśli musisz) na podstawie ogólnej przewidywanej wartości, nie jest jasne, dlaczego tyle wysiłku włożono w to. Jeśli ustawisz optymalną zasadę decyzji Bayesa z funkcją straty, wszystko zostanie załatwione; brak krzywej ROC, brak prawdopodobieństwa cofania się czasu, takich jak czułość i swoistość, brak wartości odcięcia dla zmiennych wejściowych.
Frank Harrell,
@FrankHarrell Czy mógłbyś rozwinąć tę kwestię? „Jeśli ustawisz optymalną zasadę decyzji Bayesa z funkcją straty, wszystko zostanie załatwione”. Gdzie mogę znaleźć więcej literatury na ten temat?
Black Milk
1
Przejrzyj literaturę dotyczącą optymalnych decyzji Bayesa i prawidłowych zasad punktacji.
Frank Harrell,
26

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

Boskowicz
źródło
15

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.

Frank Harrell
źródło
7

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.)

cbeleites obsługuje Monikę
źródło
1
Dokładnie słusznie, że potrzebujesz optymalnej wiedzy, aby uzyskać optymalną decyzję. Ale funkcja straty nie jest podana w odniesieniu do powyższych wielkości, a optymalna decyzja pochodzi z przewidywanego prawdopodobieństwa wyniku dla pojedynczego podmiotu, w połączeniu z funkcją straty.
Frank Harrell,
6

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.

wprowadź opis zdjęcia tutaj

Vladimir Chupakhin
źródło
1
Jeśli przyjrzysz się bliżej kodowi źródłowemu, skorzystałem z tego pakietu i przeczytałem dokumentację do tego pakietu. Nie ma narzędzi do określenia odpowiednich punktów odcięcia i „szarej strefy”
Jurij Pietrowski
1
Zdecydowanie czytam Twój kod, ale nie ma takiego terminu, jak „odpowiednia wartość graniczna”, ale fabuła Dokładność vs. wartość graniczna może dać ci właściwy wgląd. Za pomocą tego wykresu możesz dowiedzieć się, jak znaleźć punkt odcięcia dla maksymalnej dokładności.
Vladimir Chupakhin
2

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.

Patrick Caldon
źródło
1
Eksperyment jest nadal w toku, więc zdobędę więcej punktów danych. Interesuje mnie metodologia (myślę, że jest taka sama dla dowolnej liczby punktów danych). I nie znalazłem żadnej statystycznej metody określania „szarej strefy”, podczas gdy jest ona szeroko stosowana w testach tego typu.
Jurij Pietrowski