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
):
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 vcd
embalagem R
em grandes partes. Por exemplo, com goodfit
e 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")
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")
Verifique se há excesso / subdispersão olhando para residual deviance/df
uma 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)
Verifique se há pontos de influência e alavancagem , por exemplo, com influencePlot
o car
pacote. É claro que aqui muitos pontos são altamente influentes porque Poisson é um modelo ruim:
library(car)
influencePlot(mod1)
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)
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)
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))
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).