#####################################
## Q13 — ANOVA e Tukey ##
## Autora: Victória Souza ##
#####################################
# Pacotes
library(car) # Levene
## Carregando pacotes exigidos: carData
library(emmeans) # pós-testes (Tukey / efeitos simples)
## Welcome to emmeans.
## Caution: You lose important information if you filter this package's results.
## See '? untidy'
library(ggplot2) # gráfico
library(dplyr) # gráfico/manipulação
##
## Anexando pacote: 'dplyr'
## O seguinte objeto é mascarado por 'package:car':
##
## recode
## Os seguintes objetos são mascarados por 'package:stats':
##
## filter, lag
## Os seguintes objetos são mascarados por 'package:base':
##
## intersect, setdiff, setequal, union
# 1) Ler dados
dados <- read.table("questao13.txt", header = TRUE, dec = ".")
# 2) Fatores
dados$local <- factor(dados$local, levels = c("A","B","C"))
dados$periodo <- factor(dados$periodo, levels = c("dia","noite"))
# 3) Checagens
# Levene por célula do fatorial:
leveneTest(oxigenio ~ interaction(local, periodo), data = dados)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 5 8.0977 4.191e-06 ***
## 72
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Normalidade dos resíduos será checada após o ajuste
# 4) ANOVA fatorial
mod <- aov(oxigenio ~ local * periodo, data = dados)
summary(mod)
## Df Sum Sq Mean Sq F value Pr(>F)
## local 2 28.33 14.17 52.64 8.16e-15 ***
## periodo 1 144.79 144.79 538.01 < 2e-16 ***
## local:periodo 2 52.34 26.17 97.24 < 2e-16 ***
## Residuals 72 19.38 0.27
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretação: Ambos os fatores e a interação entre eles apresentaram alta significância (Local: p=8.16e-15; Período: p< 2e-16; Local:Período: p< 2e-16). Isso indica que o oxigênio dissolvido é diferente entre locais, entre períodos e que a diferença entre locais depende do período (interação).
# Diagnóstico
par(mfrow = c(1,2))
plot(mod, which = 1) # resíduos vs ajustados
qqnorm(residuals(mod)); qqline(residuals(mod)) # QQ-plot
par(mfrow = c(1,1))
# 5) Pós-testes (Tukey)
# a) Todas as 6 combinações (Local:Período)
emm_all <- emmeans(mod, ~ local:periodo)
pairs(emm_all, adjust = "tukey")
## contrast estimate SE df t.ratio p.value
## A dia - B dia 0.0792 0.203 72 0.389 0.9988
## A dia - C dia -0.4669 0.203 72 -2.295 0.2097
## A dia - A noite 1.1046 0.203 72 5.429 <.0001
## A dia - B noite 2.1800 0.203 72 10.714 <.0001
## A dia - C noite 4.5023 0.203 72 22.127 <.0001
## B dia - C dia -0.5462 0.203 72 -2.684 0.0910
## B dia - A noite 1.0254 0.203 72 5.039 <.0001
## B dia - B noite 2.1008 0.203 72 10.324 <.0001
## B dia - C noite 4.4231 0.203 72 21.738 <.0001
## C dia - A noite 1.5715 0.203 72 7.723 <.0001
## C dia - B noite 2.6469 0.203 72 13.009 <.0001
## C dia - C noite 4.9692 0.203 72 24.422 <.0001
## A noite - B noite 1.0754 0.203 72 5.285 <.0001
## A noite - C noite 3.3977 0.203 72 16.698 <.0001
## B noite - C noite 2.3223 0.203 72 11.413 <.0001
##
## P value adjustment: tukey method for comparing a family of 6 estimates
Interpretação: Os únicos três pares que não apresentaram diferença significatica foram: A-dia vs B-dia (p=0.9988); A-dia vs C-dia (p=2097); B-dia vs C-dia (p=0.0910). Indicando que não há diferença no oxigênio dissolvido apenas entre os locais durante o dia. Em compensação, cada par Dia vs Noite, no mesmo local, é diferente; e durante à noite, todos os locais diferem entre si.
# 6) Tabela de médias ± EP para plot
sumario <- aggregate(oxigenio ~ local + periodo, dados,
function(z) c(mean = mean(z), se = sd(z)/sqrt(length(z))))
sumario <- transform(sumario,
media = oxigenio[, "mean"],
se = oxigenio[, "se"])
# 7) Boxplot por local em cada período (com pontos individuais)
ggplot(dados, aes(local, oxigenio, color = local)) +
geom_boxplot(outlier.shape = NA, alpha = 0.15) +
geom_jitter(width = 0.08, alpha = 0.5, size = 1.8) +
facet_wrap(~ periodo, nrow = 1) +
scale_color_brewer(palette = "Dark2", guide = "none") +
labs(x = "Local", y = "Oxigênio dissolvido",
title = "Boxplot por local em cada período",
subtitle = "Mediana e quartis (Q1–Q3) com pontos individuais") +
theme_bw(base_size = 13) +
theme(panel.grid = element_blank(),
strip.background = element_blank(),
plot.title.position = "plot")
# 8) Gráfico Interação (média ± EP)
ggplot(sumario,
aes(x = local, y = media,
group = periodo, color = periodo, shape = periodo)) +
geom_line(linetype = "dotted", linewidth = 0.9) +
geom_point(size = 3) +
geom_errorbar(aes(ymin = media - se, ymax = media + se),
width = 0.10, linewidth = 0.7) +
scale_color_brewer(palette = "Dark2",
name = "Período",
labels = c(dia = "Dia", noite = "Noite")) +
scale_shape_manual(values = c(dia = 16, noite = 17),
name = "Período",
labels = c(dia = "Dia", noite = "Noite")) +
labs(x = "Local",
y = "Oxigênio dissolvido",
title = "Interação Local × Período (média ± EP)") +
# quadro fechado
theme_classic(base_size = 13) +
theme(
panel.border = element_rect(colour = "black", fill = NA, linewidth = 0.8),
axis.line = element_blank(),
legend.position = "top",
legend.title = element_text(face = "bold"),
plot.title.position = "plot",
aspect.ratio = 1 # painel quadrado
) +
scale_y_continuous(expand = expansion(mult = c(0.03, 0.06)))
Interpretação: Existem diferenças entre períodos e entre locais, e o padrão entre locais depende do período (interação). Dia: A ~ B ~ C (não significativo). Noite: A > B > C (p<0,001). Dentro de cada local: Dia > Noite (p<0,001).