Menu

ANOVA no R: aov(), a Tabela da ANOVA e o Tukey HSD

Compare as médias de três ou mais grupos com aov(), leia a tabela da ANOVA célula a célula e descubra quais grupos de fato diferem com TukeyHSD().

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Por Que ANOVA e Não uma Pilha de Testes t

Um teste t compara duas médias. Com três ou mais grupos, o movimento tentador é fazer um teste t para cada par - e essa é exatamente a armadilha. Cada teste rodado no nível de 0,05 carrega um risco de 5% de falso positivo, e os riscos se acumulam: com 4 grupos são 6 testes par a par e cerca de 26% de chance de ao menos um resultado "significativo" espúrio; com 5 grupos (10 testes), cerca de 40%. Você fabricaria descobertas a partir de puro ruído.

A ANOVA (ANalysis Of VAriance, análise de variância) resolve isso fazendo uma pergunta com um p-valor: todas as médias de grupo são iguais, ou ao menos uma difere? Apesar do nome, ela compara médias - só que faz isso analisando a variância: se as médias dos grupos estão mais espalhadas do que o ruído dentro dos grupos consegue explicar, algo real está acontecendo.

ANOVA de Um Fator com aov()

O PlantGrowth foi feito para isso: pesos de plantas sob um controle e duas condições de tratamento. Ajuste com aov() e depois - importante - imprima a tabela com summary():

Leia a fórmula como "o weight depende do group?". A variável de agrupamento precisa ser um fator - PlantGrowth$group já é um, mas se seus grupos estiverem codificados como números (doses, IDs de lote), envolva-os: aov(y ~ factor(dose), ...). Caso contrário, aov() silenciosamente ajusta uma reta de regressão através dos códigos dos grupos em vez de comparar médias de grupo - modelo errado, nenhuma mensagem de erro.

Lendo a Tabela da ANOVA

A tabela tem duas linhas - o fator e os resíduos - e cinco colunas. Célula a célula:

            Df Sum Sq Mean Sq F value Pr(>F)
group        2  3.766  1.8832   4.846 0.0159
Residuals   27 10.492  0.3886
  • Df - graus de liberdade. A linha do fator recebe grupos − 1 (3 grupos → 2); a linha dos resíduos recebe observações − grupos (30 − 3 = 27). Uma verificação rápida de que o R enxergou o delineamento que você pretendia.
  • Sum Sq - variação, dividida em dois montes. A linha group é o monte entre grupos: o quão longe as médias dos grupos estão da média geral. Residuals é o monte dentro dos grupos: o quanto as plantas variam em torno da média do próprio grupo. Juntos, eles somam a variação total dos dados.
  • Mean Sq - cada Sum Sq dividido pelo seu Df, transformando montes de variação em taxas comparáveis por grau de liberdade. O Mean Sq residual (0,389) é o nível de ruído.
  • F value - a razão: Mean Sq de group sobre Mean Sq de Residuals (1,8832 / 0,3886 ≈ 4,85). Se todas as médias de grupo fossem realmente iguais, essa razão giraria em torno de 1. Quanto maior o F, mais as diferenças entre grupos superam o que o ruído consegue explicar.
  • Pr(>F) - o p-valor: a probabilidade de um F tão grande se as três médias verdadeiras fossem idênticas. Aqui 0,016 - pequeno o bastante no nível convencional de 0,05 para rejeitar "todas iguais". Como sempre, não é a probabilidade de a nula ser verdadeira, e não diz nada sobre quais grupos diferem nem por quanto.

Esse último ponto é a limitação crucial: um F significativo diz "alguma diferença, em algum lugar". Nada além disso.

Quais Grupos Diferem? TukeyHSD()

A pergunta seguinte exige um teste post-hoc. A Diferença Honestamente Significativa de Tukey testa cada par mantendo a taxa de erro familiar em 5% ao longo de todas as comparações de uma vez:

Uma linha por par, quatro números por linha:

  • diff - a diferença estimada entre médias (grupo citado em segundo menos o primeiro).
  • lwr, upr - o intervalo de confiança familiar de 95% para essa diferença.
  • p adj - o p-valor, já ajustado por se fazerem três comparações.

Para o PlantGrowth: trt2-trt1 mostra uma diferença de cerca de 0,87 com p adj ≈ 0,012 e um intervalo que não toca o zero - o tratamento 2 cresce mais que o tratamento 1. As duas linhas de tratamento-vs-controle (trt1-ctrl, trt2-ctrl) têm intervalos cavalgando o zero e p adj bem acima de 0,05 - nenhum dos tratamentos é distinguível do controle nesta amostra. A regra prática espelha a dos intervalos de confiança em geral: o intervalo exclui o zero ⇔ p adj abaixo de 0,05.

Repare como o F geral disse "existe uma diferença" enquanto o Tukey a localiza em exatamente um par - a estrutura em duas etapas é todo o projeto: um teste geral honesto, e depois um trabalho de detetive par a par devidamente corrigido.

ANOVA de Dois Fatores: Dois Fatores e Sua Interação

Com duas variáveis de agrupamento, uma chamada testa as duas - além de saber se elas interagem. O ToothGrowth cruza o tipo de suplemento (supp) com a dose (0,5, 1, 2 mg - numérica, então precisa de factor()):

supp * factor(dose) se expande em três efeitos, uma linha de tabela cada:

  • supp - na média das doses, o tipo de suplemento importa? (Sim: p ≈ 0,0002.)
  • factor(dose) - na média dos suplementos, a dose importa? (Enfaticamente: p é minúsculo.)
  • supp:factor(dose) - a interação: o efeito do suplemento muda conforme a dose? Aqui p ≈ 0,022 - sim, muda. O suco de laranja supera o ácido ascórbico em doses baixas, mas a diferença se fecha na dose de 2 mg.

Uma interação significativa é uma etiqueta de advertência sobre os efeitos principais: "o tipo de suplemento importa" só é verdade em média, e a média esconde uma história que depende da dose. Quando a interação é significativa, descreva as combinações (um TukeyHSD(fit2, "supp:factor(dose)") ou uma tabela de médias de grupo via resumos por grupo) em vez de reportar os efeitos principais isoladamente. Use + em vez de * apenas quando você deliberadamente quiser um modelo sem interação.

Pressupostos - e o Plano B Baseado em Postos

A matemática da ANOVA se apoia em três pressupostos, em ordem decrescente de negociabilidade:

  • Independência - observações não influenciam umas às outras. Nada corrige uma violação depois do fato; é uma propriedade do delineamento do estudo.
  • Variâncias iguais entre grupos - o Mean Sq residual é uma única estimativa agregada de ruído, então os grupos devem ser mais ou menos igualmente ruidosos. Verificação de uma linha: bartlett.test(weight ~ group, data = PlantGrowth) (um p-valor grande significa nenhuma evidência de variâncias desiguais).
  • Resíduos aproximadamente normais - o que menos importa em delineamentos balanceados e com grupos de tamanho decente; dê uma olhada em um histograma ou boxplot dos resíduos via residuals(fit).

Quando os dados são fortemente assimétricos, ordinais ou crivados de outliers, a alternativa baseada em postos para a ANOVA de um fator é kruskal.test(weight ~ group, data = PlantGrowth) - o irmão para muitos grupos do wilcox.test(). É uma linha, e troca um pouco de poder por robustez.

O Que Você Leva Daqui

  • A ANOVA faz uma pergunta sobre 3+ médias de grupo com um único p-valor - a solução para a multiplicidade dos testes t.
  • fit <- aov(y ~ group, data = df); summary(fit) - e a variável de agrupamento precisa ser um fator.
  • O valor F é o sinal entre grupos sobre o ruído dentro dos grupos; um Pr(>F) pequeno significa "alguma diferença em algum lugar", e nada além disso.
  • TukeyHSD(fit) encontra quais pares diferem, com a correção para múltiplas comparações já embutida.
  • a * b ajusta dois fatores mais sua interação; uma interação significativa significa que os efeitos principais não contam a história sozinhos.
  • Verifique variâncias iguais (bartlett.test) e normalidade dos resíduos; kruskal.test() é o plano B baseado em postos.

A seguir: de comparar médias de grupos a modelar uma relação - regressão linear com lm().

Perguntas frequentes

Como rodar uma ANOVA no R?

Ajuste o modelo com aov() usando uma fórmula e depois imprima a tabela com summary(): fit <- aov(weight ~ group, data = PlantGrowth); summary(fit). A variável de agrupamento precisa ser um fator - se estiver guardada como números, envolva-a em factor() dentro da fórmula.

Como interpretar a tabela da ANOVA no R?

O valor F é a razão entre a variação entre grupos (Mean Sq do fator) e a variação dentro dos grupos (Mean Sq dos resíduos). Pr(>F) é o p-valor: se for pequeno, ao menos a média de um grupo difere das demais - mas a tabela não diz qual. Rode TukeyHSD(fit) para descobrir.

O que o Tukey HSD faz no R?

TukeyHSD(fit) testa cada par de grupos corrigindo o fato de você estar fazendo muitas comparações. Cada linha traz a diferença estimada (diff), um intervalo de confiança familiar (lwr, upr) e um p-valor ajustado (p adj). Pares cujo intervalo exclui o zero diferem significativamente.

Por que não simplesmente rodar vários testes t em vez de ANOVA?

Cada teste t carrega seu próprio risco de falso positivo, e os riscos se acumulam. Com 5 grupos você precisaria de 10 testes t par a par, e com um limiar de 0,05 em cada, a chance de ao menos um falso positivo sobe para cerca de 40%. A ANOVA faz primeiro uma pergunta geral, e então o HSD de Tukey faz as comparações par a par com a taxa de erro devidamente controlada.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR