In R, wie der p-Wert für die Fläche unter ROC berechnet wird


12

Ich habe Mühe, einen Weg zu finden, um den p-Wert für das Gebiet unter einer Empfängeroperatorcharakteristik (ROC) zu berechnen. Ich habe eine kontinuierliche Variable und ein diagnostisches Testergebnis. Ich möchte sehen, ob AUROC statistisch signifikant ist.

Ich habe viele Pakete gefunden, die sich mit ROC-Kurven befassen: pROC, ROCR, caTools, verification, Epi. Aber selbst nach vielen Stunden, in denen ich die Dokumentation gelesen und getestet hatte, konnte ich nicht herausfinden, wie. Ich glaube, ich habe es einfach verpasst.


1
Was könnte es möglicherweise bedeuten, dass der Bereich unter der Kurve "signifikant" ist?
gung - Wiedereinsetzung von Monica

Ich wollte testen, ob der AUC-Wert statistisch von 0,5
abweicht

Woher stammt Ihre ROC-Kurve? Vermutlich möchten Sie dies testen (z. B. gibt es einen p-Wert für ein logistisches Regressionsmodell als Ganzes).
gung - Wiedereinsetzung von Monica

Nun, meine Daten sind wie folgt, ich habe einen Standardtest, der die Gruppierung mit / ohne Krankheit vornimmt, und ich möchte einen Grenzwert für eine biologische Bestimmung aus einer Blutprobe finden. Außerdem brauche ich den Bereich unter der Kurve. Also nein, ich habe kein Regressionsmodell
user32530

Sie haben also einen Test, der an einer Blutprobe durchgeführt wird, die einem Patienten entnommen wurde, und der Ihnen eine Nummer gibt. & Sie möchten diese Nummer verwenden, um zu klassifizieren, ob der Patient an der Krankheit leidet. Gegenwärtig haben Sie eine Reihe von Zahlen aus diesem Test für eine Reihe von Patienten, bei denen Sie ihren wahren Krankheitszustand kennen. Ist das alles richtig?
gung - Wiedereinsetzung von Monica

Antworten:


12

In Ihrer Situation ist es in Ordnung, eine ROC-Kurve zu zeichnen und die Fläche unter dieser Kurve zu berechnen. Dies sollte jedoch als Ergänzung zu Ihrer Hauptanalyse und nicht zur Hauptanalyse selbst betrachtet werden. Stattdessen möchten Sie ein logistisches Regressionsmodell anpassen.

Das logistische Regressionsmodell wird standardmäßig mit einem Test des gesamten Modells geliefert. (Da Sie nur eine Variable haben, ist dieser p-Wert der gleiche wie der p-Wert für Ihre Testergebnisvariable.) Dieser p-Wert ist derjenige, nach dem Sie suchen. Mit dem Modell können Sie die vorhergesagte Wahrscheinlichkeit einer Erkrankung einer Beobachtung berechnen. Eine Empfänger-Betriebscharakteristik gibt an, wie sich die Empfindlichkeit und Spezifität auswirken, wenn Sie verschiedene Schwellenwerte verwenden, um die vorhergesagte Wahrscheinlichkeit in eine vorhergesagte Klassifikation umzuwandeln. Da die vorhergesagte Wahrscheinlichkeit eine Funktion Ihrer Testergebnisvariablen ist, erfahren Sie auch, wie sich diese auswirken, wenn Sie unterschiedliche Testergebniswerte als Schwellenwert verwenden.


Wenn Sie mit logistischen Regressionen nicht besonders vertraut sind, stehen im Internet einige Ressourcen zur Verfügung (neben der oben verlinkten Wikipedia-Seite):


Das war sehr aufschlussreich. Vielen Dank! Also passe ich ein logistisches Modell glm binomial (logit) an. Dann vergleiche ich es mit einem Nullmodell und dieser Test gibt mir den p-Wert, den ich suche?
user32530

Ja, das sollte es für dich tun. LR wird auch viele andere Dinge möglich machen, aber das könnte alles sein, was Sie brauchen.
gung - Wiedereinsetzung von Monica

Der Code würde also wie folgt aussehen? GLM.1 <- glm (Group ~ continuousVar, family = binomial (logit), data = diagnosticData) Zusammenfassung (GLM.1) GLM.2 <- glm (Group ~ 1, family = binomial (logit), data = diagnosticData) anova (GLM.2, GLM.1, test = "Chisq")
user32530

summary(GLM.1)sollten Sie geben, was Sie brauchen, und ich denke, anova(GLM.1)wird es gegen das Nullmodell testen, ohne dass Sie es tatsächlich auch passen müssen. Aber Ihr Weg wird auf jeden Fall funktionieren, ja.
gung - Wiedereinsetzung von Monica

8

Grundsätzlich möchten Sie testen, H0 = "Die AUC ist gleich 0,5".

Dies ist in der Tat gleichbedeutend mit H0 = "Die Verteilung der Reihen in den beiden Gruppen ist gleich".

Letzteres ist die Nullhypothese des Mann-Whitney (Wilcoxon) -Tests (siehe zum Beispiel Gold, 1999 ).

Mit anderen Worten, Sie können sicher einen Mann-Whitney-Wilcoxon-Test verwenden, um Ihre Frage zu beantworten (siehe zum Beispiel Mason & Graham, 2002 ). Genau das leistet das von Franck Dernoncourt erwähnte Verifizierungspaket.


Warum sollte es von Interesse sein zu zeigen, dass Vorhersagen nicht zufällig sind? Das bewertet den Nutzen nicht.
Frank Harrell

@FrankHarrell Weil Ihre Vorhersagen in vielen Fällen nicht besser als zufällig sind - in diesem Fall ist der von Ihnen gemeldete Nutzen tatsächlich gleich Null. Sicherlich wäre es sinnvoller, ein Konfidenzintervall der Nutzenmaße (Sensitivität und Spezifität) anzugeben. Aber das Testen des Unterschieds zwischen zwei Gruppen ist zumindest in der klinischen Literatur weit verbreitet (und tatsächlich unterscheiden sich die Gruppen häufig nicht), und ich sah, dass Rezensenten speziell danach fragten.
Calimo

Das macht meiner Meinung nach wenig Sinn. Ich möchte wissen, wie nützlich etwas ist, nicht, ob es besser ist, als nur eine Münze zu werfen.
Frank Harrell

Wenn es nicht besser ist, als eine Münze zu werfen, warum sollten Sie dann diese ganze Arbeit durchgehen? Wirf einfach die Münze.
Scott

4

Sie können mit roc.area () aus der Verpackung Überprüfung :

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)

Es wird zurückkehren $p.value [1] 0.0069930071


Vielen Dank, aber ich habe keine c- und d-Werte. Ich habe einen Standardtest, der die Gruppierung in mit / ohne Krankheit vornimmt, und ich möchte einen Grenzwert für eine biologische Bestimmung aus einer Blutprobe finden. Außerdem brauche ich den Bereich unter der Kurve. Also nein, ich habe keine Regression. Ich habe die binäre Variable stdtest und die kontinuierliche Variable
biodvalue

oh ok ich dachte du hättest d, als ich annahm du hattest schon eine ROC kurve.
Franck Dernoncourt

3
Es ist normalerweise ein Fehler, einen willkürlichen Grenzwert zu suchen, wenn die wahre Beziehung zur Krankheitswahrscheinlichkeit glatt ist. Auch das Testen der Nullhypothese, dass der ROC-Bereich 0,5 beträgt, ist eine ziemlich langweilige Hypothese. Für die meisten Vorhersagen ist es Ihnen wichtig, wie gut die Vorhersage ist und nicht, ob sie zufällig ist.
Frank Harrell

Kein Problem, und danke, Frank Demoncourt, vielleicht gibt es einen Weg, d.
user32530

Im medizinischen Bereich benötigen sie manchmal diese Grenzpunkte, um Diagnosetests zu erstellen. Mit denen wollen sie herausfinden, ob das Subjekt krank ist oder nicht, um etwas nicht vorherzusagen. Manchmal müssen sie die Kosten mit einer billigeren Methode senken, um den Krankheitsstatus zu ermitteln.
user32530

0

Mit können zwei ROC-Kurven in pROC verglichen werden roc.test(). Dies erzeugt auch einen p-Wert. roc(..., auc=TRUE, ci=TRUE)Wenn Sie außerdem verwenden , erhalten Sie die niedrigeren und höheren Konfidenzintervalle zusammen mit der AUC in der Ausgabe, während Sie das ROC-Objekt erstellen. Dies kann hilfreich sein.

Das Folgende ist ein funktionierender Beispielcode, der testet, ob die Meilen pro Gallone oder das Gewicht eines Autos ein besserer Prädiktor für die Art des Getriebes sind, mit dem es ausgestattet ist (automatisch oder manuell):

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

Das Gewicht ist anscheinend ein deutlich besserer Prädiktor als der Kraftstoffverbrauch. Dies vergleicht jedoch zwei Kurven und keine einzelne Kurve mit einer Zahl wie 0,5. Wenn Sie sich das Konfidenzintervall ansehen, um festzustellen, ob es die Zahl 0,5 enthält, können Sie feststellen, ob es sich erheblich unterscheidet, aber keinen p-Wert liefert.


Gibt es auch den p-Wert an?
Michael R. Chernick

Obwohl die Frage speziell in Bezug auf R gestellt wird, ist unsere allgemeine Richtlinie hier, dass wir eine Frage- und Antwort- Site für Statistiken (maschinelles Lernen usw.) sind. Daher muss ein Q einen statistischen Inhalt haben, und es wird nachdrücklich bevorzugt, dass As nicht nur softwarespezifisch bereitgestellt wird. Können Sie vor diesem Hintergrund mehr darüber sagen, was dieser Test ist und wie er funktioniert, als nur zu erwähnen, dass er in R vorhanden ist und den R-Code dafür anzeigt?
gung - Reinstate Monica

Ok, ich werde meine Antwort aktualisieren, um statistischen Hintergrund
widerzuspiegeln
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.