In R come calcolare il valore p per l'area sotto ROC


12

Faccio fatica a trovare un modo per calcolare il valore p per l'area sotto una caratteristica dell'operatore del ricevitore (ROC). Ho una variabile continua e un risultato del test diagnostico. Voglio vedere se AUROC è statisticamente significativo.

Ho trovato molti pacchetti relativi alle curve ROC: pROC, ROCR, caTools, verifica, Epi. Ma anche dopo molte ore trascorse a leggere la documentazione e i test, non sono riuscito a trovare il modo. Penso di essermi perso.


1
Cosa potrebbe significare che l'area sotto la curva sia "significativa"?
gung - Ripristina Monica

Volevo dire test se il valore AUC è statisticamente diverso da 0,5
user32530

Da dove viene la tua curva ROC? Presumibilmente vuoi un test di questo (ad esempio, esiste un valore p per un modello di regressione logistica preso nel suo insieme).
gung - Ripristina Monica

Bene, i miei dati sono i seguenti, ho un test standard che rende il raggruppamento con / senza malattia e voglio trovare un valore soglia per una determinazione biologica da un campione di sangue. Inoltre ho bisogno dell'area sotto la curva. Quindi no, non ho alcun modello di regressione
user32530

Quindi hai qualche test che viene eseguito su un campione di sangue prelevato da un paziente, che ti dà un numero; e vorrai usare quel numero per classificare se il paziente ha la malattia. Al momento, hai un set di numeri da questo test per un set di pazienti in cui conosci il loro vero stato di malattia. È tutto corretto?
gung - Ripristina Monica

Risposte:


12

Nella tua situazione sarebbe bene tracciare una curva ROC e calcolare l'area sotto quella curva, ma questo dovrebbe essere considerato come supplementare alla tua analisi principale, piuttosto che all'analisi primaria stessa. Invece, si desidera adattare un modello di regressione logistica .

Il modello di regressione logistica verrà fornito di serie con un test del modello nel suo insieme. (In realtà, poiché hai solo una variabile, quel valore p sarà lo stesso del valore p per la tua variabile del risultato del test.) Quel valore p è quello che stai cercando. Il modello ti consentirà di calcolare la probabilità prevista di un'osservazione malata. Una caratteristica operativa del ricevitore indica come la sensibilità e la specificità verranno scambiate, se si utilizzano soglie diverse per convertire la probabilità prevista in una classificazione prevista. Poiché la probabilità prevista sarà una funzione della variabile del risultato del test, ti verrà anche spiegato come si scambiano se usi valori di risultato del test diversi come soglia.


Se non si ha familiarità con la regressione logistica, ci sono alcune risorse disponibili su Internet (oltre alla pagina Wikipedia collegata sopra):


È stato molto illuminante. Grazie! Quindi inserisco un modello logistico glm binomial (logit). Quindi lo confronto con un modello nullo e quel test mi dà il valore p che sto cercando?
user32530

Sì, dovrebbe farlo per te. LR renderà possibili anche molte altre cose, ma potrebbe essere tutto ciò di cui hai bisogno.
gung - Ripristina Monica

Quindi il codice sarebbe come il seguente? GLM.1 <- glm (Gruppo ~ continueVar, famiglia = binomiale (logit), dati = dati diagnostici) sintesi (GLM.1) GLM.2 <- glm (Gruppo ~ 1, famiglia = binomiale (logit), dati = diagnosticoDati) anova (GLM.2, GLM.1, test = "Chisq")
user32530

summary(GLM.1)dovrebbe darti ciò di cui hai bisogno, e penso che anova(GLM.1)lo testerà contro il modello nullo senza che tu debba effettivamente adattarlo. Ma la tua strada funzionerà sicuramente, sì.
gung - Ripristina Monica

9

Fondamentalmente si desidera testare H0 = "L'AUC è uguale a 0,5".

Questo è in effetti equivalente a dire H0 = "La distribuzione dei ranghi nei due gruppi è uguale".

Quest'ultima è l'ipotesi nulla del test di Mann-Whitney (Wilcoxon) (vedi ad esempio Gold, 1999 ).

In altre parole, puoi tranquillamente utilizzare un test Mann-Whitney-Wilcoxon per rispondere alla tua domanda (vedi ad esempio Mason & Graham, 2002 ). Questo è esattamente ciò che fa il pacchetto di verifica menzionato da Franck Dernoncourt.


Perché sarebbe interessante mostrare che le previsioni non sono casuali? Ciò non valuta l'utilità.
Frank Harrell,

1
@FrankHarrell Perché in molti casi le tue previsioni potrebbero non essere migliori di quelle casuali, nel qual caso l'utilità che riferisci è effettivamente nulla. Certo, sarebbe più utile segnalare un intervallo di confidenza delle misure di utilità (sensibilità e specificità). Ma testare la differenza tra due gruppi è almeno comune nella letteratura clinica (e in effetti i gruppi spesso non differiscono) e ho visto i revisori chiederlo in modo specifico.
Calimo,

Questo ha poco senso IMHO. Voglio sapere quanto è utile qualcosa, non se è meglio che semplicemente lanciare una moneta.
Frank Harrell,

Se non è meglio che lanciare una moneta, allora perché dovresti passare tutto quel lavoro? Basta lanciare la moneta.
Scott,

4

Puoi usare roc.area () dalla verifica del pacchetto :

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)

Tornerà $p.value [1] 0.0069930071


Grazie mille, ma non ho valori c e d. Ho un test standard che rende il raggruppamento con / senza malattia e voglio trovare un valore di soglia per una determinazione biologica da un campione di sangue. Inoltre ho bisogno dell'area sotto la curva. Quindi no, non ho alcuna regressione. Ho la variabile binaria più stdtest e la variabile continua valore biologico
user32530

oh ok pensavo che avessi d, dato che immaginavo che tu avessi già una curva ROC.
Franck Dernoncourt l'

3
Di solito è un errore cercare un taglio arbitrario quando la vera relazione con la probabilità della malattia è regolare. Inoltre, testare l'ipotesi nulla che l'area ROC sia 0,5 è un'ipotesi abbastanza noiosa. Per la maggior parte delle previsioni ti interessa quanto sia buona la previsione, non se sia casuale.
Frank Harrell,

Nessun problema, e grazie, Frank Demoncourt, forse c'è un modo per ottenere d.
user32530

In campo medico a volte hanno bisogno di quei punti di taglio per creare test diagnostici. Con quelli che vogliono scoprire se il soggetto è malato o no, non prevedere qualcosa. A volte hanno bisogno di tagliare i costi con una determinazione più economica per identificare lo stato della malattia.
user32530

0

Utilizzando pROC è possibile confrontare due curve ROC roc.test(). Questo produce anche un valore p. Inoltre, l'utilizzo roc(..., auc=TRUE, ci=TRUE)fornirà gli intervalli di confidenza più bassi e più alti insieme all'AUC nell'output durante la creazione dell'oggetto ROC, che può essere utile.

Di seguito è riportato un codice di esempio funzionante che verifica se le miglia per gallone o il peso di un'auto sono un migliore predittore del tipo di trasmissione di cui è dotata (automatica o manuale):

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

Sembra che il peso sia un fattore predittivo significativamente migliore rispetto al consumo di carburante. Tuttavia, si tratta di confrontare due curve e non una singola curva rispetto a un numero come 0,5. Osservare l'intervallo di confidenza per vedere se contiene il numero 0,5 ci dice se è significativamente diverso, ma non produce un valore p.


Fornisce anche il valore p?
Michael R. Chernick,

Sebbene la domanda sia posta specificamente in termini di R, la nostra politica generale qui è che siamo un sito di domande e risposte statistiche (apprendimento automatico, ecc.). Pertanto, è necessario che un Q abbia un contenuto statistico, ed è fortemente preferito che As non sia fornito solo in termini specifici del software. Alla luce di ciò, puoi dire di più su cosa è questo test e come funziona, oltre a menzionare che esiste in R e mostrare il codice R per esso?
gung - Ripristina Monica

Ok, aggiornerò la mia risposta per riflettere un po 'di background statistico
naco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.