Para facilitar a vida do usuário, irei fazer uma função que faz a transformação boxcox “quase” que automaticamente. Em alguns casos pode ser necessário alterar o intervalo de lambda para que o lambda estimado seja o mais preciso possível. Logo, aconselho o uso da função acompanhado do gráfico para que não haja erro. Segue a função:
library(MASS)
bx <- function(x, data, lambda = seq(-2,2,1/10),plotit=TRUE,...){ #um objeto da classe lm, aov
if(!require(MASS)){
install.packages('MASS')
}
aux <- MASS::boxcox(object = x,data = data, lambda = lambda,plotit=plotit,...)
aux2 <- do.call('cbind',aux)
aux3 <- which(aux2 == max(aux2[,2]), arr.ind=TRUE)
aux4 <- aux2[aux3[1,1],]
lambda <- aux4[1]
if(class(x) == 'formula'){
oldvar <- data[[all.vars(x)[1]]]
} else {
oldvar <- x$model$res
}
newvar <- (oldvar^lambda - 1)/lambda
res <- list(resp = newvar,
lambda = lambda)
return(res)
}
Fazendo as transformações tem-se:
t1 = c(20.5,28.1,27.8,27,28,25.2,25.3,27.1,20.5,31.3)
t2 = c(26.3,24,26.2,20.2,23.7,34,17.1,26.8,23.7,24.9)
t3 = c(29.5,34,27.5,29.4,27.9,26.2,29.9,29.5,30,35.6)
t4 = c(36.5,44.2,34.1,30.3,31.4,33.1,34.1,32.9,36.3,25.5)
dados1 <- data.frame(Tipos = rep(c('t1','t2','t3','t4'),rep(10,4)),
resp = c(t1,t2,t3,t4))
yraiz <- sqrt(dados1$resp)
ylog <- log(dados1$resp)
# No caso da função boxcox, devemos informar o modelo estatístico.
ybox <- bx(x = resp ~ Tipos, data = dados1, plotit=F)[[1]]
# Colocando as novas variáveis na base de dados
dados1$yraiz <- round(yraiz,4)
dados1$ylog <- round(ylog,4)
dados1$ybox <- round(ybox,4)
# Logo tem-se os seguintes dados:
dados1
## Tipos resp yraiz ylog ybox
## 1 t1 20.5 4.5277 3.0204 8.5404
## 2 t1 28.1 5.3009 3.3358 10.6664
## 3 t1 27.8 5.2726 3.3250 10.5873
## 4 t1 27.0 5.1962 3.2958 10.3745
## 5 t1 28.0 5.2915 3.3322 10.6401
## 6 t1 25.2 5.0200 3.2268 9.8862
## 7 t1 25.3 5.0299 3.2308 9.9137
## 8 t1 27.1 5.2058 3.2995 10.4012
## 9 t1 20.5 4.5277 3.0204 8.5404
## 10 t1 31.3 5.5946 3.4436 11.4909
## 11 t2 26.3 5.1284 3.2696 10.1862
## 12 t2 24.0 4.8990 3.1781 9.5529
## 13 t2 26.2 5.1186 3.2658 10.1591
## 14 t2 20.2 4.4944 3.0057 8.4505
## 15 t2 23.7 4.8683 3.1655 9.4685
## 16 t2 34.0 5.8310 3.5264 12.1606
## 17 t2 17.1 4.1352 2.8391 7.4881
## 18 t2 26.8 5.1769 3.2884 10.3209
## 19 t2 23.7 4.8683 3.1655 9.4685
## 20 t2 24.9 4.9900 3.2149 9.8035
## 21 t3 29.5 5.4314 3.3844 11.0315
## 22 t3 34.0 5.8310 3.5264 12.1606
## 23 t3 27.5 5.2440 3.3142 10.5078
## 24 t3 29.4 5.4222 3.3810 11.0057
## 25 t3 27.9 5.2820 3.3286 10.6137
## 26 t3 26.2 5.1186 3.2658 10.1591
## 27 t3 29.9 5.4681 3.3979 11.1346
## 28 t3 29.5 5.4314 3.3844 11.0315
## 29 t3 30.0 5.4772 3.4012 11.1602
## 30 t3 35.6 5.9666 3.5723 12.5474
## 31 t4 36.5 6.0415 3.5973 12.7619
## 32 t4 44.2 6.6483 3.7887 14.5179
## 33 t4 34.1 5.8395 3.5293 12.1850
## 34 t4 30.3 5.5045 3.4111 11.2370
## 35 t4 31.4 5.6036 3.4468 11.5161
## 36 t4 33.1 5.7533 3.4995 11.9398
## 37 t4 34.1 5.8395 3.5293 12.1850
## 38 t4 32.9 5.7359 3.4935 11.8904
## 39 t4 36.3 6.0249 3.5918 12.7145
## 40 t4 25.5 5.0498 3.2387 9.9685
Precisamos fazer uma anova para cada variável transformada. Em seguida vamos extrair os resíduos e fazer os gráficos.
modorig <- aov(resp ~ Tipos, data=dados1)
modraiz <- aov(yraiz ~ Tipos, data=dados1)
modlog <- aov(ylog ~ Tipos, data=dados1)
modbox <- aov(ybox ~ Tipos, data=dados1)
errosorig <- residuals(modorig)
errosraiz <- residuals(modraiz)
erroslog <- residuals(modlog)
errosbox <- residuals(modbox)
par(mfrow=c(2,2))
qqnorm(errosorig,main='Escala original')
qqline(errosorig)
qqnorm(errosraiz,main='Escala raiz')
qqline(errosraiz)
qqnorm(erroslog, main='Escala logarítmica')
qqline(erroslog)
qqnorm(errosbox, main='Escala BoxCox')
qqline(errosbox)
Como podemos observar nos gráficos, parece que as transformações não resolveram a normalidade. Vamos apresentar o teste de Lilliefors para todas as variáveis (original e transformada) para que possamos julgar melhor. Segue os p-valores:
## Original Raiz Log Box
## 0.028903432 0.013253690 0.004051292 0.016000014
Os pvalores atestam a análise gráfica, ou seja, nenhuma transformação resolveu o problema da normalidade. Neste caso recomenda-se um outro tipo de análise que não faz uso de tal pressuposto como a análise não-paramétrica.