Tracés de diagnostic pour la régression du nombre

88

Quelles parcelles de diagnostic (et peut-être des tests formels) trouvez-vous le plus informatif pour les régressions où le résultat est une variable de comptage?

Je suis particulièrement intéressé par les modèles de Poisson et binomiaux négatifs, ainsi que par leurs homologues à gonflement nul et à obstacle. La plupart des sources que j'ai trouvées ne font que tracer les valeurs résiduelles par rapport aux valeurs ajustées sans indiquer en quoi ces tracés "devraient" ressembler.

Sagesse et références grandement appréciées. La seconde partie de mon histoire est la raison pour laquelle je pose cette question, si elle est pertinente .

Discussions connexes:

demi-passe
la source

Réponses:

101

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

  1. 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 vcdpackage Ren grande partie. Par exemple, avec goodfitet 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")
  2. 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")
    
  3. Vérifiez la surdispersion / sous-dispersion en consultant residual deviance/dfou 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)
    
  4. Vérifiez les points d'influence et de levier , par exemple avec influencePlotle carcontenu de l' emballage. Bien entendu, de nombreux points ont une grande influence car Poisson est un mauvais modèle:

    library(car)
    influencePlot(mod1)
    
  5. 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)
    
  6. 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)
    
  7. 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))
    
  8. 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).

Momo
la source
6
Grande réponse approfondie! Il était également utile de passer en revue ces diagnostics avec des données simulées par Poisson afin d’entraîner mon œil avec ce à quoi les graphes devraient ressembler.
demi-passe le
Aurais-je dû donner plus d'explications sur ce que font les parcelles ou est-ce que ça va comme ça?
Momo
2
Note latérale intéressante: je trouve que la distribution du N.-B. semble rarement correspondre aux données du N.-B. simulées basées sur le test GOF, l’enracinogramme, le graphique Ord et le graphique NB-ness. L'exception semble être très "docile" NB données presque symétriques - haute mu, haute thêta.
demi-passe le
1
Hm, êtes-vous sûr d'utiliser le type = "nbinomial" comme argument? Par exemple, fm <- glm.nb (Days ~., Data = quine); dummy <- rnegbin (équipé (fm), thêta = 4,5) fonctionne bien.
Momo
@Momo, merci - je faisais quelque chose comme x = rnegbin (n = 1000, mu = 10, theta = 1); fit = goodfit (x, type = "nbinomial"); résumé (ajustement). Le réglage thêta = 4,5 améliore l'ajustement, mais cela reste toujours p <0,05 et l'algorithme peut sembler très mauvais. Pour que je comprenne bien la différence entre nos simulations: dans la vôtre, chaque valeur de dummy a été simulée à partir d’un paramètre moyen différent (une valeur dans ajusté (fm)), n’est-ce pas? Dans le mien, ils ont tous une moyenne de 10.
demi-passe
14

Pour l’approche consistant à utiliser des graphiques de diagnostic standard tout en voulant savoir à quoi ils devraient ressembler, j’aime le papier:

 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

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.testfonction du package TeachingDemos pour R aide à implémenter cela en tant que test.

Greg Snow
la source
6
Un exemple avec les données ci-dessus, pour l'enregistrement: mod1 <- glm (jours ~ âge + sexe, data = quine, family = "poisson"); if (interactive ()) {vis.test (résidus (mod1, type = "réponse"), vt.qqnorm, nrow = 5, ncol = 5, npage = 3)}
demi-passage du
13

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:

Le progiciel DHARMa utilise une approche basée sur la simulation pour créer des résidus mis à l’échelle facilement interprétables à partir de modèles mixtes linéaires généralisés ajustés. Actuellement, toutes les classes 'merMod' des classes 'lme4' ('lmerMod', 'glmerMod'), 'glm' (y compris 'negbin' de 'MASS', à l'exclusion des quasi-distributions) et 'lm', sont prises en charge. Vous pouvez également utiliser des simulations créées en externe, par exemple des simulations prédictives postérieures à partir de logiciels bayésiens tels que "JAGS", "STAN" ou "BUGS". Les résidus résultants sont normalisés à des valeurs comprises entre 0 et 1 et peuvent être interprétés intuitivement comme des résidus d'une régression linéaire. Le paquet fournit également un certain nombre de fonctions de tracé et de test pour le problème typique de spécification erronée de modèle,

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

Florian Hartig
la source
4

Il existe une fonction appelée glm.diag.plotsdans package boot, qui permet de générer des tracés de diagnostic pour les GLM. Ce qu'il fait:

Trace le graphique des résidus de déviance jackknife par rapport au prédicteur linéaire, les graphiques de scores normaux des résidus de déviance standardisés, le graphique des statistiques approximatives de Cook par rapport au levier / (1-levier), et le graphique de cas de la statistique de Cook.

Kdarras
la source