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.