Diagrammi diagnostici per la regressione del conteggio


88

Quali grafici diagnostici (e forse test formali) trovi più informativo per le regressioni in cui il risultato è una variabile di conteggio?

Sono particolarmente interessato ai modelli binomiali di Poisson e negativi, nonché alle controparti a gonfiaggio zero e ostacolo di ciascuno. La maggior parte delle fonti che ho trovato tracciano semplicemente i residui rispetto ai valori adattati senza discutere di come dovrebbero apparire questi grafici.

Saggezza e riferimenti molto apprezzati. La seconda storia sul perché sto chiedendo questo, se rilevante, è la mia altra domanda .

Discussioni correlate:

Risposte:


101

Ecco cosa di solito mi piace fare (a scopo illustrativo uso i dati quine sovraispersi e non molto modellati dei giorni degli alunni assenti da scuola MASS):

  1. Testare e rappresentare graficamente i dati di conteggio originali tracciando le frequenze osservate e le frequenze adattate (vedere il capitolo 2 in Amichevole ) che è supportato dal vcdpacchetto Rin grandi parti. Ad esempio, con goodfite a rootogram:

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

    o con i grafici Ord che aiutano a identificare quale modello di dati di conteggio è sottostante (ad esempio, qui la pendenza è positiva e l'intercetta è positiva che parla per una distribuzione binomiale negativa):

    Ord_plot(quine$Days)

    o con le trame "XXXXXXness" in cui XXXXX è la distribuzione di scelta, diciamo la trama di Poissoness (che parla contro Poisson, prova anche type="nbinom"):

    distplot(quine$Days, type="poisson")
  2. Ispezionare le solite misure di bontà di adattamento (come le statistiche del rapporto di probabilità rispetto a un modello nullo o simili):

    mod1 <- glm(Days~Age+Sex, data=quine, family="poisson")
    summary(mod1)
    anova(mod1, test="Chisq")
    
  3. Verificare la sovra / sottodispersione osservando residual deviance/dfo una statistica di test formale (ad esempio, vedere questa risposta ). Qui abbiamo chiaramente una sovradispersione:

    library(AER)
    deviance(mod1)/mod1$df.residual
    dispersiontest(mod1)
    
  4. Verificare la presenza di punti influenti e leva , ad es. Con influencePlotil carpacchetto. Naturalmente qui molti punti sono molto influenti perché Poisson è un cattivo modello:

    library(car)
    influencePlot(mod1)
    
  5. Verificare l' inflazione zero adattando un modello di dati di conteggio e la sua controparte zeroinflated / hurdle e confrontarli (di solito con AIC). Qui un modello a gonfiaggio zero si adatterebbe meglio del semplice Poisson (di nuovo probabilmente a causa della sovraispersione):

    library(pscl)
    mod2 <- zeroinfl(Days~Age+Sex, data=quine, dist="poisson")
    AIC(mod1, mod2)
    
  6. Traccia i residui (grezzi, devianza o ridimensionati) sull'asse y rispetto ai valori (log) previsti (o il predittore lineare) sull'asse x. Qui vediamo alcuni residui molto grandi e una deviazione sostanziale dei residui di deviazione dalla normalità (parlando contro il Poisson; Modifica: @La risposta di FlorianHartig suggerisce che non è prevedibile la normalità di questi residui, quindi questo non è un indizio conclusivo):

    res <- residuals(mod1, type="deviance")
    plot(log(predict(mod1)), res)
    abline(h=0, lty=2)
    qqnorm(res)
    qqline(res)
    
  7. Se interessati, tracciare un diagramma della metà della probabilità normale dei residui, disegnando i residui assoluti ordinati rispetto ai valori normali attesi Atkinson (1981) . Una caratteristica speciale sarebbe quella di simulare una 'linea' di riferimento e un inviluppo con intervalli di confidenza simulati / avviati (non mostrati però):

    library(faraway)
    halfnorm(residuals(mod1))
    
  8. Grafici diagnostici per i modelli log lineari per i dati di conteggio (vedere i capitoli 7.2 e 7.7 nel libro di Friendly). Tracciare i valori previsti rispetto a quelli osservati, forse con una stima dell'intervallo (l'ho fatto solo per le fasce d'età - qui vediamo di nuovo che siamo abbastanza lontani dalle nostre stime a causa della sovraispersione a parte, forse, nel gruppo F3. I punti rosa sono la previsione del punto un errore 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)
    

Questo dovrebbe darti molte delle informazioni utili sulla tua analisi e la maggior parte dei passaggi funzionano per tutte le distribuzioni di dati di conteggio standard (ad esempio, Poisson, Binomio negativo, Poisson COM, Leggi di potenza).


6
Ottima risposta completa! È stato utile esaminare anche questi dati diagnostici con dati simulati da Poisson per allenare il mio occhio su come dovrebbero apparire le trame.
passaggio

Avrei dovuto dare ulteriori spiegazioni su cosa fanno le trame o andava bene così?
Momo,

2
Nota a margine interessante: sto scoprendo che la distribuzione NB raramente sembra adattarsi ai dati NB simulati basati sul test GOF, sul rootogramma, sul diagramma Ord e sul diagramma NB-ness. L'eccezione sembra essere un dato NB molto "addomesticato" che è quasi simmetrico: alto mu, alto theta.
passaggio

1
Hm, sei sicuro di usare type = "nbinomial" come argomento? Ad esempio fm <- glm.nb (Days ~., Data = quine); dummy <- rnegbin (montato (fm), theta = 4.5) funziona bene.
Momo,

@Momo, grazie - Stavo facendo qualcosa come x = rnegbin (n = 1000, mu = 10, theta = 1); fit = goodfit (x, type = "nbinomial"); sintesi (fit). L'impostazione di theta = 4.5 migliora l'adattamento, ma spesso è ancora p <0,05 e il rootogramma può apparire piuttosto male. Solo così capisco la differenza tra le nostre simulazioni: nelle tue, ogni valore di dummy è stato simulato da un parametro medio diverso (un valore in montato (fm)), giusto? Nel mio, hanno tutti un valore medio 10.
Mezzo passaggio

14

Per l'approccio dell'utilizzo di grafici diagnostici standard ma volendo sapere come dovrebbero apparire, mi piace il documento:

 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 degli approcci citati è quello di creare diversi set di dati simulati in cui le ipotesi di interesse sono vere e creare grafici diagnostici per questi set di dati simulati e anche creare il diagramma diagnostico per i dati reali. mettere tutti questi grafici sullo schermo contemporaneamente (posizionando casualmente quello basato su dati reali). Ora hai un riferimento visivo di come dovrebbero apparire i grafici e se le assunzioni valgono per i dati reali, allora quel diagramma dovrebbe assomigliare agli altri (se non riesci a dire quali sono i dati reali, allora le ipotesi da testare sono probabilmente vicine abbastanza per vero), ma se il diagramma dei dati reali sembra chiaramente diverso dall'altro, significa che almeno una delle ipotesi non regge. La vis.testfunzione nel pacchetto TeachingDemos per R aiuta a implementarlo come test.


6
Un esempio con i dati di cui sopra, per la cronaca: mod1 <- glm (Giorni ~ Età + Sesso, dati = quine, famiglia = "poisson"); if (interattivo ()) {vis.test (residui (mod1, type = "response"), vt.qqnorm, nrow = 5, ncol = 5, npage = 3)}
mezzo passaggio

13

Questa è una vecchia domanda, ma ho pensato che sarebbe utile aggiungere che il mio pacchetto DHARMa R (disponibile da CRAN, vedi qui ) ora fornisce residui standardizzati per GLM e GLMM, basati su un approccio di simulazione simile a quello suggerito da @GregSnow .

Dalla descrizione del pacchetto:

Il pacchetto DHARMa utilizza un approccio basato sulla simulazione per creare residui scalati facilmente interpretabili da modelli misti lineari generalizzati montati. Attualmente sono supportate tutte le classi 'merMod' da 'lme4' ('lmerMod', 'glmerMod'), 'glm' (incluso 'negbin' da 'MASS', ma escluse le quasi-distribuzioni) e le classi modello 'lm'. In alternativa, è possibile elaborare anche simulazioni create esternamente, ad esempio simulazioni predittive posteriori da software bayesiano come "JAGS", "STAN" o "BUGS". I residui risultanti sono standardizzati su valori compresi tra 0 e 1 e possono essere interpretati in modo intuitivo come i residui di una regressione lineare. Il pacchetto fornisce anche una serie di funzioni di tracciamento e test per il tipico problema di errata specificazione del modello,

@Momo - potresti voler aggiornare la tua raccomandazione 6, è fuorviante. La normalità dei residui di devianza non è generalmente prevista in un Poisson , come spiegato nella vignetta DHARMa o qui ; e vedere i residui di devianza (o qualsiasi altro residuo standard) che differiscono da una linea retta in un diagramma di qqnorm non è quindi in generale affatto preoccupante . Il pacchetto DHARMa fornisce un diagramma qq che è affidabile per diagnosticare deviazioni da Poisson o altre famiglie GLM. Ho creato un esempio che dimostra il problema con i residui di devianza qui .


4

Esiste una funzione chiamata glm.diag.plotsnel pacchetto boot, per generare grafici diagnostici per GLM. Cosa fa:

Crea un diagramma dei residui di deviazione del jackknife rispetto al predittore lineare, grafici dei punteggi normali dei residui di devianza standardizzati, diagramma delle statistiche approssimative di Cook contro leva / (1 leva) e diagramma dei casi di statistica Cook.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.