En R cómo calcular el valor p para el área bajo ROC

12

Me cuesta encontrar una manera de calcular el valor p para el área bajo una característica del operador receptor (ROC). Tengo una variable continua y un resultado de prueba de diagnóstico. Quiero ver si AUROC es estadísticamente significativo.

Encontré muchos paquetes relacionados con curvas ROC: pROC, ROCR, caTools, verificación, Epi. Pero incluso después de pasar muchas horas leyendo la documentación y las pruebas, no pude encontrar cómo. Creo que me lo perdí.

usuario32530
fuente
1
¿Qué podría significar que el área bajo la curva sea 'significativa'?
gung - Restablece a Monica
Quería decir probar si el valor de AUC es estadísticamente diferente de 0.5
user32530
¿De dónde vino tu curva ROC? Presumiblemente, desea una prueba de eso (por ejemplo, hay un valor p para un modelo de regresión logística en su conjunto).
gung - Restablece a Monica
Bueno, mis datos son como los siguientes, tengo una prueba estándar que agrupa al grupo con / sin enfermedad, y quiero encontrar un valor de corte para una determinación biológica a partir de una muestra de sangre. Además de eso, necesito el área debajo de la curva. Entonces no, no tengo ningún modelo de regresión
user32530
Entonces, tiene una prueba que se realiza en una muestra de sangre extraída de un paciente, que le da un número; & querrá usar ese número para clasificar si el paciente tiene la enfermedad. En la actualidad, tiene un conjunto de números de esta prueba para un conjunto de pacientes donde conoce su verdadero estado de enfermedad. ¿Es todo eso correcto?
gung - Restablece a Monica

Respuestas:

12

En su situación, estaría bien trazar una curva ROC y calcular el área bajo esa curva, pero esto debe considerarse como un complemento de su análisis principal, en lugar del análisis primario en sí. En cambio, desea ajustar un modelo de regresión logística .

El modelo de regresión logística vendrá de serie con una prueba del modelo en su conjunto. (En realidad, dado que solo tiene una variable, ese valor p será el mismo que el valor p para la variable de resultado de la prueba). Ese valor p es el que busca. El modelo le permitirá calcular la probabilidad pronosticada de que una observación esté enferma. Una característica de funcionamiento del receptor le indica cómo se compensarán la sensibilidad y la especificidad , si utiliza diferentes umbrales para convertir la probabilidad pronosticada en una clasificación pronosticada. Dado que la probabilidad pronosticada será una función de la variable de resultado de su prueba, también le indica cómo se intercambian si utiliza diferentes valores de resultados de prueba como su umbral.


Si no está muy familiarizado con la regresión logística, hay algunos recursos disponibles en Internet (además de la página de Wikipedia vinculada anteriormente):

gung - Restablece a Monica
fuente
Eso fue muy esclarecedor. ¡Gracias! Así que me ajusto a un modelo logístico glm binomial (logit). Luego lo comparo con un modelo nulo y esa prueba me da el valor p que estoy buscando.
user32530
Sí, eso debería hacerlo por ti. LR también hará posible muchas otras cosas, pero eso puede ser todo lo que necesita.
gung - Restablece a Monica
¿Entonces el código sería como el siguiente? GLM.1 <- glm (Grupo ~ ContinuoVar, familia = binomial (logit), datos = diagnósticoDatos) resumen (GLM.1) GLM.2 <- glm (Grupo ~ 1, familia = binomial (logit), datos = DiagnósticoData) anova (GLM.2, GLM.1, test = "Chisq")
usuario32530
summary(GLM.1)debería darle lo que necesita, y creo que anova(GLM.1)lo probará contra el modelo nulo sin que realmente tenga que ajustarlo también. Pero tu camino definitivamente funcionará, sí.
gung - Restablece a Monica
9

Básicamente desea probar H0 = "El AUC es igual a 0.5".

De hecho, esto equivale a decir H0 = "La distribución de los rangos en los dos grupos es igual".

Esta última es la hipótesis nula de la prueba de Mann-Whitney (Wilcoxon) (véase, por ejemplo , Gold, 1999 ).

En otras palabras, puede utilizar con seguridad una prueba de Mann-Whitney-Wilcoxon para responder a su pregunta (ver, por ejemplo, Mason y Graham, 2002 ). Esto es exactamente lo que hace el paquete de verificación mencionado por Franck Dernoncourt.

Calimo
fuente
¿Por qué sería interesante mostrar que las predicciones no son aleatorias? Eso no evalúa la utilidad.
Frank Harrell
1
@FrankHarrell Porque en muchos casos sus predicciones pueden no ser mejores que aleatorias, en cuyo caso la utilidad que informa es realmente nula. Claro, informar un intervalo de confianza de las medidas de utilidad (sensibilidad y especificidad) sería más útil. Pero probar la diferencia entre dos grupos es común en la literatura clínica al menos (y de hecho allí los grupos a menudo no difieren) y vi a los revisores que lo solicitaban específicamente.
Calimo
Eso tiene poco sentido en mi humilde opinión. Quiero saber qué tan útil es algo, no si es mejor que simplemente lanzar una moneda.
Frank Harrell
Si no es mejor que lanzar una moneda, ¿por qué pasarías por todo ese trabajo? Solo lanza la moneda.
Scott
4

Puede usar roc.area () desde la verificación del paquete :

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)

Volverá $p.value [1] 0.0069930071

Franck Dernoncourt
fuente
Muchas gracias, pero no tengo ningún valor cyd. Tengo una prueba estándar que hace la agrupación con / sin enfermedad, y quiero encontrar un valor de corte para una determinación biológica a partir de una muestra de sangre. Además de eso, necesito el área debajo de la curva. Entonces no, no tengo ninguna regresión. Tengo la variable binaria estándar y la variable continua de valor biológico
user32530
oh ok, pensé que tenías d, ya que supuse que ya tenías una curva ROC.
Franck Dernoncourt
3
Por lo general, es un error buscar un corte arbitrario cuando la verdadera relación con la probabilidad de enfermedad es suave. Además, probar la hipótesis nula de que el área ROC es 0.5 es una hipótesis bastante aburrida. Para la mayoría de las predicciones, le importa lo buena que sea la predicción, no si es aleatoria.
Frank Harrell
No hay problema, y ​​gracias, Frank Demoncourt, tal vez hay una manera de obtener d.
user32530
En el campo de la medicina, a veces necesitan esos puntos de corte para crear pruebas de diagnóstico. Con aquellos que quieren saber si el sujeto está enfermo o no, no para predecir algo. A veces necesitan reducir costos con una determinación más barata para identificar el estado de la enfermedad.
user32530
0

Se pueden comparar dos curvas ROC en pROC usando roc.test(). Esto también produce un valor p. Además, el uso roc(..., auc=TRUE, ci=TRUE)le dará los intervalos de confianza cada vez más bajos junto con el AUC en la salida mientras crea el objeto ROC, lo que puede ser útil.

El siguiente es un código de ejemplo que prueba si las millas por galón o el peso de un automóvil predicen mejor el tipo de transmisión con la que viene equipado (automático o manual):

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

Parece que el peso es un predictor significativamente mejor que el consumo de combustible. Sin embargo, esto está comparando dos curvas, y no una sola curva contra un número como 0.5. Observar el intervalo de confianza para ver si contiene el número 0.5 nos dice si es significativamente diferente, pero no produce un valor p.

naco
fuente
¿Proporciona el valor p también?
Michael R. Chernick
Aunque la pregunta se hace específicamente en términos de R, nuestra política general aquí es que somos un sitio de preguntas y respuestas sobre estadísticas (aprendizaje automático, etc.). Por lo tanto, es necesario que una Q tenga contenido estadístico, y se recomienda que As no solo se proporcione en términos específicos de software. A la luz de eso, ¿puede decir más sobre qué es esta prueba y cómo funciona, más allá de mencionar que existe en R y mostrar el código R para ella?
gung - Restablece a Monica
Ok, actualizaré mi respuesta para reflejar algunos antecedentes estadísticos
naco