W R, jak obliczyć wartość p dla obszaru pod ROC


13

Trudno mi znaleźć sposób na obliczenie wartości p dla obszaru pod charakterystyką operatora odbiornika (ROC). Mam zmienną ciągłą i wynik testu diagnostycznego. Chcę sprawdzić, czy AUROC jest statystycznie istotny.

Znalazłem wiele pakietów zajmujących się krzywymi ROC: pROC, ROCR, caTools, weryfikacja, Epi. Ale nawet po wielu godzinach spędzonych na czytaniu dokumentacji i testowaniu nie mogłem znaleźć sposobu. Chyba właśnie tego przegapiłem.


1
Co to może oznaczać, że obszar pod krzywą będzie „znaczący”?
gung - Przywróć Monikę

Chciałem powiedzieć, że testowanie, czy wartość AUC jest statystycznie różna od 0,5
użytkownik32530

Skąd pochodzi twoja krzywa ROC? Prawdopodobnie chcesz to sprawdzić (np. Istnieje wartość p dla modelu regresji logistycznej jako całości).
gung - Przywróć Monikę

Cóż, moje dane są następujące: mam standardowy test, który umożliwia grupowanie z / bez choroby i chcę znaleźć wartość graniczną dla biologicznego oznaczenia z próbki krwi. Poza tym potrzebuję obszaru pod krzywą. Więc nie, nie mam żadnego modelu regresji
user32530

Masz więc test, który jest wykonywany na próbce krwi pobranej od pacjenta, co daje ci liczbę; i będziesz chciał użyć tego numeru, aby sklasyfikować, czy pacjent ma chorobę. Obecnie masz zestaw liczb z tego testu dla zestawu pacjentów, w których znasz ich prawdziwy stan chorobowy. Czy to wszystko jest poprawne?
gung - Przywróć Monikę

Odpowiedzi:


12

W twojej sytuacji dobrze byłoby wykreślić krzywą ROC i obliczyć pole pod tą krzywą, ale należy to traktować jako uzupełnienie głównej analizy, a nie samej analizy podstawowej. Zamiast tego chcesz dopasować model regresji logistycznej .

Model regresji logistycznej będzie standardowo wyposażony w test modelu jako całości. (W rzeczywistości, ponieważ masz tylko jedną zmienną, ta wartość p będzie taka sama jak wartość p dla zmiennej wyniku testu.) Ta wartość p jest tą, której szukasz. Model pozwoli ci obliczyć przewidywane prawdopodobieństwo zachorowania obserwacji. Charakterystyczny Receiver Operating powie Ci, jak czułość i swoistość będzie kompromis, jeśli używasz różnych progów przekonwertować przewidywane prawdopodobieństwo do przewidywanej klasyfikacji. Ponieważ przewidywane prawdopodobieństwo będzie funkcją zmiennej wyniku testu, informuje również o tym, jak się one kompromisują, jeśli jako wartość progową zastosujesz różne wartości wyników testu.


Jeśli nie jesteś zbytnio zaznajomiony z regresją logistyczną, w Internecie dostępne są pewne zasoby (oprócz strony Wikipedii, do której prowadzi link powyżej):


To było bardzo pouczające. Dziękuję Ci! Dopasowałem więc model logistyczny dwumianowy glm (logit). Następnie porównuję go do modelu zerowego i ten test daje mi wartość p, której szukam?
user32530,

Tak, to powinno zrobić dla ciebie. LR umożliwi także wiele innych rzeczy, ale to może być wszystko, czego potrzebujesz.
gung - Przywróć Monikę

Więc kod będzie wyglądał następująco? GLM.1 <- glm (grupa ~ ciągła zmienna, rodzina = dwumianowy (logit), dane = dane diagnostyczne) podsumowanie (GLM.1) GLM.2 <- glm (grupa ~ 1, rodzina = dwumianowy (logit), dane = dane diagnostyczne) anova (GLM.2, GLM.1, test = „Chisq”)
user32530,

summary(GLM.1)powinien dać ci to, czego potrzebujesz, i myślę, że anova(GLM.1)przetestuje to na modelu zerowym bez konieczności dopasowywania go. Ale twoja droga na pewno zadziała, tak.
gung - Przywróć Monikę

10

Zasadniczo chcesz przetestować H0 = „AUC jest równe 0,5”.

W rzeczywistości jest to równoważne z powiedzeniem H0 = „Rozkład stopni w dwóch grupach jest równy”.

Ta ostatnia jest zerową hipotezą testu Manna-Whitneya (Wilcoxon) (patrz na przykład Gold, 1999 ).

Innymi słowy, możesz bezpiecznie użyć testu Manna-Whitneya-Wilcoxona, aby odpowiedzieć na twoje pytanie (patrz na przykład Mason i Graham, 2002 ). Właśnie to robi pakiet weryfikacyjny wspomniany przez Francka Dernoncourta.


1
Dlaczego warto pokazywać, że prognozy nie są losowe? To nie ocenia przydatności.
Frank Harrell,

1
@FrankHarrell Ponieważ w wielu przypadkach twoje przewidywania mogą nie być lepsze niż losowe - w takim przypadku zgłaszana użyteczność jest w rzeczywistości zerowa. Oczywiście, bardziej użyteczne byłoby zgłoszenie przedziału ufności miar użyteczności (czułości i swoistości). Ale testowanie różnicy między dwiema grupami jest co najmniej powszechne w literaturze klinicznej (i faktycznie tam grupy często się nie różnią) i widziałem, że recenzenci specjalnie o to proszą.
Calimo

To nie ma sensu IMHO. Chcę wiedzieć, jak przydatne jest coś, a nie to, czy jest lepsze niż rzucanie monetą.
Frank Harrell,

Jeśli nie jest to lepsze niż rzucanie monetą, to po co miałbyś wykonywać te wszystkie prace? Po prostu rzuć monetą.
Scott,

4

Możesz użyć roc.area () z weryfikacji pakietu :

install.packages("verification")
library("verification")

# Data used from Mason and Graham (2002).
a<- c(1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990,
 1991, 1992, 1993, 1994, 1995)
d<- c(.928,.576, .008, .944, .832, .816, .136, .584, .032, .016, .28, .024, 0, .984, .952)

A<- data.frame(a,d)
names(A)<- c("year", "p2")

# For model without ties
roc.area(A$event, A$p2)

Wróci $p.value [1] 0.0069930071


Dziękuję bardzo, ale nie mam żadnych wartości cid. Mam standardowy test, który umożliwia grupowanie z / bez choroby i chcę znaleźć wartość graniczną dla biologicznego oznaczenia z próbki krwi. Poza tym potrzebuję obszaru pod krzywą. Więc nie, nie mam regresji. Mam stdtest zmienną binarną i zmienną ciągłą wartości biologicznej
user32530

o ok, myślałem, że masz d, ponieważ zakładałem, że masz już krzywą ROC.
Franck Dernoncourt

3
Zazwyczaj błędem jest szukanie arbitralnej granicy, gdy prawdziwy związek z prawdopodobieństwem choroby jest gładki. Również testowanie hipotezy zerowej, że powierzchnia ROC wynosi 0,5, jest dość nudną hipotezą. W przypadku większości prognoz zależy Ci na tym, jak dobre są prognozy, a nie na tym, czy są one losowe.
Frank Harrell,

Nie ma problemu, i dziękuję, Frank Demoncourt, może jest sposób na uzyskanie d.
user32530,

W dziedzinie medycyny czasami potrzebują tych punktów odcięcia do stworzenia testów diagnostycznych. Z tymi, którzy chcą dowiedzieć się, czy pacjent jest chory, czy nie, aby nie przewidzieć czegoś. Czasami muszą obniżyć koszty dzięki tańszemu określeniu, aby zidentyfikować status choroby.
user32530,

0

Dwie krzywe ROC można porównać za pomocą pROC roc.test(). Daje to również wartość p. Ponadto użycie roc(..., auc=TRUE, ci=TRUE)da ci niższe i wyższe przedziały ufności wraz z AUC na wyjściu podczas tworzenia obiektu ROC, co może być przydatne.

Oto działający przykładowy kod, który sprawdza, czy mile na galon lub masa samochodu są lepszym predyktorem rodzaju przekładni, w którą jest wyposażony (automatyczny lub ręczny):

library(pROC)
roc_object_1 <- roc(mtcars$am, mtcars$mpg, auc=T, ci=T) #gives AUC and CI
roc_object_2 <- roc(mtcars$am, mtcars$wt, auc=T, ci=T) #gives AUC and CI

roc.test(roc_object_1, roc_object_2) #gives p-value

Wydaje się, że ciężar jest znacznie lepszym predyktorem niż zużycie paliwa. Jest to jednak porównanie dwóch krzywych, a nie pojedynczej krzywej z liczbą taką jak 0,5. Patrząc na przedział ufności, aby zobaczyć, czy zawiera on liczbę 0,5, wiemy, czy jest znacząco różny, ale nie daje wartości p.


Czy zapewnia również wartość p?
Michael R. Chernick

Chociaż pytanie jest zadawane konkretnie w odniesieniu do R, nasza ogólna zasada jest taka, że ​​jesteśmy stroną statystyczną (uczenie maszynowe itp.). Pytania i odpowiedzi. Dlatego konieczne jest, aby Q miał zawartość statystyczną, i zdecydowanie zaleca się, aby As nie były dostarczane tylko w kategoriach specyficznych dla oprogramowania. Czy w związku z tym możesz powiedzieć więcej o tym, czym jest ten test i jak działa, poza zwykłym wspomnieniem, że istnieje on w R i pokazaniem kodu R dla niego?
gung - Przywróć Monikę

Ok, zaktualizuję swoją odpowiedź, aby odzwierciedlić pewne dane statystyczne
naco
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.