#=============================================================================== #. Name : Transformação de dados #. Author : J.C.Faria # Date : 2023-07-06 00:14:34 # Aim : Ilustrar conceitos de transformação de dados no R # Mail : <<>> #=============================================================================== # Referência # <<< http://www.leg.ufpr.br/Rpira/Rpira/node17.html >>> #. Pacotes necessários lmtest MASS #. Dados Y <- c(2370, 1687, 2592, 2283, 2910, 3020, 1282, 1527, 871, 1025, 825, 920, 562, 321, 636, 317, 485, 842, 173, 127, 132, 150, 129, 227, 193, 71, 82, 62, 96, 44) dad <- data.frame(X=factor(rep(1:5, each=6)), Y) str(dad) head(dad, 10) #. ANOVA av <- aov(Y ~ X, data=dad) summary(av) #.. Diagonóstico par(mfrow=c(2, 2)) plot(av) #... Observar violações dos préssupostos da Análise de Variância #... Interpretação dos gráficos # ------------- # | 1 | 3 | # ------------- # | 2 | 4 | # ------------- # 1: Falta de ajuste (Residuals vs. Fitted) # 2: Suposição de variância constante (Scale-Location) # 3: Gráfico de normalidade (Normal Q-Q) # 4: Observações influentes (Residuals vs Factor Levels) #.. Testes #... Normalidade dos erros: Shapiro-Wilk shapiro.test(av$res) # Violação: erros seguem não distribuição normal! #... Homogeneidade das variâncias: Bartlett e fligner # Teste mais rigoroso with(dad, bartlett.test(av$residuals ~ X)) # Violação: variâncias não são homogêneas! # Teste rigor intermediário with(dad, fligner.test(Y ~ X)) # Violação: variâncias não são homogêneas! #... Independência dos erros: Durbin-Watson require(lmtest) lmtest::dwtest(av) # OK! os erros são independentes! #.. Transformação Box-Cox require(MASS) par(mfrow=c(1, 1)) # Três opções básicas abaixo com o mesmo resultado numérico bc <- boxcox(av) str(bc) bc <- boxcox(Y ~ X, data=dad) str(bc) bc <- boxcox(Y ~ X, data=dad, lambda=seq(-1, 1, 1/10)) str(bc) #... Descobrindo o valor exato de lambda (lambda <- bc$x[which.max(bc$y)]) #... Transformações Box-Cox mais comuns # -------------------------- # lambda Transformação # -------------------------- # -3 1/y^3 # -2 1/y^2 # -1 1/y # -0.5 1/sqrt(y) # 0 log(y) # 0.5 sqrt(y) # 1 Nenhuma # 2 y^2 # 3 y^3 #----------------------- #... Testando aproximações do lambda dad$Y_t1 <- (dad$Y^(lambda) - 1)/lambda # (exato - centro do I.C) dad$Y_t2 <- (sqrt(dad$Y)) # (~ 0.5 - acima fora do I.C) dad$Y_t3 <- (dad$Y^(0.1) - 1)/0.1 # (~ 0.1 - abaixo dentro do I.C) dad$Y_t4 <- (log(dad$Y)) # (~ 0.0 - abaixo dentro do I.C) str(dad) # Visualizando as aproximações ap <- c(lambda, 0.5, 0.1, 0) # Zoom no gráfico de boxcox boxcox(av, lam=seq(-0.2, .6, 1/10)) abline(v=ap, col='red', lty=2, lw=2) text(x=ap, y=seq(-16, -19, by=-1), labels=c('0.19', '0.50', '0.10', '0.00'), cex=2, col='darkgreen') #. ANOVA e diagnóstico: T1 (exato - centro do I.C) av_t1 <- aov(Y_t1 ~ X, data=dad) par(mfrow=c(2, 2)) plot(av_t1) #.. Testes #... Normalidade dos erros: Shapiro-Wilk shapiro.test(av_t1$res) # OK: erros seguem distribuição normal! #... Homogeneidade das variâncias: Bartlett e fligner # Teste mais rigoroso with(dad, bartlett.test(av_t1$residuals ~ X)) # OK: variâncias são homogêneas! # Teste rigor intermediário with(dad, fligner.test(Y_t1 ~ X)) # OK: variâncias são homogêneas! #... Independência dos erros: Durbin-Watson lmtest::dwtest(av_t1) # OK! os erros são independentes! #. ANOVA e diagnóstico: T2 (~ 0.5 - acima fora do I.C) av_t2 <- aov(Y_t2 ~ X, data=dad) par(mfrow=c(2, 2)) plot(av_t2) #.. Testes #... Normalidade dos erros: Shapiro-Wilk shapiro.test(av_t2$res) # OK: erros seguem distribuição normal! #... Homogeneidade das variâncias: Bartlett e fligner # Teste mais rigoroso with(dad, bartlett.test(av_t2$residuals ~ X)) # OK: variâncias são homogêneas! # Teste rigor intermediário with(dad, fligner.test(Y_t2 ~ X)) # OK: variâncias são homogêneas! #... Independência dos erros: Durbin-Watson lmtest::dwtest(av_t2) # OK! os erros são independentes! #. ANOVA e diagnóstico: T3 (~ 0.1 - abaixo dentro do I.C) av_t3 <- aov(Y_t3 ~ X, data=dad) par(mfrow=c(2, 2)) plot(av_t3) #.. Testes #... Normalidade dos erros: Shapiro-Wilk shapiro.test(av_t3$res) # OK: erros seguem distribuição normal! #... Homogeneidade das variâncias: Bartlett e fligner # Teste mais rigoroso with(dad, bartlett.test(av_t3$residuals ~ X)) # OK: variâncias são homogêneas! # Teste rigor intermediário with(dad, fligner.test(Y_t3 ~ X)) # OK: variâncias são homogêneas! #... Independência dos erros: Durbin-Watson lmtest::dwtest(av_t3) # OK! os erros são independentes! #. ANOVA e diagnóstico: T4 (~ 0 - abaixo dentro do I.C) av_t4 <- aov(Y_t4 ~ X, data=dad) par(mfrow=c(2, 2)) plot(av_t4) #.. Testes #... Normalidade dos erros: Shapiro-Wilk shapiro.test(av_t4$res) # OK: erros seguem distribuição normal! #... Homogeneidade das variâncias: Bartlett e fligner # Teste mais rigoroso with(dad, bartlett.test(av_t4$residuals ~ X)) # OK: variâncias são homogêneas! # Teste rigor intermediário with(dad, fligner.test(Y_t4 ~ X)) # OK: variâncias são homogêneas! #... Independência dos erros: Durbin-Watson lmtest::dwtest(av_t4) # OK! os erros são independentes! # Conclusões: # - Todas as transformações testadas foram adequadas para os dados em questão # - A transformação Box-Cox, na maioria dos casos, pode ser aproximada # para valores dentro do interalo de confiança para lambda, ou próximos.