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
):
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 vcd
paquete admite R
en partes grandes. Por ejemplo, con goodfit
y 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")
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")
Verifique la dispersión excesiva / insuficiente mirando residual deviance/df
o 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)
Verifique los puntos influyentes y de apalancamiento , por ejemplo, con el influencePlot
en el car
paquete. Por supuesto, aquí muchos puntos son muy influyentes porque Poisson es un mal modelo:
library(car)
influencePlot(mod1)
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)
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)
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))
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).
Para el enfoque de usar diagramas de diagnóstico estándar pero queriendo saber cómo deberían verse, me gusta el artículo:
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.test
función en el paquete TeachingDemos para R ayuda a implementar esto como una prueba.fuente
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:
@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í .
fuente
Hay una función llamada
glm.diag.plots
en el paqueteboot
, para generar diagramas de diagnóstico para GLM. Que hace:fuente