Desenho Experimental e Análise Avançada de Dados Ecológicos
Como varia a massa com o comprimento da barbatana e do bico?
Uma linha = um espécime de pinguim; duas medidas no mesmo animal são duas colunas, não duas réplicas.
Os mesmos casos completos em todas as comparações.
Relações separadas: ainda sem ter em conta o outro comprimento.
\[ \widehat{\text{massa}}=b_0+b_L\,\text{barbatana}+b_B\,\text{bico} \]
Os \(b\) estimam os parâmetros \(\beta\) do modelo.
\(b_L\): g/mm de barbatana, mantendo o comprimento do bico constante.
\(b_B\): g/mm de bico, mantendo o comprimento da barbatana constante.
Sem interacção: cada declive é constante ao longo do outro preditor.
O intercepto prevê a massa com ambos os comprimentos a zero: fora dos dados, não um animal real.
As rectas são cortes do modelo; nem todas as combinações têm dados próximos.
Demonstração do F global do resumo: dois modelos para perceber o teste, não para acrescentar uma etapa ao script.
Analysis of Variance Table
Model 1: body_mass_g ~ 1
Model 2: body_mass_g ~ flipper_length_mm + bill_length_mm
Res.Df RSS Df Sum of Sq F Pr(>F)
1 332 215259666
2 330 51071963 2 164187703 530.45 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Compacto: uma média. Aumentado: dois declives e intercepto.
Restrição conjunta: \(\beta_L=\beta_B=0\). Justifica-se acrescentar dois parâmetros?
Call:
lm(formula = body_mass_g ~ flipper_length_mm + bill_length_mm,
data = ds)
Residuals:
Min 1Q Median 3Q Max
-1083.08 -282.65 -17.18 242.95 1293.24
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -5836.299 312.604 -18.670 <2e-16 ***
flipper_length_mm 48.890 2.034 24.034 <2e-16 ***
bill_length_mm 4.959 5.214 0.951 0.342
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 393.4 on 330 degrees of freedom
Multiple R-squared: 0.7627, Adjusted R-squared: 0.7613
F-statistic: 530.4 on 2 and 330 DF, p-value: < 2.2e-16
O teste global tem 2 gl no numerador; não testa cada declive separadamente.
A massa aumentou com o comprimento da barbatana, ajustando para o bico: 48.9 g/mm, SE = 2.0 g/mm. O modelo aditivo melhorou o ajuste relativamente a uma média comum, F2, 330 = 530.45, P < .001.
O teste global não diz que ambos os preditores contribuem.
Demonstração da linha flipper_length_mm de Anova(m_multi). anova() aqui serve para fins didácticos.
Analysis of Variance Table
Model 1: body_mass_g ~ bill_length_mm
Model 2: body_mass_g ~ flipper_length_mm + bill_length_mm
Res.Df RSS Df Sum of Sq F Pr(>F)
1 331 140467133
2 330 51071963 1 89395170 577.62 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Restrição: \(\beta_L=0\), mantendo o bico no modelo.
Demonstração da linha bill_length_mm da mesma tabela.
Analysis of Variance Table
Model 1: body_mass_g ~ flipper_length_mm
Model 2: body_mass_g ~ flipper_length_mm + bill_length_mm
Res.Df RSS Df Sum of Sq F Pr(>F)
1 331 51211963
2 330 51071963 1 140000 0.9046 0.3422
Restrição: \(\beta_B=0\), mantendo a barbatana no modelo.
Anova Table (Type III tests)
Response: body_mass_g
Sum Sq Df F value Pr(>F)
(Intercept) 53945591 1 348.5679 <2e-16 ***
flipper_length_mm 89395170 1 577.6243 <2e-16 ***
bill_length_mm 140000 1 0.9046 0.3422
Residuals 51071963 330
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Compare os valores de t no resumo com os valores de F na tabela anterior.
Testes parciais: cada restrição tem 1 gl. O F repete o teste-t do coeficiente, com \(F=t^2\) e o mesmo valor-P bilateral.
Teste F global: 2 gl para \(\beta_L=\beta_B=0\) em conjunto. Nenhum dos ts dos coeficientes responde sozinho a essa pergunta.
É aqui que o F começa a fazer mais do que repetir um t ao quadrado.
A comprimento do bico constante, a massa aumentou 48.9 g por mm de barbatana, SE = 2.0 g/mm, t330 = 24.03, P < .001. Para o bico, a barbatana constante, o declive estimado foi 5.0 g/mm, SE = 5.2 g/mm, t330 = 0.95, P = .342.
Ainda não distinguimos espécies. A amostragem limita a generalização; ajustar não torna a relação causal.
library(ggplot2)
library(palmerpenguins)
library(tidyr)
ds <- penguins |>
drop_na(species, sex, body_mass_g, flipper_length_mm, bill_length_mm)
model <- lm(body_mass_g ~ flipper_length_mm + bill_length_mm, data = ds)
g <- ggplot(ds, aes(flipper_length_mm, body_mass_g)) + geom_point()
# Print results and plot
summary(model) |> print()
print(g)Um modelo e um resumo: os ts testam cada declive; o F testa os dois em conjunto. A tabela ANOVA e os modelos reduzidos ficaram nas demonstrações.
Call:
lm(formula = body_mass_g ~ flipper_length_mm + bill_length_mm,
data = ds)
Residuals:
Min 1Q Median 3Q Max
-1083.08 -282.65 -17.18 242.95 1293.24
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -5836.299 312.604 -18.670 <2e-16 ***
flipper_length_mm 48.890 2.034 24.034 <2e-16 ***
bill_length_mm 4.959 5.214 0.951 0.342
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 393.4 on 330 degrees of freedom
Multiple R-squared: 0.7627, Adjusted R-squared: 0.7613
F-statistic: 530.4 on 2 and 330 DF, p-value: < 2.2e-16
A massa corporal difere entre espécies?
linha = espécime · species = factor entre unidades
Repetir o rótulo da espécie não é repetir o espécime.
Para descrever três médias, precisamos de três parâmetros. Um já é o intercepto: restam dois para distinguir as espécies.
| Níveis do Factor, \(k\) | Intercepto | Coeficientes de Espécie |
|---|---|---|
| 2 | 1 | 1 |
| 3 | 1 | 2 |
| 4 | 1 | 3 |
Com intercepto, um factor de \(k\) níveis usa \(k-1\) coeficientes. Não acrescentamos um coeficiente por espécime!
\[ \widehat{Y}=b_0+b_A C_A+b_C C_C \]
[,1] [,2]
Adelie 1 0
Chinstrap 0 1
Gentoo -1 -1
Soma-zero não tem grupo de referência. \(b_0\) é a média das três médias, com pesos iguais; \(b_A\) e \(b_C\) são os desvios de Adelie e Chinstrap.
| Espécie | \(C_A\) | \(C_C\) | Massa Prevista |
|---|---|---|---|
| Adelie | 1 | 0 | \(b_0+b_A\) |
| Chinstrap | 0 | 1 | \(b_0+b_C\) |
| Gentoo | −1 | −1 | \(b_0-b_A-b_C\) |
Gentoo não é uma referência escondida. O seu desvio é \(-b_A-b_C\): os três desvios somam zero.
| Espécie | Substituir na Equação | Massa Prevista |
|---|---|---|
| Adelie | \(4177.23-471.07\) | ≈ 3706 g |
| Chinstrap | \(4177.23-444.14\) | ≈ 3733 g |
| Gentoo | \(4177.23+471.07+444.14\) | ≈ 5092 g |
Os coeficientes são interpretáveis. Fazer estas contas à mão é que se torna pouco prático — sobretudo quando quisermos também a incerteza.
species emmean SE df lower.CL upper.CL
Adelie 3706 38.1 330 3631 3781
Chinstrap 3733 55.9 330 3623 3843
Gentoo 5092 42.2 330 5009 5176
Confidence level used: 0.95
As mesmas três médias, agora com erros-padrão e IC 95%. emmeans() combina os coeficientes e a sua incerteza.
Se \(\bar\mu=(\mu_A+\mu_C+\mu_G)/3\), os testes-t de soma-zero avaliam:
| Coeficiente | Hipótese |
|---|---|
species1, \(b_A\)
|
Adelie tem a média \(\bar\mu\) |
species2, \(b_C\)
|
Chinstrap tem a média \(\bar\mu\) |
Não são testes de Adelie contra Chinstrap ou Gentoo. Para perguntar se há diferenças entre espécies, testamos os dois coeficientes em conjunto. Depois pedimos as médias e as comparações que nos interessam.
| Codificação | Coeficiente | O Que Testa o Seu t? |
|---|---|---|
| Soma-zero | species1 |
Adelie = média das três médias |
| Soma-zero | species2 |
Chinstrap = média das três médias |
| 0/1, referência Adelie | speciesChinstrap |
Chinstrap = Adelie |
| 0/1, referência Adelie | speciesGentoo |
Gentoo = Adelie |
O intercepto passa da média das três médias para a média de Adelie.
Mudam os coeficientes e as perguntas dos seus ts, não as médias previstas nem o teste F conjunto de espécie.
Demonstração do teste de espécie: que hipótese representa a linha com 2 gl?
Analysis of Variance Table
Model 1: body_mass_g ~ 1
Model 2: body_mass_g ~ species
Res.Df RSS Df Sum of Sq F Pr(>F)
1 332 215259666
2 330 70069447 2 145190219 341.89 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Compacto: um intercepto. Aumentado: intercepto + dois contrastes.
\(H_0: \beta_A=\beta_C=0\) equivale a três médias iguais. É uma ANOVA com espécie como factor: o mesmo raciocínio omnibus, agora com categorias.
Tracejado: média comum. Verde: uma média por espécie.
Call:
lm(formula = body_mass_g ~ species, data = ds)
Residuals:
Min 1Q Median 3Q Max
-1142.44 -342.44 -33.09 307.56 1207.56
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4177.23 26.59 157.12 <2e-16 ***
species1 -471.07 34.52 -13.65 <2e-16 ***
species2 -444.14 41.80 -10.62 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 460.8 on 330 degrees of freedom
Multiple R-squared: 0.6745, Adjusted R-squared: 0.6725
F-statistic: 341.9 on 2 and 330 DF, p-value: < 2.2e-16
Os ts de species1 e species2 testam \(\beta_A=0\) e \(\beta_C=0\) separadamente. Não são o teste conjunto de igualdade das três médias.
Anova Table (Type III tests)
Response: body_mass_g
Sum Sq Df F value Pr(>F)
(Intercept) 5242015989 1 24687.87 < 2.2e-16 ***
species 145190219 2 341.89 < 2.2e-16 ***
Residuals 70069447 330
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Agora a tabela ANOVA agrupa o que a tabela de coeficientes separa: a linha species testa \(\beta_A=\beta_C=0\), com 2 gl no numerador.
Com \(k\) níveis, o factor tem \(k-1\) coeficientes. Para \(k>2\), nenhum t isolado substitui o teste conjunto do factor.
Como só há um preditor, este é também o F global do resumo: não é outro teste.
Comparámos a massa corporal das três espécies através de uma ANOVA com espécie como factor. Os resultados indicaram diferenças entre espécies, F(2, 330) = 341.89, P < .001.
Não identifica quais as médias que diferem. Nenhum t isolado dos dois contrastes substitui este F com 2 gl.
species emmean SE df lower.CL upper.CL
Adelie 3706 38.1 330 3631 3781
Chinstrap 3733 55.9 330 3623 3843
Gentoo 5092 42.2 330 5009 5176
Confidence level used: 0.95
contrast estimate SE df t.ratio p.value
Adelie - Chinstrap -26.9 67.7 330 -0.398 0.9164
Adelie - Gentoo -1386.3 56.9 330 -24.359 <0.0001
Chinstrap - Gentoo -1359.3 70.0 330 -19.406 <0.0001
P value adjustment: tukey method for comparing a family of 3 estimates
contrast estimate SE df lower.CL upper.CL
Adelie - Chinstrap -26.9 67.7 330 -186 132
Adelie - Gentoo -1386.3 56.9 330 -1520 -1252
Chinstrap - Gentoo -1359.3 70.0 330 -1524 -1194
Confidence level used: 0.95
Conf-level adjustment: tukey method for comparing a family of 3 estimates
Primeiro médias em gramas e IC 95%; depois diferenças na ordem impressa. Tukey ajusta a família das três comparações.
Mais concretamente, Gentoo apresentou maior massa (M = 5092 g, SE = 42.2 g) do que Adelie (M = 3706 g, SE = 38.1 g), t(330) = 24.36, P < .001, e Chinstrap (M = 3733 g, SE = 55.9 g), t(330) = 19.41, P < .001.
Não encontrámos evidência de diferença entre Adelie e Chinstrap, t(330) = −0.40, P = .916. Os valores-P têm ajuste de Tukey. Não encontrar evidência de diferença não estabelece igualdade.
library(emmeans)
library(ggplot2)
library(palmerpenguins)
library(tidyr)
options(contrasts = c("contr.sum", "contr.poly"))
ds <- penguins |>
drop_na(species, sex, body_mass_g, flipper_length_mm, bill_length_mm)
model <- lm(body_mass_g ~ species, data = ds)
emm <- emmeans(model, ~ species)
g <- ggplot(ds, aes(species, body_mass_g)) + geom_boxplot()
# Print results and plot
summary(model) |> print()
print(emm)
pairs(emm) |> summary(infer = TRUE) |> print()
print(g)
Call:
lm(formula = body_mass_g ~ species, data = ds)
Residuals:
Min 1Q Median 3Q Max
-1142.44 -342.44 -33.09 307.56 1207.56
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4177.23 26.59 157.12 <2e-16 ***
species1 -471.07 34.52 -13.65 <2e-16 ***
species2 -444.14 41.80 -10.62 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 460.8 on 330 degrees of freedom
Multiple R-squared: 0.6745, Adjusted R-squared: 0.6725
F-statistic: 341.9 on 2 and 330 DF, p-value: < 2.2e-16
species emmean SE df lower.CL upper.CL
Adelie 3706 38.1 330 3631 3781
Chinstrap 3733 55.9 330 3623 3843
Gentoo 5092 42.2 330 5009 5176
Confidence level used: 0.95
contrast estimate SE df lower.CL upper.CL t.ratio p.value
Adelie - Chinstrap -26.9 67.7 330 -186 132 -0.398 0.9164
Adelie - Gentoo -1386.3 56.9 330 -1520 -1252 -24.359 <0.0001
Chinstrap - Gentoo -1359.3 70.0 330 -1524 -1194 -19.406 <0.0001
Confidence level used: 0.95
Conf-level adjustment: tukey method for comparing a family of 3 estimates
P value adjustment: tukey method for comparing a family of 3 estimates
E se compararmos espécies ao mesmo comprimento da barbatana?
Call:
lm(formula = body_mass_g ~ species + flipper_length_mm, data = ds)
Residuals:
Min 1Q Median 3Q Max
-898.8 -252.0 -24.8 229.8 1191.6
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3986.80 619.53 -6.435 4.36e-10 ***
species1 -26.38 43.81 -0.602 0.547
species2 -231.76 37.50 -6.180 1.89e-09 ***
flipper_length_mm 40.61 3.08 13.186 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 373.3 on 329 degrees of freedom
Multiple R-squared: 0.787, Adjusted R-squared: 0.7851
F-statistic: 405.3 on 3 and 329 DF, p-value: < 2.2e-16
Anova Table (Type III tests)
Response: body_mass_g
Sum Sq Df F value Pr(>F)
(Intercept) 5770339 1 41.412 4.355e-10 ***
species 5368818 2 19.265 1.225e-08 ***
flipper_length_mm 24226302 1 173.864 < 2.2e-16 ***
Residuals 45843144 329
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ANCOVA aditiva: dois contrastes + um declive comum.
Na mesma tabela, species reúne dois coeficientes num F com 2 gl; flipper_length_mm tem um só coeficiente e o seu F repete o \(t^2\).
O F global do resumo não separa estas duas perguntas.
Declive comum; diferenças entre espécies constantes.
Considerando a espécie, a massa aumentou 40.6 g por mm de barbatana, SE = 3.1 g/mm, t329 = 13.19, P < .001. A espécie contribuiu depois de considerar o comprimento, F2, 329 = 19.27, P < .001.
Comparar a comprimento constante não é comparar as médias brutas.
species emmean SE df lower.CL upper.CL
Adelie 4311 55.3 329 4202 4420
Chinstrap 4106 53.4 329 4001 4211
Gentoo 4596 50.9 329 4495 4696
Confidence level used: 0.95
contrast estimate SE df t.ratio p.value
Adelie - Chinstrap 205 57.6 329 3.568 0.0012
Adelie - Gentoo -285 95.4 329 -2.981 0.0086
Chinstrap - Gentoo -490 87.0 329 -5.631 <0.0001
P value adjustment: tukey method for comparing a family of 3 estimates
contrast estimate SE df lower.CL upper.CL
Adelie - Chinstrap 205 57.6 329 69.8 340.9
Adelie - Gentoo -285 95.4 329 -509.2 -59.8
Chinstrap - Gentoo -490 87.0 329 -694.7 -285.1
Confidence level used: 0.95
Conf-level adjustment: tukey method for comparing a family of 3 estimates
Fixámos o comprimento em 205 mm, dentro do intervalo partilhado pelas três espécies. at indica o valor em que pedimos as médias previstas.
A 205 mm de barbatana, Gentoo apresentou maior massa prevista (M = 4596 g, SE = 50.9 g) do que Adelie (M = 4311 g, SE = 55.3 g), t(329) = 2.98, P = .009, e Chinstrap (M = 4106 g, SE = 53.4 g), t(329) = 5.63, P < .001. Adelie também excedeu Chinstrap, t(329) = 3.57, P = .001. Os valores-P têm ajuste de Tukey.
Ao mesmo comprimento, sob a hipótese de declive comum — não as médias brutas de cada espécie.
library(car)
library(emmeans)
library(ggplot2)
library(palmerpenguins)
library(tidyr)
options(contrasts = c("contr.sum", "contr.poly"))
ds <- penguins |>
drop_na(species, sex, body_mass_g, flipper_length_mm, bill_length_mm)
m <- lm(body_mass_g ~ species + flipper_length_mm, data = ds)
adjusted_species <- emmeans(m, ~ species, at = list(flipper_length_mm = 205))
g <- ggplot(ds, aes(flipper_length_mm, body_mass_g, colour = species)) + geom_point()
# Print results and plot
summary(m) |> print()
Anova(m, type = "III") |> print()
print(adjusted_species)
pairs(adjusted_species) |> summary(infer = TRUE) |> print()
print(g)Um declive comum; diferenças entre espécies ao mesmo comprimento.
Call:
lm(formula = body_mass_g ~ species + flipper_length_mm, data = ds)
Residuals:
Min 1Q Median 3Q Max
-898.8 -252.0 -24.8 229.8 1191.6
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3986.80 619.53 -6.435 4.36e-10 ***
species1 -26.38 43.81 -0.602 0.547
species2 -231.76 37.50 -6.180 1.89e-09 ***
flipper_length_mm 40.61 3.08 13.186 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 373.3 on 329 degrees of freedom
Multiple R-squared: 0.787, Adjusted R-squared: 0.7851
F-statistic: 405.3 on 3 and 329 DF, p-value: < 2.2e-16
Anova Table (Type III tests)
Response: body_mass_g
Sum Sq Df F value Pr(>F)
(Intercept) 5770339 1 41.412 4.355e-10 ***
species 5368818 2 19.265 1.225e-08 ***
flipper_length_mm 24226302 1 173.864 < 2.2e-16 ***
Residuals 45843144 329
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
species emmean SE df lower.CL upper.CL
Adelie 4311 55.3 329 4202 4420
Chinstrap 4106 53.4 329 4001 4211
Gentoo 4596 50.9 329 4495 4696
Confidence level used: 0.95
contrast estimate SE df lower.CL upper.CL t.ratio p.value
Adelie - Chinstrap 205 57.6 329 69.8 340.9 3.568 0.0012
Adelie - Gentoo -285 95.4 329 -509.2 -59.8 -2.981 0.0086
Chinstrap - Gentoo -490 87.0 329 -694.7 -285.1 -5.631 <0.0001
Confidence level used: 0.95
Conf-level adjustment: tukey method for comparing a family of 3 estimates
P value adjustment: tukey method for comparing a family of 3 estimates
20 minutos · grupos de 3 ou 5
Modelos Lineares no R — Exercícios
Façam exercício 2.
15 minutos · grupos de 3 ou 5
Comparação de Modelos — Exercícios
Façam exercícios 3 e 4.
15 minutos · grupos de 3 ou 5
Exercício de interpretação, não um passo extra do script.
Comparem body_mass_g ~ flipper_length_mm com body_mass_g ~ species + flipper_length_mm e identifiquem a linha de Anova() que corresponde a essa comparação.
E se o declive não for igual em todas as espécies?