Gráficos de diagnóstico para la regresión de conteo

88

¿Qué gráficos de diagnóstico (y quizás pruebas formales) encuentra más informativos para las regresiones en las que el resultado es una variable de conteo?

Estoy especialmente interesado en los modelos binomiales de Poisson y negativos, así como en sus homólogos inflados a cero y obstáculos de cada uno. La mayoría de las fuentes que he encontrado simplemente trazan los valores residuales frente a los valores ajustados sin discutir cómo "deberían" verse estos gráficos.

Sabiduría y referencias muy apreciadas. La historia de fondo sobre por qué pregunto esto, si es relevante, es mi otra pregunta .

Discusiones relacionadas:

medio paso
fuente

Respuestas:

101

Esto es lo que generalmente me gusta hacer (por ejemplo, uso los datos de quine dispersos y no muy fáciles de modelar de los días de los alumnos ausentes de la escuela MASS):

  1. Pruebe y grafique los datos de recuento originales trazando las frecuencias observadas y las frecuencias ajustadas (consulte el capítulo 2 en Friendly ) que el vcdpaquete admite Ren partes grandes. Por ejemplo, con goodfity a rootogram:

    library(MASS)
    library(vcd)
    data(quine) 
    fit <- goodfit(quine$Days) 
    summary(fit) 
    rootogram(fit)
    

    o con gráficos de Ord que ayudan a identificar qué modelo de datos de conteo está subyacente (por ejemplo, aquí la pendiente es positiva y la intersección es positiva, lo que habla de una distribución binomial negativa):

    Ord_plot(quine$Days)

    o con las gráficas "XXXXXXness" donde XXXXX es la distribución de elección, diga la gráfica de Poissoness (que habla en contra de Poisson, intente también type="nbinom"):

    distplot(quine$Days, type="poisson")
  2. Inspeccione las medidas habituales de bondad de ajuste (como las estadísticas de razón de probabilidad versus un modelo nulo o similar):

    mod1 <- glm(Days~Age+Sex, data=quine, family="poisson")
    summary(mod1)
    anova(mod1, test="Chisq")
    
  3. Verifique la dispersión excesiva / insuficiente mirando residual deviance/dfo en una estadística de prueba formal (por ejemplo, vea esta respuesta ). Aquí tenemos claramente sobredispersión:

    library(AER)
    deviance(mod1)/mod1$df.residual
    dispersiontest(mod1)
    
  4. Verifique los puntos influyentes y de apalancamiento , por ejemplo, con el influencePloten el carpaquete. Por supuesto, aquí muchos puntos son muy influyentes porque Poisson es un mal modelo:

    library(car)
    influencePlot(mod1)
    
  5. Verifique la inflación cero ajustando un modelo de datos de conteo y su contraparte inflada / obstáculo cero y compárelos (generalmente con AIC). Aquí, un modelo inflado a cero encajaría mejor que el Poisson simple (de nuevo probablemente debido a una sobredispersión):

    library(pscl)
    mod2 <- zeroinfl(Days~Age+Sex, data=quine, dist="poisson")
    AIC(mod1, mod2)
    
  6. Grafique los residuos (sin procesar, desviados o escalados) en el eje y frente a los valores pronosticados (log) (o el predictor lineal) en el eje x. Aquí vemos algunos residuos muy grandes y una desviación sustancial de los residuos de desviación de lo normal (hablando en contra del Poisson; Editar: @ La respuesta de FlorianHartig sugiere que la normalidad de estos residuos no es de esperar, por lo que esta no es una pista concluyente):

    res <- residuals(mod1, type="deviance")
    plot(log(predict(mod1)), res)
    abline(h=0, lty=2)
    qqnorm(res)
    qqline(res)
    
  7. Si está interesado, trace una gráfica de probabilidad de residuos de la mitad de la normal mediante la representación de residuos absolutos ordenados frente a los valores normales esperados de Atkinson (1981) . Una característica especial sería simular una 'línea' de referencia y un sobre con intervalos de confianza simulados / arrancados (aunque no se muestran):

    library(faraway)
    halfnorm(residuals(mod1))
    
  8. Gráficos de diagnóstico para modelos lineales de registro para datos de recuento (ver capítulos 7.2 y 7.7 en el libro de Friendly). Trace los valores predichos frente a los observados, tal vez con una estimación de intervalo (lo hice solo para los grupos de edad; aquí vemos nuevamente que estamos bastante lejos con nuestras estimaciones debido a la sobredispersión aparte, tal vez, en el grupo F3. Los puntos rosados ​​son la predicción de puntos un error estándar):±

    plot(Days~Age, data=quine) 
    prs  <- predict(mod1, type="response", se.fit=TRUE)
    pris <- data.frame("pest"=prs[[1]], "lwr"=prs[[1]]-prs[[2]], "upr"=prs[[1]]+prs[[2]])
    points(pris$pest ~ quine$Age, col="red")
    points(pris$lwr  ~ quine$Age, col="pink", pch=19)
    points(pris$upr  ~ quine$Age, col="pink", pch=19)
    

Esto debería brindarle mucha información útil sobre su análisis y la mayoría de los pasos funcionan para todas las distribuciones de datos de conteo estándar (por ejemplo, Poisson, Binomial negativo, COM Poisson, Leyes de potencia).

Momo
fuente
66
Gran respuesta completa! También fue útil analizar estos diagnósticos con datos simulados por Poisson para entrenar mi ojo con el aspecto que deberían tener las gráficas.
medio pase el
¿Debería haber dado más explicaciones sobre lo que hacen las tramas o estaba bien de esta manera?
Momo
2
Nota al margen interesante: Estoy descubriendo que la distribución NB rara vez parece ajustarse a los datos NB simulados basados ​​en la prueba GOF, el rootograma, el diagrama de Ord y el diagrama de NB-ness. La excepción parece ser datos NB muy "domesticados" que son casi simétricos: mu alta, teta alta.
medio pase el
1
Hm, ¿estás seguro de que usas type = "nbinomial" como argumento? Por ejemplo, fm <- glm.nb (Días ~., Datos = quine); dummy <- rnegbin (ajustado (fm), theta = 4.5) funciona bien.
Momo
@Momo, gracias. Estaba haciendo algo como x = rnegbin (n = 1000, mu = 10, theta = 1); fit = goodfit (x, type = "nbinomial"); resumen (ajuste). Establecer theta = 4.5 mejora el ajuste, pero a menudo sigue siendo p <0.05 y el rootograma puede verse bastante mal. Solo para que entienda la diferencia entre nuestras simulaciones: en la suya, cada valor de dummy se simuló a partir de un parámetro medio diferente (un valor en ajustado (fm)), ¿verdad? En la mía, todos tienen una media de 10.
medio pase el
14

Para el enfoque de usar diagramas de diagnóstico estándar pero queriendo saber cómo deberían verse, me gusta el artículo:

 Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne,
 D.F and Wickham, H. (2009) Statistical Inference for exploratory
 data analysis and model diagnostics Phil. Trans. R. Soc. A 2009
 367, 4361-4383 doi: 10.1098/rsta.2009.0120

Uno de los enfoques mencionados allí es crear varios conjuntos de datos simulados donde los supuestos de interés son verdaderos y crear los gráficos de diagnóstico para estos conjuntos de datos simulados y también crear el gráfico de diagnóstico para los datos reales. Ponga todos estos gráficos en la pantalla al mismo tiempo (colocando aleatoriamente el que se basa en datos reales). Ahora tiene una referencia visual de cómo deberían verse los gráficos y si los supuestos se mantienen para los datos reales, entonces ese gráfico debería parecerse a los demás (si no puede determinar cuáles son los datos reales, entonces los supuestos que se están probando son probablemente cercanos suficiente para ser cierto), pero si el gráfico de datos reales se ve claramente diferente del otro, entonces eso significa que al menos uno de los supuestos no se cumple. La vis.testfunción en el paquete TeachingDemos para R ayuda a implementar esto como una prueba.

Greg Snow
fuente
66
Un ejemplo con los datos anteriores, para el registro: mod1 <- glm (Días ~ Edad + Sexo, datos = quine, familia = "poisson"); if (interactive ()) {vis.test (residuales (mod1, type = "response"), vt.qqnorm, nrow = 5, ncol = 5, npage = 3)}
pase medio el
13

Esta es una vieja pregunta, pero pensé que sería útil agregar que mi paquete DHARMa R (disponible en CRAN, ver aquí ) ahora proporciona residuos estandarizados para GLM y GLMM, basados ​​en un enfoque de simulación similar al sugerido por @GregSnow .

De la descripción del paquete:

El paquete DHARMa utiliza un enfoque basado en simulación para crear residuos escalados fácilmente interpretables a partir de modelos mixtos lineales generalizados ajustados. Actualmente se admiten todas las clases 'merMod' de 'lme4' ('lmerMod', 'glmerMod'), 'glm' (incluyendo 'negbin' de 'MASS', pero excluyendo las clases de modelos de cuasi-distribuciones) y 'lm'. Alternativamente, también se pueden procesar simulaciones creadas externamente, por ejemplo, simulaciones predictivas posteriores de software bayesiano como 'JAGS', 'STAN' o 'BUGS'. Los residuos resultantes están estandarizados a valores entre 0 y 1 y pueden interpretarse de manera intuitiva como residuos de una regresión lineal. El paquete también proporciona una serie de funciones de trazado y prueba para un problema típico de especificación errónea del modelo,

@Momo: es posible que desee actualizar su recomendación 6, es engañosa. La normalidad de los residuos de desviación en general no se espera bajo un Poisson , como se explica en la viñeta DHARMa o aquí ; y seing residuos de desviación (o cualquier otro residuales estándar) que difieren de una línea recta en una parcela qqnorm por lo tanto es, en general, ninguna preocupación en absoluto . El paquete DHARMa proporciona un gráfico qq que es confiable para diagnosticar desviaciones de Poisson u otras familias GLM. He creado un ejemplo que demuestra el problema con los residuos de desviación aquí .

Florian Hartig
fuente
4

Hay una función llamada glm.diag.plotsen el paquete boot, para generar diagramas de diagnóstico para GLM. Que hace:

Realiza un gráfico de los residuos de desviación de navaja contra el predictor lineal, los gráficos de puntajes normales de los residuos de desviación estandarizados, el gráfico de estadísticas aproximadas de Cook contra el apalancamiento / (1-apalancamiento) y el gráfico de caso de la estadística de Cook.

kdarras
fuente