Voici ce que j'aime habituellement faire (à titre d'illustration, j'utilise les données quine surdispersées et difficilement modélisées des jours d'absence de l'école MASS
):
Testez et tracez graphiquement les données de comptage d'origine en traçant les fréquences observées et les fréquences ajustées (voir le chapitre 2 dans Amical ), qui sont prises en charge par le vcd
package R
en grande partie. Par exemple, avec goodfit
et a rootogram
:
library(MASS)
library(vcd)
data(quine)
fit <- goodfit(quine$Days)
summary(fit)
rootogram(fit)
ou avec des tracés Ord qui aident à identifier quel modèle de données de comptage est sous-jacent (par exemple, ici, la pente est positive et l'interception est positive, ce qui parle d'une distribution binomiale négative):
Ord_plot(quine$Days)
ou avec les tracés "XXXXXXness" où XXXXX est la distribution de choix, par exemple le tracé Poissoness (qui parle contre Poisson, essayez également type="nbinom"
):
distplot(quine$Days, type="poisson")
Inspectez les mesures habituelles de qualité de l'ajustement (telles que les statistiques du rapport de probabilité par rapport à un modèle nul ou similaire):
mod1 <- glm(Days~Age+Sex, data=quine, family="poisson")
summary(mod1)
anova(mod1, test="Chisq")
Vérifiez la surdispersion / sous-dispersion en consultant residual deviance/df
ou en consultant une statistique de test formel (par exemple, reportez-vous à cette réponse ). Ici, nous avons clairement une surdispersion:
library(AER)
deviance(mod1)/mod1$df.residual
dispersiontest(mod1)
Vérifiez les points d'influence et de levier , par exemple avec influencePlot
le car
contenu de l' emballage. Bien entendu, de nombreux points ont une grande influence car Poisson est un mauvais modèle:
library(car)
influencePlot(mod1)
Vérifiez que l’ inflation n’est pas nulle en ajustant un modèle de données de comptage et son équivalent zéro / non corrigé et comparez-les (généralement avec AIC). Ici, un modèle à zéro gonflé conviendrait mieux que le simple Poisson (encore probablement en raison d'une surdispersion):
library(pscl)
mod2 <- zeroinfl(Days~Age+Sex, data=quine, dist="poisson")
AIC(mod1, mod2)
Tracez les résidus (bruts, déviance ou mis à l'échelle) sur l'axe des y par rapport aux valeurs prédites (log) (ou le prédicteur linéaire) sur l'axe des x. Nous voyons ici des résidus très importants et une déviance substantielle des résidus de déviance par rapport à la normale (parlant contre le Poisson; Edit: @ La réponse de FlorianHartig suggère qu'il ne faut pas s'attendre à une normalité de ces résidus, ce n'est donc pas un indice décisif):
res <- residuals(mod1, type="deviance")
plot(log(predict(mod1)), res)
abline(h=0, lty=2)
qqnorm(res)
qqline(res)
Si cela vous intéresse, tracez un graphique de probabilité demi-normale des résidus en traçant les résidus absolus ordonnés par rapport aux valeurs normales attendues Atkinson (1981) . Une fonction spéciale serait de simuler une "ligne" de référence et une enveloppe avec des intervalles de confiance simulés / initialisés (non représentés cependant):
library(faraway)
halfnorm(residuals(mod1))
Tracés de diagnostic pour les modèles log-linéaires pour les données de comptage (voir les chapitres 7.2 et 7.7 du livre de Friendly). Les valeurs prédites de la parcelle par rapport aux valeurs observées sont peut-être associées à une estimation d'intervalle (ce que je viens de faire pour les groupes d'âge - nous voyons encore une fois que nous sommes assez loin de nos estimations en raison de la surdispersion, à part peut-être dans le groupe F3. Les points roses sont la prédiction de points une erreur standard):±
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)
Cela devrait vous fournir une grande partie des informations utiles sur votre analyse et la plupart des étapes fonctionnent pour toutes les distributions de données de comptage standard (par exemple, Poisson, Binôme négatif, COM Poisson, Lois de puissance).
Pour l’approche consistant à utiliser des graphiques de diagnostic standard tout en voulant savoir à quoi ils devraient ressembler, j’aime le papier:
L'une des approches mentionnées consiste à créer plusieurs jeux de données simulés dans lesquels les hypothèses considérées sont vraies, à créer les tracés de diagnostic pour ces jeux de données simulés et à créer le tracé de diagnostic des données réelles. afficher toutes ces parcelles à l'écran en même temps (en plaçant celle-ci au hasard en fonction de données réelles). Vous avez maintenant une référence visuelle de ce à quoi devraient ressembler les tracés et si les hypothèses retenues correspondent aux données réelles, ce tracé devrait ressembler aux autres (si vous ne pouvez pas dire quelles sont les données réelles, les hypothèses testées sont probablement proches. assez pour true), mais si le graphique de données réel semble clairement différent de l’autre, cela signifie qu’au moins une des hypothèses ne tient pas. La
vis.test
fonction du package TeachingDemos pour R aide à implémenter cela en tant que test.la source
C'est une vieille question, mais j'ai pensé qu'il serait utile d'ajouter que mon package DHARMa R (disponible auprès de CRAN, voir ici ) fournit désormais des résidus standardisés pour les GLM et les GLMM, basés sur une approche de simulation similaire à celle suggérée par @GregSnow. .
De la description du paquet:
@Momo - vous voudrez peut-être mettre à jour votre recommandation 6, c'est trompeur. La normalité des résidus de déviance n’est généralement pas attendue sous Poisson , comme expliqué dans la vignette DHARMa ou ici ; et voir les résidus de déviance (ou tout autre résidu standard) qui diffèrent d’une ligne droite dans un tracé qqnorm n’est donc en général pas du tout préoccupant . Le package DHARMa fournit un graphique qq fiable pour le diagnostic des écarts par rapport à Poisson ou à d'autres familles GLM. J'ai créé un exemple qui illustre le problème des résidus de déviance ici .
la source
Il existe une fonction appelée
glm.diag.plots
dans packageboot
, qui permet de générer des tracés de diagnostic pour les GLM. Ce qu'il fait:la source