A pergunta antes do código
Uma mestranda instalou 30 armadilhas pitfall: 10 na mata, 10 na borda e 10 no pasto. A pergunta era simples: a conversão da mata em pasto reduz a abundância de besouros? Ela contou os besouros de cada armadilha e chegou com um número por armadilha e um script que rodava.
Antes de qualquer função, duas coisas decidem a análise. A variável resposta é uma contagem: não tem valor negativo, não tem vírgula e a variância costuma crescer com a média. E a unidade amostral é a armadilha, não o besouro. Isso já descarta a ANOVA comum e aponta para um modelo linear generalizado (GLM).
O dado: 30 armadilhas, três habitats
Os dados deste exemplo são simulados para imitar uma coleta com armadilhas pitfall. O código abaixo roda num R limpo.
library(ggplot2) set.seed(5395) # médias por habitat escolhidas para imitar um gradiente mata → pasto armadilhas <- data.frame( habitat = factor(rep(c("Mata", "Pasto", "Borda"), each = 10), levels = c("Mata", "Pasto", "Borda")) ) armadilhas$abundancia <- rnbinom(30, mu = c(6.5, 3.25, 5.2)[armadilhas$habitat], size = 2)
Antes de ajustar, olhe. O gráfico mostra cada armadilha como um ponto e a média de cada habitat em azul.
Já dá para ver duas coisas: o pasto tem menos besouros, e a dispersão dentro de cada habitat é grande. Guarde a segunda. Ela volta no último trecho da saída.
Como ler a saída do glm(), trecho por trecho
Clique em cada trecho destacado, ou leia as notas na ordem. A nota 6 é a que muda a conclusão.
> modelo <- (abundancia ~ habitat, + family = , data = armadilhas) > summary(modelo) Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 2.0541 0.1132 18.142 < 2e-16 *** habitatPasto 0.1961 -3.534 0.000409 habitatBorda -0.2963 0.1734 -1.709 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Null deviance: 108.84 on 29 degrees of freedom Residual deviance: degrees of freedom
- # glm()Abundância é contagem. A ANOVA comum supõe resíduos normais e variância constante, e pode prever número negativo de besouros. O GLM deixa escolher uma distribuição que combina com o dado.
- # family = poissonPoisson é o ponto de partida para contagens. Ela supõe que a variância é igual à média. Guarde isso.
- # estimate = -0.6931Escala do log. exp(-0,69) ≈ 0,5: no pasto há cerca de metade dos besouros da mata. É essa frase que vai para o texto.
- # ***O efeito dificilmente é zero. Não diz se é grande nem se importa biologicamente.
- # p = 0.0875Não é "quase significativo". É incerteza: a borda pode ter cerca de 25% menos besouros, ou o mesmo.
- # 95.59 on 27Desvio residual 3,5 vezes os graus de liberdade: sobredispersão. Os erros-padrão acima estão otimistas.
Se a sua saída tem um padrão parecido e você não sabe se é sobredispersão ou zero demais, é exatamente esse tipo de dúvida que resolvemos numa consultoria.
Qual distribuição usar no glm()?
A escolha começa pela natureza da variável resposta, não por uma tabela de testes.
| A sua resposta é… | Comece com | Por quê |
|---|---|---|
| Contagem (indivíduos, espécies) | poisson | Inteiros não negativos, variância igual à média |
| Contagem com variância muito maior que a média | binomial negativa | Um parâmetro a mais absorve a dispersão extra |
| Proporção (germinadas de 20 sementes) | binomial | Sucessos em um número conhecido de tentativas |
| Presença e ausência | binomial | Resposta 0 ou 1 |
O erro que a banca vai pegar: o desvio residual
Quase ninguém lê as duas últimas linhas da saída. É lá que o modelo avisa que a Poisson não serve.
- sintoma
- O desvio residual (95,59) é bem maior que os graus de liberdade (27). A razão é 3,5; com a Poisson adequada, ficaria perto de 1.
- consequência
- Os erros-padrão ficam pequenos demais e os p-valores, otimistas. Com a binomial negativa, o pasto continua com metade dos besouros da mata, mas o p-valor sobe para cerca de 0,05; a borda deixa de mostrar qualquer sinal (p ≈ 0,39).
- correção
- Cheque os resíduos com
DHARMa::simulateResiduals()e, se a sobredispersão se confirmar, ajuste uma binomial negativa comglmmTMB.
library(glmmTMB) library(DHARMa) # a razão que a saída do summary() não calcula por você deviance(modelo) / df.residual(modelo) # binomial negativa: a variância pode crescer mais rápido que a média modelo_nb <- glmmTMB(abundancia ~ habitat, family = nbinom2, data = armadilhas) plot(simulateResiduals(modelo_nb))
Como escrever o resultado do glm() na dissertação
Dois parágrafos-modelo. Troque o que está destacado pelos seus dados.
Perguntas frequentes
Por que o coeficiente do glm() é negativo?
Porque ele está na escala do log e compara o nível com a categoria de referência. Um coeficiente negativo quer dizer menos que a referência. Aplique exp() para ver quanto menos.
Qual a diferença entre desvio nulo e desvio residual?
O desvio nulo mede o quanto um modelo sem preditores se afasta dos dados. O residual mede o mesmo para o seu modelo. A diferença entre os dois é o quanto os preditores explicam.
O glm() mostra R²?
Não diretamente. Existem pseudo-R² para GLM, como os do pacote performance, mas eles não se leem como o R² da regressão linear. Use com cuidado e diga qual usou.
Para ir além
Leitura de base: o capítulo de modelos lineares generalizados do livro Análises Ecológicas no R, gratuito, explica as distribuições com calma.
Referências
- McCULLAGH, P.; NELDER, J. A. Generalized linear models. 2. ed. London: Chapman and Hall, 1989.
- ZUUR, A. F. et al. Mixed effects models and extensions in ecology with R. New York: Springer, 2009.
Travou nesta análise com os seus dados?
Me mande a sua pergunta. A primeira conversa é sem custo.
Conversar no WhatsApp
