16 Transformação de dados

Tranformação de dados é uma das possíveis formas de contarnar 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.


Tabela: Número de reclamações em diferentes sistemas de atendimento
Trat Repetições  
  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 a função 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)
> tr

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 menssagem é clara mas podemos ainda fazer testes para verificar o desvio dos pressupostos.

> bartlett.test(tr$resp, tr$trat)

        Bartlett test for 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.939, p-value = 0.08535

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

\begin{displaymath}y' = \frac{y^\lambda - 1}{\lambda},\end{displaymath}

onde $\lambda$ é um parâmeto a ser estimado dos dados. Se $\lambda = 0$ a equação acima se reduz a

\begin{displaymath}y' = \log(y),\end{displaymath}

onde $\log$ é o logarítmo 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 tem 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ítimica dos dados e os resultados serão bom próximos dos obtidos com a transformação préviamente adotada.

tr.avl <- aov(log(resp) ~ trat, data=tr)
plot(tr.avl)
Paulo Justiniano Ribeiro Jr