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).