Transformação de dados é uma das possíveis formas de contornar o problema de dados que não obedecem os pressupostos da análise de variância. Vamos ver como isto poder ser feito com o programa R.
Considere o seguinte exemplo da apostila do curso.
| Trat | ||||||
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 1 | 2370 | 1687 | 2592 | 2283 | 2910 | 3020 |
| 2 | 1282 | 1527 | 871 | 1025 | 825 | 920 |
| 3 | 562 | 321 | 636 | 317 | 485 | 842 |
| 4 | 173 | 127 | 132 | 150 | 129 | 227 |
| 5 | 193 | 71 | 82 | 62 | 96 | 44 |
Inicialmente vamos entrar com os dados usando scan() e montar um data-frame.
> y <- scan() 1: 2370 2: 1687 3: 2592 ... 30: 44 31: Read 30 items
> tr <- data.frame(trat = factor(rep(1:5, each=6)), resp = y) > str(tr)
'data.frame': 30 obs. of 2 variables: $ trat: Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 2 2 2 2 ... $ resp: num 2370 1687 2592 2283 2910 ...
A seguir vamos fazer ajustar o modelo e inspecionar os resíduos.
> tr.av <- aov(resp ~ trat, data=tr) > plot(tr.av)
O gráfico de resíduos vs valores preditos mostra claramente uma heterogeneidade de variâncias e o \(QQ-plot\) mostra um comportamento dos dados que se afasta muito da normal. A mensagem é clara mas podemos ainda fazer testes para verificar o desvio dos pressupostos.
> bartlett.test(tr$resp, tr$trat)
Bartlett test of homogeneity of variances
data: tr$resp and tr$trat
Bartlett's K-squared = 29.586, df = 4, p-value = 5.942e-06
> shapiro.test(tr.av$res)
Shapiro-Wilk normality test
data: tr.av$res
W = 0.89608, p-value = 0.006742
Nos resultados acima vemos que a homogeneidade de variâncias foi rejeitada.
Para tentar contornar o problema vamos usar a transformação Box-Cox, que consiste em transformar os dados de acordo com a expressão \[y' = \frac {y^\lambda - 1}{\lambda },\] onde \(\lambda \) é um parâmetro a ser estimado dos dados. Se \(\lambda = 0\) a equação acima se reduz a \[y' = \log (y),\] onde \(\log \) é o logaritmo neperiano. Uma vez obtido o valor de \(\lambda \) encontramos os valores dos dados transformados conforme a equação acima e utilizamos estes dados transformados para efetuar as análises.
A função boxcox() do pacote MASS calcula a verossimilhança perfilhada do parâmetro \(\lambda \). Devemos escolher o valor que maximiza esta função. Nos comandos a seguir começamos carregando o pacote MASS e depois obtemos o gráfico da verossimilhança perfilhada. Como estamos interessados no máximo fazermos um novo gráfico com um zoom na região de interesse.
> require(MASS) > boxcox(resp ~ trat, data=tr, plotit=T) > boxcox(resp ~ trat, data=tr, lam=seq(-1, 1, 1/10))
O gráfico mostra que o valor que maximiza a função é aproximadamente \(\hat {\lambda } = 0.1\). Desta forma o próximo passo é obter os dados transformados e depois fazer as análise utilizando estes novos dados.
> tr$respt <- (tr$resp^(0.1) - 1)/0.1 > tr.avt <- aov(respt ~ trat, data=tr) > plot(tr.avt)
Note que os resíduos têm um comportamento bem melhor do que o observado para os dados originais. A análise deve prosseguir usando então os dados transformados.
NOTA: No gráfico da verossimilhança perfilhada notamos que é mostrado um intervalo de confiança para \(\lambda \) e que o valor \(0\) está contido neste intervalo. Isto indica que podemos utilizar a transformação logarítmica dos dados e os resultados serão bem próximos dos obtidos com a transformação previamente adotada.
> tr.avl <- aov(log(resp) ~ trat, data=tr) > plot(tr.avl)
Carregando pacotes exigidos: mgcv
Carregando pacotes exigidos: nlme
This is mgcv 1.9-4. For overview type '?mgcv'.