## Objetivos: ## a) Permitir a modelagem da ANOVA com número variado de grupos e ##repetições ## b) Exibir resultados numéricos e gráficos ## c) Comparar os resultados por 2 métodos diferentes de ##discriminação dos grupos ## Pacotes necessários: ## - plotrix ## - TukeyC ## - ScottKnott ##=============================================================================== ## Dados para modelagem alfa <- .08 # Probabilidade do erro tipo I na inferência da ANOVA r <- 7 # Número de repetições de cada grupo (tratamento) M <- c(60, 60, # 60, # 63, 65) # Médias dos grupos SD <- 6 # Desvio padrão dos grupos ##=============================================================================== ## Opção de cores ocol <- rainbow(length(M)) ## Funções plotar_info_Ft <- function() { polygon(x=c(Ft, seq(Ft, 20, length=1e3)), y=c(0, df(seq(Ft, 20, length=1e3), length(M) - 1, length(M) * (r-1))), col='darkred') segments(x0=Ft, x1=Ft, y0=0, y1=1, lty=3, col='darkred') text(x=Ft, y=0.4, pos=4, offset=0, bquote(alpha == .(alfa)), cex=1.4, col='darkred') points(x=Ft, y=-.06, pch=17, cex=1.5, col='darkred') } plotar_info_Fc <- function() { polygon(x=c(Fc, seq(Fc, 20, length=1e3)), y=c(0, df(seq(Fc, 20, length=1e3), length(M) - 1, length(M) * (r-1))), col=gray(.5)) if (Fc <= 15) { segments(x0=Fc, x1=Fc, y0=0, y1=.15, lty=3) } if (Fc <= 15) { text(x=Fc, y=0.12, pos=4, offset=0, bquote(P == .(tab[1, 5])), cex=1.4) } else { text(x=15, y=0.12, pos=4, offset=0, bquote(P == .(tab[1, 5])), cex=1.4) } } ## Início da modelagem ## Gerando grupos com r repetições com distribuição normal em um data.frame dad <- data.frame(tr=gl(length(M), r, labels=LETTERS[1:length(M)]), y=rnorm(length(M) * r, rep(M, each=r), sd=SD)) ## Análise de variância av <- aov(y ~ tr, data=dad) sav <- summary(av) tab <- as.data.frame(round(sav[[1]][, 1:5], 2)) cv <- 100 * sqrt(tab[2, 3]) / mean(dad$y) colnames(tab)=c('Gl', 'SQ', 'QM', 'Fcal', 'P(>Fcal)') rownames(tab)=c('Grupos', 'Resíduo') ## Calculando médias e desvios dos grupos medias <- with(dad, tapply(y, tr, mean)) desvios <- with(dad, tapply(y, tr, sd)) ## O ordenamento irá facilitar a padronização de cores nos plots ord <- order(medias) medias <- sort(medias) desvios <- desvios[ord] ## Valores F Ft <- qf(alfa, length(M) - 1, length(M) * (r-1), lower.tail=FALSE) Fc <- tab[1, 4] ## Verificar dispositivo gráfico if (is.null(dev.list())) X11(w=8, h=8) ## Layout do dispositivo gráfico layout(matrix(1:6, ncol=2, byrow=T), heights=c(3, 4, 4)) ## Plot da tabela plot(0.5, type = 'n', axes=F, xlab='', ylab='') ## Tabela da ANOVA no plot suppressMessages(require(plotrix)) addtable2plot(.5, .4, tab, display.rownames=TRUE, bg=gray(.8), cex=1.8) mtext('ANOVA') mtext(paste('cv = ', round(cv, 2), '%', sep=''), side=1) ## Distribuição F e decisão da inferência curve(df(x, length(M) - 1, length(M) * (r-1)), from=0, to=20, n=1e3, xlab='F', ylab='f(F)', ylim=c(-.09, 1), col=gray(.4)) text(x=Ft, y=0.8, lab=c('RAHo', 'RRHo'), pos=c(2, 4), offset=.5, cex=1.4, col=c('darkgreen', 'darkred')) ## Decisão da ANOVA if(Fc < Ft){ points(Fc, y=-.08, pch=17, cex=2, col=gray(.5)) mtext(text = 'Não rejeita Ho', cex=1.5, col='darkgreen') } else { mtext('Rejeita Ho', cex=1.5, col='darkred') if(Fc <= 15){ points(Fc, y=-.08, pch=17, cex=2, col=gray(.5)) } else { text(15, -.08, pos=4, offset=0, expression(Delta > 15), cex=1.3, col=gray(.5)) } } ## Plotando áreas sob a distribuição F if(Fc >= Ft){ plotar_info_Ft() plotar_info_Fc() } else { plotar_info_Fc() plotar_info_Ft() } legend('topright', pch=17, col=c('darkred', gray(.5)), legend=c('Ftab', 'Fcal'), cex=1.5) means_dec <- with(dad, reorder(tr, -y, mean)) boxplot(y ~ means_dec, data=dad, xlab='Grupos', ylab='Y', col=ocol) ## Plotando as densidades dos grupos plot(1, type='n', ylab='Densidade', xlab='Médias dos grupos', xlim=c( .3 * min(medias), 1.7 * max(medias)), ylim=c(-.005, max(c(dnorm(medias[1:length(M)], medias[1:length(M)], desvios[1:length(M)]))))) for(i in 1:length(M)){ curve(dnorm(x, medias[i], desvios[i]), .2 * min(medias[i]), 1.8 * max(medias[i]), n=1e3, add=TRUE, col=rev(ocol)[i], lw=1.5) } for(i in 1:length(M)){ segments(medias[i], max(dnorm(medias[i], medias[i], desvios[i])), medias[i], 0, col=rev(ocol)[i], lty=3) } for(i in 1:length(M)){ text(medias[i], -.005, substitute(mu[i], list(i = LETTERS[ord][i])), col=rev(ocol)[i]) } legend('topright', rev(LETTERS[ord]), lty=rep(1, length(M)), lw=2, col=ocol) ## Tukey suppressMessages(require(TukeyC)) tk <- TukeyC(av, sig.level=alfa) plot(tk, xlab='Grupos', ylab='Y', col=ocol, title=paste('Tukey', ' (', 100*alfa, '%', ')', sep=''), cex=1.2) ## ScottKnott suppressMessages(require(ScottKnott)) sk <- SK(av, sig.level=alfa) plot(sk, xlab='Grupos', ylab='Y', title=paste('Scott & Knott', ' (', 100*alfa, '%', ')', sep=''), cex=1.2, col=gray(seq(0, .8, length=length(unique(sk$groups)))))
# Coeficiente de Variação
# Arguments: # av : an lm, aov or aovlist object # round : rounds the values of cv to the specified number of decimal places (default 2) cv <- function(av, round=2) { if(is.null(av)) stop('Please, check the parameter!') if(inherits(av, 'lm')) { qmee <- with(av, sum(residuals^2) / df.residual) m <- mean(av$fitted.values) cv <- 100 * sqrt(qmee) / m names(cv) <- 'cv' return(round(cv, round)) } if(inherits(av, 'aovlist')) { sm.av <- summary(av) qmee <- sapply(sm.av, function(i){ i[[1]]["Residuals", 3] }) qmee <- qmee[!is.na(qmee)] m <- av$'(Intercept)'$coefficients[[1]] cv <- 100 * sqrt(qmee) / m names(cv) <- paste('cv(', letters[1:length(qmee)], ')', sep='') return(round(cv, round)) } }