Gráficos de diagnóstico para regressão de contagem

88

Quais gráficos de diagnóstico (e talvez testes formais) você considera mais informativos para regressões em que o resultado é uma variável de contagem?

Estou especialmente interessado em Poisson e nos modelos binomiais negativos, bem como nos modelos com inflado zero e obstáculos de cada um. A maioria das fontes que encontrei simplesmente plota os resíduos versus os valores ajustados sem discutir como essas plotagens "deveriam" parecer.

Sabedoria e referências muito apreciadas. A história por trás de por que estou perguntando isso, se for relevante, é minha outra pergunta .

Discussões relacionadas:

meia passagem
fonte

Respostas:

101

Aqui está o que eu normalmente gosto de fazer (para ilustração, eu uso os dados de quine superdispersos e não muito facilmente modelados dos dias de ausência dos alunos na escola MASS):

  1. Teste e faça um gráfico dos dados da contagem original , plotando as frequências observadas e as freqüências ajustadas (consulte o capítulo 2 em Amigável ), que é suportado pela vcdembalagem Rem grandes partes. Por exemplo, com goodfite um rootogram:

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

    ou com gráficos Ord que ajudam a identificar qual modelo de dados de contagem está subjacente (por exemplo, aqui a inclinação é positiva e a interceptação é positiva, o que indica uma distribuição binomial negativa):

    Ord_plot(quine$Days)

    ou com os gráficos "XXXXXXness" em que XXXXX é a distribuição de escolha, digamos gráfico Poissoness (que fala contra Poisson, tente também type="nbinom"):

    distplot(quine$Days, type="poisson")
  2. Inspecione as medidas usuais de qualidade do ajuste (como estatísticas da razão de verossimilhança vs. modelo nulo ou similar):

    mod1 <- glm(Days~Age+Sex, data=quine, family="poisson")
    summary(mod1)
    anova(mod1, test="Chisq")
    
  3. Verifique se há excesso / subdispersão olhando para residual deviance/dfuma estatística formal de teste (por exemplo, veja esta resposta ). Aqui temos claramente uma super-dispersão:

    library(AER)
    deviance(mod1)/mod1$df.residual
    dispersiontest(mod1)
    
  4. Verifique se há pontos de influência e alavancagem , por exemplo, com influencePloto carpacote. É claro que aqui muitos pontos são altamente influentes porque Poisson é um modelo ruim:

    library(car)
    influencePlot(mod1)
    
  5. Verifique a inflação zero ajustando um modelo de dados de contagem e sua contrapartida zero inflada / obstáculo e compare-os (geralmente com AIC). Aqui, um modelo inflado a zero caberia melhor que o simples Poisson (novamente provavelmente devido à super-dispersão):

    library(pscl)
    mod2 <- zeroinfl(Days~Age+Sex, data=quine, dist="poisson")
    AIC(mod1, mod2)
    
  6. Plote os resíduos (bruto, desvio ou escala) no eixo y versus os valores previstos (log) (ou o preditor linear) no eixo x. Aqui vemos alguns resíduos muito grandes e um desvio substancial dos resíduos de desvio do normal (falando contra o Poisson; Edit: @ A resposta de FlorianHartig sugere que a normalidade desses resíduos não é de se esperar, portanto, essa não é uma pista conclusiva):

    res <- residuals(mod1, type="deviance")
    plot(log(predict(mod1)), res)
    abline(h=0, lty=2)
    qqnorm(res)
    qqline(res)
    
  7. Se estiver interessado, plote um gráfico de probabilidade meio normal de resíduos, plotando resíduos absolutos ordenados versus valores normais esperados Atkinson (1981) . Uma característica especial seria simular uma 'linha' e envelope de referência com intervalos de confiança simulados / iniciados por inicialização (ainda não mostrados):

    library(faraway)
    halfnorm(residuals(mod1))
    
  8. Gráficos de diagnóstico para modelos lineares de log para dados de contagem (consulte os capítulos 7.2 e 7.7 no livro de Friendly). Plote valores previstos versus valores observados, talvez com alguma estimativa de intervalo (fiz exatamente para as faixas etárias - aqui vemos novamente que estamos muito distantes de nossas estimativas devido à super-dispersão, talvez, no grupo F3. Os pontos-de-rosa são a previsão do ponto um erro padrão):±

    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)
    

Isso deve fornecer muitas informações úteis sobre sua análise e a maioria das etapas funciona para todas as distribuições de dados de contagem padrão (por exemplo, Poisson, Binomial Negativo, COM Poisson, Leis de Potência).

Momo
fonte
6
Ótima resposta completa! Também foi útil analisar esses diagnósticos com dados simulados por Poisson para treinar meus olhos com a aparência das plotagens.
meia-passagem
Deveria ter dado mais explicações sobre o que as parcelas fazem ou foi bom assim?
Momo
2
Nota lateral interessante: estou descobrindo que a distribuição de RN raramente parece se encaixar nos dados simulados de RN, com base no teste GOF, rootograma, gráfico Ord e gráfico NB-ness. A exceção parece ser dados NB muito "mansos" que são quase simétricos - mu alto, teta alto.
meia-passagem
1
Hum, você tem certeza de que usa type = "nbinomial" como argumento? Por exemplo, fm <- glm.nb (Dias ~., Data = quine); manequim <- rnegbin (ajustado (fm), theta = 4.5) funciona bem.
Momo
@ Momo, obrigado - eu estava fazendo algo como x = rnegbin (n = 1000, mu = 10, theta = 1); ajuste = ajuste adequado (x, tipo = "nbinomial"); resumo (ajuste). Definir teta = 4.5 melhora o ajuste, mas ainda é frequentemente p <0,05 e o rootograma pode parecer muito ruim. Só para entender a diferença entre as nossas simulações: na sua, cada valor de dummy foi simulado a partir de um parâmetro médio diferente (um valor em ajustado (fm)), certo? Na minha, todas têm média 10.
half-pass
14

Para a abordagem de usar gráficos de diagnóstico padrão, mas desejando saber como eles devem ser, eu gosto do artigo:

 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

Uma das abordagens mencionadas é a criação de vários conjuntos de dados simulados em que as suposições de interesse são verdadeiras e criar os gráficos de diagnóstico para esses conjuntos de dados simulados e também criar o gráfico de diagnóstico para os dados reais. coloque todos esses gráficos na tela ao mesmo tempo (colocando aleatoriamente o baseado em dados reais). Agora você tem uma referência visual de como devem ser as plotagens e, se as suposições forem válidas para os dados reais, essa plotagem deverá se parecer com as demais (se você não puder dizer quais são os dados reais, as suposições testadas provavelmente serão próximas) suficiente para verdadeiro), mas se o gráfico de dados real parecer claramente diferente do outro, isso significa que pelo menos uma das suposições não se aplica. A vis.testfunção no pacote TeachingDemos para R ajuda a implementar isso como um teste.

Greg Snow
fonte
6
Um exemplo com os dados acima, para o registro: mod1 <- glm (Dias ~ Idade + Sexo, dados = quine, family = "poisson"); if (interativo ()) {vis.test (resíduos (mod1, tipo = "resposta"), vt.qqnorm, nrow = 5, ncol = 5, npage = 3)}
passe metade de
13

Esta é uma pergunta antiga, mas achei que seria útil acrescentar que meu pacote DHARMa R (disponível no CRAN, veja aqui ) agora fornece resíduos padronizados para GLMs e GLMMs, com base em uma abordagem de simulação semelhante à sugerida por @GregSnow .

Na descrição do pacote:

O pacote DHARMa usa uma abordagem baseada em simulação para criar resíduos escaláveis ​​prontamente interpretáveis ​​a partir de modelos mistos lineares generalizados ajustados. Atualmente, são suportadas todas as classes 'merMod' das classes 'lme4' ('lmerMod', 'glmerMod'), 'glm' (incluindo 'negbin' de 'MASS', mas excluindo quase distribuições) e 'lm'. Como alternativa, simulações criadas externamente, por exemplo, simulações preditivas posteriores de software bayesiano como 'JAGS', 'STAN' ou 'BUGS' também podem ser processadas. Os resíduos resultantes são padronizados para valores entre 0 e 1 e podem ser interpretados tão intuitivamente quanto os resíduos de uma regressão linear. O pacote também fornece várias funções de plotagem e teste para problemas típicos de má especificação do modelo,

@ Momo - você pode querer atualizar sua recomendação 6, é enganosa. Normalmente, a normalidade dos resíduos de desvio não é esperada sob um Poisson , conforme explicado na vinheta da DHARMa ou aqui ; e observar resíduos de desvio (ou quaisquer outros resíduos padrão) que diferem de uma linha reta em um gráfico qqnorm não é, portanto, em geral de modo algum preocupante . O pacote DHARMa fornece um gráfico qq que é confiável para diagnosticar desvios em relação a Poisson ou outras famílias GLM. Eu criei um exemplo que demonstra o problema com os resíduos de desvio aqui .

Florian Hartig
fonte
4

Existe uma função chamada glm.diag.plotsno pacote boot, para gerar gráficos de diagnóstico para GLMs. O que faz:

Faz o gráfico dos resíduos do desvio do canivete em relação ao preditor linear, plotagens de pontuação normal dos resíduos do desvio padronizado, gráfico das estatísticas aproximadas de Cook contra alavancagem / (1 alavancagem) e gráfico de caso da estatística de Cook.

kdarras
fonte