Desenho Experimental e Análise Avançada de Dados Ecológicos
2025-10-07
Ajustar o modelo ou os modelos
Comparar ou testar os modelos
Interpretar os resultados
Repetir até a análise responder à pergunta—ou até aparecer outra pergunta
Podemos usar RMarkdown ou Quarto para gerar e actualizar relatórios automaticamente
Os resultados mudam; o relatório acompanha-os sem uma tarde de copiar-colar, esse conhecido método estatístico
As secções tornam a análise mais fácil de percorrer e rever
Um projecto pequeno pode reuni-las num único script
Num projecto maior, cada fase pode ter o seu próprio script
Comecemos por um exemplo simples.
| species | N | M | SD |
|---|---|---|---|
| Adelie | 152 | 3700.662 | 458.5661 |
| Chinstrap | 68 | 3733.088 | 384.3351 |
| Gentoo | 124 | 5076.016 | 504.1162 |
Lemos da chamada mais interior para a mais exterior
Código compacto nem sempre é código fácil de ler
| species | N | M | SD |
|---|---|---|---|
| Adelie | 152 | 3700.662 | 458.5661 |
| Chinstrap | 68 | 3733.088 | 384.3351 |
| Gentoo | 124 | 5076.016 | 504.1162 |
A indentação mostra quais são os argumentos de cada função
Continuamos a executar group_by() antes de summarise()
| species | N | M | SD |
|---|---|---|---|
| Adelie | 152 | 3700.662 | 458.5661 |
| Chinstrap | 68 | 3733.088 | 384.3351 |
| Gentoo | 124 | 5076.016 | 504.1162 |
Podemos inspeccionar ou reutilizar grouped_ds
É uma forma útil de encontrar erros numa análise mais longa
| species | N | M | SD |
|---|---|---|---|
| Adelie | 152 | 3700.662 | 458.5661 |
| Chinstrap | 68 | 3733.088 | 384.3351 |
| Gentoo | 124 | 5076.016 | 504.1162 |
Pipe significa «tubo»: transporta um valor de um passo para o seguinte
Podemos ler |> como «e depois»
O valor à esquerda torna-se o primeiro argumento da função à direita
Este é o pipe nativo do R, não o operador %>% do tidyverse
corresponde, nesta cadeia simples, a:
O R transforma a primeira expressão na segunda quando analisa o código
Este tipo de sintaxe alternativa chama-se syntactic sugar
Escolhemos a forma que torna a transformação mais fácil de seguir
| species | N | M | SD |
|---|---|---|---|
| Adelie | 152 | 3700.662 | 458.5661 |
| Chinstrap | 68 | 3733.088 | 384.3351 |
| Gentoo | 124 | 5076.016 | 504.1162 |
| species | sex | N | M | SD |
|---|---|---|---|---|
| Adelie | female | 73 | 3368.836 | 269.3801 |
| Adelie | male | 73 | 4043.493 | 346.8116 |
| Adelie | NA | 6 | 3540.000 | 477.1661 |
| Chinstrap | female | 34 | 3527.206 | 285.3339 |
| Chinstrap | male | 34 | 3938.971 | 362.1376 |
| Gentoo | female | 58 | 4679.741 | 281.5783 |
| Gentoo | male | 61 | 5484.836 | 313.1586 |
| Gentoo | NA | 5 | 4587.500 | 338.1937 |
| species | sex | N | Min | Max | M | SD |
|---|---|---|---|---|---|---|
| Adelie | female | 73 | 2850 | 3900 | 3368.836 | 269.3801 |
| Adelie | male | 73 | 3325 | 4775 | 4043.493 | 346.8116 |
| Adelie | NA | 6 | 2975 | 4250 | 3540.000 | 477.1661 |
| Chinstrap | female | 34 | 2700 | 4150 | 3527.206 | 285.3339 |
| Chinstrap | male | 34 | 3250 | 4800 | 3938.971 | 362.1376 |
| Gentoo | female | 58 | 3950 | 5200 | 4679.741 | 281.5783 |
| Gentoo | male | 61 | 4750 | 6300 | 5484.836 | 313.1586 |
| Gentoo | NA | 5 | 4100 | 4875 | 4587.500 | 338.1937 |
| species | sex | N | Min | Max | M | SD |
|---|---|---|---|---|---|---|
| Adelie | female | 73 | 3900 | 3900 | 3368.836 | 269.3801 |
| Adelie | male | 73 | 4775 | 4775 | 4043.493 | 346.8116 |
| Adelie | NA | 6 | 4250 | 4250 | 3540.000 | 477.1661 |
| Chinstrap | female | 34 | 4150 | 4150 | 3527.206 | 285.3339 |
| Chinstrap | male | 34 | 4800 | 4800 | 3938.971 | 362.1376 |
| Gentoo | female | 58 | 5200 | 5200 | 4679.741 | 281.5783 |
| Gentoo | male | 61 | 6300 | 6300 | 5484.836 | 313.1586 |
| Gentoo | NA | 5 | 4875 | 4875 | 4587.500 | 338.1937 |
O nome descreve a decisão tomada sobre os valores omissos
Definimos essa decisão uma vez e podemos testá-la separadamente
Uma função recebe um valor e devolve outro
| species | sex | N | M | SD |
|---|---|---|---|---|
| Adelie | female | 73 | 3368.836 | 269.3801 |
| Adelie | male | 73 | 4043.493 | 346.8116 |
| Adelie | NA | 5 | 3540.000 | 477.1661 |
| Chinstrap | female | 34 | 3527.206 | 285.3339 |
| Chinstrap | male | 34 | 3938.971 | 362.1376 |
| Gentoo | female | 58 | 4679.741 | 281.5783 |
| Gentoo | male | 61 | 5484.836 | 313.1586 |
| Gentoo | NA | 4 | 4587.500 | 338.1937 |
dplyr::summarise() continua a ser a ferramenta que resume os dados
O pipe nativo apenas organiza a passagem do resultado entre os passos
$Adelie
[1] 3700.662
$Chinstrap
[1] 3733.088
$Gentoo
[1] 5076.016
Privilegiamos transformações pequenas que:
recebem os valores necessários através de argumentos;
devolvem um resultado;
podem ser testadas isoladamente;
podem ser combinadas com outras transformações;
evitam alterações escondidas em objectos alheios.
O objectivo é obter clareza e reutilização, não enfiar um pipe em todas as linhas
summary(model)afex::nice(model)car::Anova(model, type = 3)
Call:
lm(formula = body_mass_g ~ flipper_length_mm, data = ds)
Residuals:
Min 1Q Median 3Q Max
-1058.80 -259.27 -26.88 247.33 1288.69
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -5780.831 305.815 -18.90 <2e-16 ***
flipper_length_mm 49.686 1.518 32.72 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 394.3 on 340 degrees of freedom
(2 observations deleted due to missingness)
Multiple R-squared: 0.759, Adjusted R-squared: 0.7583
F-statistic: 1071 on 1 and 340 DF, p-value: < 2.2e-16
Call:
lm(formula = body_mass_g ~ flipper_length_mm, data = ds)
Residuals:
Min 1Q Median 3Q Max
-1058.80 -259.27 -26.88 247.33 1288.69
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -5780.831 305.815 -18.90 <2e-16 ***
flipper_length_mm 49.686 1.518 32.72 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 394.3 on 340 degrees of freedom
(2 observations deleted due to missingness)
Multiple R-squared: 0.759, Adjusted R-squared: 0.7583
F-statistic: 1071 on 1 and 340 DF, p-value: < 2.2e-16
| species | N | M | SD |
|---|---|---|---|
| Adelie | 151 | 3700.662 | 458.5661 |
| Chinstrap | 68 | 3733.088 | 384.3351 |
| Gentoo | 123 | 5076.016 | 504.1162 |
Call:
lm(formula = body_mass_g ~ flipper_length_mm, data = ds)
Residuals:
Min 1Q Median 3Q Max
-1058.80 -259.27 -26.88 247.33 1288.69
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -5780.831 305.815 -18.90 <2e-16 ***
flipper_length_mm 49.686 1.518 32.72 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 394.3 on 340 degrees of freedom
(2 observations deleted due to missingness)
Multiple R-squared: 0.759, Adjusted R-squared: 0.7583
F-statistic: 1071 on 1 and 340 DF, p-value: < 2.2e-16
Pacotes → opções → dados → descritivas → gráfico → modelo → resultados
Esta organização já se aproxima de uma análise de produção
Cada função representa uma operação que aprenderemos ao longo do curso
Não precisam de dominar isto hoje. É o destino, não o ponto de partida
afex
afex::mixed() encapsula um ajuste que seria trabalhoso montar à mãoemmeans() obtém médias marginais estimadas e comparações aos paresO resultado do modelo alimenta a preparação do gráfico
A cadeia continua a ser: dados → função → resultado → função seguinte
Cada script tem uma responsabilidade e declara as suas dependências
run_all.R rege a orquestra; não toca os instrumentos
Os passos principais da análise continuam visíveis
As funções dão nomes a operações repetidas ou conceptualmente importantes
Os objectos intermédios expõem resultados que vale a pena verificar ou reutilizar
Os pipes nativos tornam claras as cadeias lineares de transformação
As funções encastradas continuam a ser úteis em expressões curtas
Não existe uma única sintaxe adequada a todos os trabalhos