EST212 - Bioestatística
Antes de iniciar nossa aula:
Abra o RStudio.
Crie um novo script.
Crie uma pasta na área de trabalho com seu nome.
Defina a pasta como diretório de trabalho
Salve o script criado na pasta com o nome "aula12_est212.R"
.
Baixe do Moodle os arquivos crescimento_plantas.csv
e penguins.csv
salve na pasta criada.
Leia o arquivo crescimento_plantas.csv
para o objeto plantas
e o arquivo penguins.csv
para o objeto penguins
.
Observação: Ao ler os arquivos, na função read.csv
, utilize o parâmetro (stringsAsFactors = TRUE)
. Ele garante que as variáveis de texto sejam importadas como fatores.
Na última aula, exploramos os fundamentos teóricos básicos da ANOVA. Nessa aula, nosso foco principal será a prática.
Conforme vimos, a ANOVA tem como objetivo a comparação de uma variável contínua em grupos definidos por uma variável discreta (fator). Ela apresenta as seguintes hipóteses:
\(H_0\): As médias de todos os grupos são iguais
\(H_1\): Pelo menos um dos grupos apresenta média diferente dos demais.
Vimos também alguns requisitos para sua utilização:
A variável resposta deve ser numérica, enquanto a variável dependente deve ser qualitativa (controlada no experimento).
As observações devem ser independentes entre si e entre os grupos (controlada no experimento).
Os resíduos devem apresentar normalidade, salvo o caso de grandes amostras (grupos com mais de 30 elementos)
As variâncias dos grupos devem ser estatisticamente iguais, ou seja, deve ocorrer a homogeneidade de variâncias.
Hoje vamos aprender a verificar os requisitos e a executar o teste propriamente dito.
A homogeneidade de variâncias entre grupos é verificada por meio de um teste semelhante ao teste F, o Teste de Levene.
O Teste de Levene é um teste estatístico cujo objetivo é verificar se dois ou mais grupos apresentam variâncias iguais entre si, ou se existem diferenças significativas. Suas hipóteses são:
\(H_0\): Todos os grupos apresentam variâncias iguais
\(H_1\): Existe pelo menos um grupo com variância diferente das demais.
Não entraremos em detalhes técnicos sobre a construção do teste. Assim como os demais testes, um p-valor significativo (menor que o nível \(\alpha\) de significância) indica que existem variâncias diferentes entre os grupos.
Para executar o teste de Levene no R, utilizamos a seguinte função:
leveneTest(formula, data = dados)
,em que o objeto formula
é a fórmula usual do tipo x ~ y
e dados
representa o conjunto de dados em estudo.
A função leveneTest
pertence ao pacote car
. Ou seja, antes de utilizarmos o teste, precisamos carregar o pacote utilizando a função library("car")
.
Independente do número de testes realizados, precisamos carregar o pacote apenas uma vez.
Para exemplificar sua aplicação, vamos continuar nosso exemplo de crescimento de plantas, iniciado na aula anterior.
Na aula anterior, começamos a explorar a relação entre o peso de plantas e o tratamento aplicado, com base no conjunto de dados plantas
. Vejamos novamente seu boxplot:
Vimos que aparentemente os tratamentos influenciam no peso das plantas (trt1
< ctrl
< trt2
) e que a variabilidade entre os grupos é visualmente semelhante. Agora vamos aplicar o teste de Levene.
Vamos testar ao nível de 5% de significância as seguintes hipóteses:
\(H_0\): Todos os grupos apresentam as variâncias de peso iguais.
\(H_1\): Existe pelo menos um grupo com variância diferente das demais.
Vejamos como executar o teste
#Carregando o pacote car (necessário fazer apenas uma vez)
library("car")
#Execução do Teste de Levene
leveneTest(peso ~ grupo, data = plantas)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 1.1192 0.3412
27
O p-valor obtido foi 0,3412, que é maior que o nível de significância adotado. Logo, temos evidências ao nível de 5% de significância para afirmar que todos os grupos apresentam variâncias iguais.
Agora que sabemos verificar se os grupos apresentam variâncias homogêneas, falta apenas verificar a normalidade dos resíduos. Entretanto, essa verificação é realizada após o execução da ANOVA. Então vamos aprender a realizar o teste e posteriormente a verificar a normalidade dos resíduos.
A aplicação da análise de variância se dá por meio da função
aov(formula, data = dados)
, em que:
formula
- novamente nossa fórmula habitual, do tipo x~y
dados
- representa o conjunto de dados em estudo.
Para acessar os detalhes da análise de variância, armazenaremos seu resultado em um objeto.
Para acessar seus detalhes, utilizaremos novamente a função summary().
Vamos seguir com a análise do nosso exemplo de crescimento de plantas
Agora que sabemos que a variância entre os grupos é homogênea, queremos testar as seguintes hipóteses:
\(H_0\): O peso médio das plantas é o mesmo entre os tratamentos.
\(H_1\): Existe pelo menos um tratamento cujo peso médio difere dos demais.
Vamos adotar um nível de 5% de significância para o teste. O teste é realizado da seguinte forma:
#Análise de variância - peso por tratamento
anova_peso <- aov(peso ~grupo, data = plantas) #Análise salva no objeto aov_peso
#Resultado da análise de variância
summary(anova_peso)
Df Sum Sq Mean Sq F value Pr(>F)
grupo 2 3.766 1.8832 4.846 0.0159 *
Residuals 27 10.492 0.3886
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Antes de concluirmos, vamos analisar o que significa cada um dos elementos da tabela acima
Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
---|---|---|---|---|---|
grupo | 2 | 3.766 | 1.883 | 4.846 | 0.01591 |
Residuals | 27 | 10.49 | 0.3886 | NA | NA |
Df - graus de liberdade
Sum Sq - somas de quadrados (numerador das variâncias entre e dentro)
Mean Sq - variância entre e variância dentro, respectivamente
F value - valor calculado do teste F
Pr(>F) - p-valor do teste
Agora vamos analisar nossas hipóteses, com \(\alpha = 0,05\):
\(H_0\): O peso médio das plantas é o mesmo entre os tratamentos.
\(H_1\): Existe pelo menos um tratamento cujo peso médio difere dos demais.
Df Sum Sq Mean Sq F value Pr(>F)
grupo 2 3.766 1.8832 4.846 0.0159 *
Residuals 27 10.492 0.3886
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Como o p-valor é menor que o nível de significância (0,0159 < 0,05), temos evidências, ao nível de 5% de significância que nos levam a não aceitar a hipótese nula. Ou seja, podemos afirmar que pelo menos um dos grupos apresenta média diferente dos demais.
Agora que executamos o teste, para que todos os requisitos sejam validados e o teste tenha validade estatística, precisamos testar a normalidade dos resíduos.
Os resultados da ANOVA foram armazenados no objeto aov_peso
. Os resíduos estão armazenados como variável nesse objeto e podem ser acessados inserindo o sufixo $residuals
após o objeto anova_peso
:
1 2 3 4 5 6 7 8 9 10 11
-0.862 0.548 0.148 1.078 -0.532 -0.422 0.138 -0.502 0.298 0.108 0.149
12 13 14 15 16 17 18 19 20 21 22
-0.491 -0.251 -1.071 1.209 -0.831 1.369 0.229 -0.341 0.029 0.784 -0.406
23 24 25 26 27 28 29 30
0.014 -0.026 -0.156 -0.236 -0.606 0.624 0.274 -0.266
Lembrando que o resíduo é a diferença entre cada observação da variável e a média de seu grupo, ou seja:
\[ e_i = x_{ij} - \mu_j \]
Agora que temos acesso aos resíduos, podemos testar sua normalidade por meio do teste de Shapiro-Wilk, com a função shapiro.test.
Vamos verificar a normalidade dos resíduos ao nível de 0,1% de significância.
Shapiro-Wilk normality test
data: anova_peso$residuals
W = 0.96607, p-value = 0.4379
Como o p-valor é maior que 0,1, temos evidências que nos levam a não rejeitar a hipótese de normalidade. Portanto, a análise de variância realizada cumpriu todos os requisitos e seus resultados podem ser interpretados com validade estatística.
Em tese, apenas após essa etapa é válido concluir sob rejeitar ou não rejeitar a hipótese nula, apesar de termos feito a interpretação antes dessa verificação.
Caso a normalidade não fosse verificada, as conclusões não seriam válidadas e outro teste, adequado para dados não normais, deveria ser aplicado.
IMPORTANTE: O teste de normalidade pode ser dispensado se todos os grupos apresentarem mais de 30 observações.
Acabamos de concluir de maneira estatisticamente embasada que o peso médio das plantas é diferente em pelo menos um dos tratamentos.
Essa análise não parece incompleta?
Que pergunta fica em suspenso após essa conclusão?
Acabamos de concluir de maneira estatisticamente embasada que o peso médio das plantas é diferente em pelo menos um dos tratamentos.
Essa análise não parece incompleta?
Que pergunta fica em suspenso após essa conclusão?
“Se existe pelo menos um grupo com um peso médio diferente, quais seriam essas diferenças?”
Para responder essa pergunta, utilizamos um procedimento de comparações múltiplas.
Um procedimento de comparação múltipla executa testes de comparação 2 a 2 para verificar as eventuais diferenças.
Vamos utilizar o teste de comparações de Tukey
O Teste de Tukey é utilizado em comparações 2 a 2. Ou seja, ele irá comparar as médias de todas as possíveis combinações de fatores, 2 a 2. Por exemplo:
Se tivermos 3 fatores, teremos \(C^3_2 = \dfrac{3!}{2!(3-2)!} = \dfrac{3!}{2!} = 3\) comparações.
Se tivermos 4 fatores, teremos \(C^4_2 = \dfrac{4!}{2!(2-2)!} = \dfrac{4!}{2!2!} = 6\) comparações,
e assim sucessivamente.
Para cada comparação, o teste apresenta as seguintes hipóteses:
\(H_0\): A diferença entre as médias dos grupos i e j é igual a zero.
\(H_1\): A diferença entre as médias dos grupos i e j é diferente de zero.
Ou seja, ele verifica se os pares de grupos apresentam a mesma média, ou médias distintas.
O teste de Tukey é realizado por meio da função TukeyHSD
, aplicada ao resultado de nossa ANOVA. Vamos verificar por meio de um exemplo como aplicá-lo no R.
Vamos agora finalizar nossa Análise de Variância. Ao analisar a relação entre o peso das plantas e o tratamento aplicado, concluimos que pelo menos uma das médias era diferente das demais.
O resultado da ANOVA foi armazenado no objeto anova_peso
. Vamos utilizá-lo na realização do teste de Tukey:
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = peso ~ grupo, data = plantas)
$grupo
diff lwr upr p adj
trt1-ctrl -0.371 -1.0622161 0.3202161 0.3908711
trt2-ctrl 0.494 -0.1972161 1.1852161 0.1979960
trt2-trt1 0.865 0.1737839 1.5562161 0.0120064
Novamente, antes de interpretar, vamos entender o que cada informação representa:
grupo:
diff | lwr | upr | p adj | |
---|---|---|---|---|
trt1-ctrl | -0.371 | -1.062 | 0.3202 | 0.3909 |
trt2-ctrl | 0.494 | -0.1972 | 1.185 | 0.198 |
trt2-trt1 | 0.865 | 0.1738 | 1.556 | 0.01201 |
Cada linha representa uma diferença entre médias. Por exemplo, a linha 1 representa a diferença entre as médias de peso de plantas do grupo trt1
e plantas do grupo crtl
.
diff
representa a diferença entre as médias dos grupos.
lwr
e upr
representam os limites do intervalo de confiança para a diferença de médias.
p adj
representa o p-valor do teste de hipóteses para a diferença entre os dois grupos.
Agora vamos interpretar os resultados, ao nível de 5% de significância:
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = peso ~ grupo, data = plantas)
$grupo
diff lwr upr p adj
trt1-ctrl -0.371 -1.0622161 0.3202161 0.3908711
trt2-ctrl 0.494 -0.1972161 1.1852161 0.1979960
trt2-trt1 0.865 0.1737839 1.5562161 0.0120064
Não existe diferença significativa entre o tratamento 1 e o grupo controle.
Não existe diferença significativa entre o tratamento 2 e o grupo controle
Existe diferença significativa entre os tratamentos 1 e 2.
Podemos concluir que plantas tratadas com o tratamento 2 apresentam maior peso, se comparadas com aquelas tratadas com o tratamento 1.
Podemos verificar essas diferenças visualmente, utilizando a função plot
:
Quando o intervalo de confiança das diferenças não contém o zero, temos evidências visuais de que a diferença entre médias é diferente de zero.
Assim, finalizamos todo o processo de análise de variância, desde a identificação da existência ou não de diferenças, até a identificação das diferenças em si.
Conforme vimos até aqui, para executar uma Análise de Variância, devemos executar os seguintes passos:
Verificar se a variável resposta é contínua e segmentada por uma variável discreta (fator).
Analisar visualmente os dados por meio de estatísticas descritivas como média e desvio padrão e gráficos como o boxplot.
Verificar se a variância entre os grupos é homogênea por meio do Teste de Levene (levene.test
).
Executar a ANOVA (aov
)
Verificar a normalidade dos resíduos (shapiro.test
). Se cada grupo da amostra tiver mais de 30 observações, esse teste é dispensável.
Interpretar o p-valor e concluir se as médias dos grupos são iguais, ou se pelo menos uma delas é diferente das demais.
Caso existam diferenças, executar o teste de Tukey para verificar quais são elas.
Vamos fazer um exercício prático para fixar os conceitos aprendidos até aqui.
Vamos utilizar o banco de dados penguins
. Esse banco de dados conta com 8 variáveis:
espécie: fator com os níveis Adelie, Chinstrap e Gentoo
ilha: fator com os níveis Biscoe, Dream e Torgersen
comprimento_bico: numérica
altura_bico: numérica
comprimento_nadadeira: numérica
peso: numérica
sexo: numérica
ano: numérica
Queremos verificar se existe diferenças entre o comprimento da nadadeira conforme as espécies:
Adelie
Chinstrap
Gentoo
Queremos testar as seguintes hipóteses:
\(H_0\): Os comprimentos médios de nadadeira são iguais entre as espécies
\(H_1\): Pelo menos uma das espécies apresenta comprimento médio de nadadeira diferente das demais.
Vamos executar o passo a passo da ANOVA utilizando estes dados.
Primeiramente precisamos verificar se a variável resposta é numérica e a variável explicativa é discreta (fator). Podemos verificar o tipo de todas as variáveis simultaneamente, bem como seus primeiros valores, utilizando a função str
no banco de dados em estudo:
'data.frame': 344 obs. of 8 variables:
$ especie : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
$ ilha : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
$ comprimento_bico : num 39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ...
$ altura_bico : num 18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ...
$ comprimento_nadadeira: int 181 186 195 NA 193 190 181 195 193 190 ...
$ peso : int 3750 3800 3250 NA 3450 3650 3625 4675 3475 4250 ...
$ sexo : Factor w/ 2 levels "female","male": 2 1 1 NA 1 2 1 2 NA NA ...
$ ano : int 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
É fácil verificar que a variável comprimento_nadadeira
é numérica e a variável espécie
é um fator. Logo, os dados atendem ao primeiro requisito.
Vamos verificar o comportamento do comprimento de nadadeira por espécie, por meio da análise descritiva. Primeiramente verificaremos seu comportamento em termos da média e do desvio padrão, usando a função aggregate
:
especie comprimento_nadadeira
1 Adelie 189.9536
2 Chinstrap 195.8235
3 Gentoo 217.1870
especie comprimento_nadadeira
1 Adelie 6.539457
2 Chinstrap 7.131894
3 Gentoo 6.484976
Aparentemente, a espécie Chinstrap possui um comprimento médio maior se comparado às demais, que apresentam comprimento semelhante.
Em relação ao desvio padrão, há indícios de que os grupos apresentam homogeneidade.
Vamos verificar a relação entre os dados utilizando o boxplot
A relação entre as espécies e o comprimento de nadadeira fica um pouco mais clara ao se observar a análise gráfica, assim como a homogeneidade das variâncias.
A análise descritiva apresenta indícios de que existe homogeneidade de variâncias. Vamos comprovar utilizando o Teste de Levene, ao nível de significância 5% (\(\alpha = 0,05\)). Suas hipóteses são:
\(H_0\): Todos os grupos apresentam variâncias iguais
\(H_1\): Existe pelo menos um grupo com variância diferente das demais.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.3306 0.7188
339
Como o p-valor > 0,05, ao nível de 5% de significância, podemos afirmar que as variâncias dos comprimentos de nadadeira entre os grupos são homogêneas.
Como as variâncias são homogêneas, podemos executar a ANOVA. Vamos utilizar 5% de significância. As hipóteses para esse exercício são:
\(H_0\): Os comprimentos médios de nadadeira são iguais entre as espécies
\(H_1\): Pelo menos uma das espécies apresenta comprimento de nadadeira diferente das demais.
#Análise de Variância
anova_nadadeira <- aov(comprimento_nadadeira ~ especie, data = penguins)
#Detalhes da ANOVA
summary(anova_nadadeira)
Df Sum Sq Mean Sq F value Pr(>F)
especie 2 52473 26237 594.8 <2e-16 ***
Residuals 339 14953 44
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
2 observations deleted due to missingness
Antes de interpretarmos seu resultado, precisamos verificar a normalidade dos resíduos
Antes de interpretar os resultados, precisamos verificar a normalidade dos resíduos. Nesse exemplo, como temos mais de 30 indivíduos por grupo, o teste é dispensável. Vamos realizá-lo para fins ilustrativos.
Os resíduos estão armazenados no objeto anova_nadadeira$residuals
.
Vamos veriricar a normalidade com o teste de Shapiro-Wilk, ao nível de 10% de significância:
Shapiro-Wilk normality test
data: anova_nadadeira$residuals
W = 0.99452, p-value = 0.2609
Como p-valor > 0,1, temos evidências ao nível de 10% de significância para não rejeitar a hipótese nula, logo, podemos concluir que os resíduos são normais. Portanto, todos os requisitos foram atendidos e agora podemos interpretar o resultado da ANOVA com validade estatística.
Vamos novamente examinar o resultado da ANOVA:
Df Sum Sq Mean Sq F value Pr(>F)
especie 2 52473 26237 594.8 <2e-16 ***
Residuals 339 14953 44
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
2 observations deleted due to missingness
Como p-valor < 0,05, temos evidências ao nível de 5% de significância para não aceitar a hipótese nula. Ou seja, pelo menos uma das espécies apresenta comprimento médio de nadadeira diferente das demais.
Como identificamos a existência de diferenças nas médias, vamos verificá-las por meio do teste de Tukey, ao nível de 5% de significância
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = comprimento_nadadeira ~ especie, data = penguins)
$especie
diff lwr upr p adj
Chinstrap-Adelie 5.869887 3.586583 8.153191 0
Gentoo-Adelie 27.233349 25.334376 29.132323 0
Gentoo-Chinstrap 21.363462 19.000841 23.726084 0
Note que todos os p-valores são significativos (menores que 0,05), ou seja, as três espécies de penguins apresentam comprimentos médios de nadadeiras diferentes. Pela análise descritiva, podemos concluir que a ordem crescente de comprimento de nadadeiras é a seguinte: Adelie <Chinstrap < Gentoo
.
Refaça o exemplo de crescimento de plantas.
Refaça o exercício prático que compara o comprimento da nadadeira por espécie.
Verifique por meio de uma ANOVA se existem diferenças significativas no comprimento de bico dos penguins por espécie.
Não se esqueça de incluir no script a interpretação dos resultados.