Sei sulla pagina 1di 11

Script R – ANOVA COM TESTES DE COMPARAÇÃO DE MÉDIAS E CONTRASTES

# ======================================================================
# ANÁLISE DE VARIÂNCIA - ENTRANDO DADOS PARA UMA ANOVA - "read.table ()"
# ======================================================================
help (read.table)
exp1 <- read.table (file="C:/Users/Joao/Desktop/Estat_EXp_I/TCM_SIM.csv", sep=",", header=TRUE) # Buscando
dados de outro arquivo (neste caso, gerado como CSV no Excel)
exp1
head(exp1) # lista o cabeçalho do conjunto de dados (seis primeiras linhas apenas)
plot(exp1) # gráfico para inspeções iniciais (ex. correlações entre variáveis mensuradas nas
parcelas)
summary(exp1) # resumo estatísticos simples das variáveis do conjunto de dados
names(exp1) # lista as variávies no objeto 'exp1'
attach(exp1) # com este comando o problema se resolve , pois o objeto 'exp1' agora é anexado
diretamente ao caminho de busca do R

# PREPARANDO PARA UMA ANOVA - declarando Fatores (duas opções)


# ============================================================
str(exp1)
exp1$Trat <- factor(exp1$Trat)
exp1$Bloco <- factor(exp1$Bloco)
Trat <- as.factor(Trat) # Depende do comando 'attach' ter sido executado antes
Bloco <- as.factor(Bloco)

# Carregando pacotes úteis


require(agricolae)
require(ExpDes)
require(doBy)
require(contrast)
require(multicomp)
require(lattice)
require(latticeExtra)

# ANOVA DE DADOS BALANCEADOS / MODELO FIXO (Delin. Blocos ao Acaso)


# ================================================================
is.factor(Trat) # checagem fundamental (pois, numa ANOVA, a variável TRAT deve ser um fator, não uma
variável numérica)
levels(Trat)
is.factor(Bloco) # checagem fundamental (pois, numa ANOVA, a variável TRAT deve ser um fator, não uma
variável numérica)
levels(Bloco)

modelo1a <- aov(Y ~ Bloco+ Trat, data=exp1)


modelo1a
summary(modelo1a)
anova(modelo1a)

modelo1 <- lm(Y ~ Bloco+ Trat, data=exp1)


modelo1
summary(modelo1) # soluções do sistema de equações normais ("estimativas" dos parâmetros)
anova(modelo1) # quadro da análise de variância (nesta saída "Residual standard error" é o desvio padrão
residual = Raiz(QMerro))
names(modelo1) # variáveis com resultados do ajuste do modelo definido no objeto 'modelo1b'
par(mfrow=c(2,2)) # divide a matriz gráfica em duas linhas e duas colunas (recebe quatro gráficos)
plot(modelo1) # diagnóstico inicial de problemas relacionados às pressuposições da ANOVA clássica
layout(1) # retorna à configuração gráfica padrão (um gráfico por página)

library(lmtest)
dwtest(Y ~ Bloco + Trat, data=exp1) # teste de independência dos resíduos (default - Ha:
autocorrelação positiva)
shapiro.test(residuals(modelo1)) # teste de normalidade dos resíduos
bartlett.test(residuals(modelo1)~exp1$Trat) # teste de homogeneidade das variâncias de TRAT
library(asbio)
tukey.add.test(Y, Trat, Bloco) # teste de aditividade (1a. opção)
# Teste dos desvios de aditividade - 2a. opção (script J. B. Duarte / UFG)
qij <- modelo1$fitted.values**2
mod_NA <- lm(qij ~ Bloco + Trat, data=exp1) # atualizar o modelo em caso de outro delineamento
A <- sum(mod_NA$residuals^2)
B <- sum(modelo1$residuals*qij)
SQ_NA <- (B^2)/A # SQ de não-aditividade, com um grau de liberdade (GL=1)
QM_NA <- SQ_NA/1 # QM de não-aditividade, com um grau de liberdade (GL=1)
SQ_Res <- sum(modelo1$residuals^2)-SQ_NA # SQ do Resíduo (descontando-se os desvios de não-aditividade)
GL_Res <- modelo1$df.residual-1 # GL do Resíduo (descontando-se os desvios de não-aditividade)
QM_Res <- SQ_Res/GL_Res
F_NA <- QM_NA/QM_Res
Pr_NA <- 1-pf(F_NA,1,GL_Res)
result1 <-
matrix(c(1,SQ_NA,QM_NA,F_NA,Pr_NA,GL_Res,SQ_Res,QM_Res,1,1),nrow=2,ncol=5,byrow=T,dimnames=list(c("N_Aditiv.
","Residuals"),c("Df","Sum Sq","Mean Sq","F value","Pr(>F)")))
result1 # Significância da fonte de variação "N_Aditiv.", com "1" grau de liberdade, indica desvios de
pressuposição de aditividade do modelo.
#----------------------------------

# Buscando uma transformação ótima (Box & Cox, 1964)


require(MASS)
boxcox(Y ~ Trat, data=exp1, plotit=T)
boxcox(Y ~ Trat, data=exp1, lam=seq(-1, 2.5, 1/20))

# CASO AS PRESSUPOSIÇÕES SEJAM ATENDIDAS => COMPARAÇÕES DE MÉDIAS


# ---------------------------------------------------------------

TukeyHSD(modelo1a) # função não disponível para "lm", mas só para "aov"


TukeyHSD(modelo1a,"Trat",conf.level=0.95,data=exp1) # Teste Tukey (alpha=5%) - função para dados
balanceados (associada a 'aov')
plot(TukeyHSD(modelo1a,"Trat"))
with(modelo1a, pairwise.t.test(Y, Trat, p.adj="fdr")) # Comparação de médias - t-Student (alpha=5%) c/
ajust. FDR

# Testes de Comparações Múltiplas (TCM) - obtendo os resultados com o pacote 'agricolae'


require(agricolae)
xtabs(~Trat, na.omit(exp1)) # repetições por nível de TRAT
glr <- df.residual(modelo1) # graus de liberdade do Resíduo
glr
qmr <- deviance(modelo1)/glr # Quadrado médio do Resíduo
qmr
comp<-HSD.test(Y, Trat, glr, qmr, group=T)
comp

# teste t (DMS ou LSD) - baixa proteção contra Erro tipo I


a<-with(exp1, LSD.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05))
a
# teste t com correção de Bonferroni (proteção contra Erro tipo I)
b<-with(exp1, LSD.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05, p.adj="bonferroni"))
b
# teste de Tukey
c<-with(exp1, HSD.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05))
c
# teste de SNK (Student-Newman-Keuls)
d<-with(exp1, SNK.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05))
d
# teste de Duncan - baixa proteção contra Erro tipo I
e<-with(exp1, duncan.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05))
e
# Obtendo os resultados com o pacote ExpDes (inclui Testes Comparações Múltiplas)
require(ExpDes)
require(doBy)
with(exp1, rbd(block=Bloco, treat=Trat, resp=Y, mcomp="tukey")) # Tukey (tradicional)
with(exp1, rbd(block=Bloco, treat=Trat, resp=Y, mcomp="duncan")) # Duncan (tradicional)
with(exp1, rbd(block=Bloco, treat=Trat, resp=Y, mcomp="snk")) # Student-Newman-Keuls
with(exp1, rbd(block=Bloco, treat=Trat, resp=Y, mcomp="lsd")) # t-Student (LSD)
with(exp1, rbd(block=Bloco, treat=Trat, resp=Y, mcomp="lsdb")) # t-Student / Bonferroni
with(exp1, rbd(block=Bloco, treat=Trat, resp=Y, mcomp="sk")) # Scott-Knott (sem ambiguidades) - sob
balanceamento
help(ExpDes) # vide 'index'

# Um teste sem ambiguidade e livre de distribuições por Bootstrap (Ramos & Ferreira, 2009: Revista Ceres,
v.56, p.140-149)
ccboot(Y,Trat,df.residual(modelo1),deviance(modelo1),alpha=0.05,group=TRUE,main=NULL,B=1000)

# PARA DELINEAMENTO INTEIRAMENTE CASUALIZADO:


crd(Trat, Y, quali = TRUE, mcomp='tukey', sigF = 0.05)
crd(Trat, Y, quali = TRUE, mcomp='duncan', sigF = 0.05)
crd(Trat, Y, quali = TRUE, mcomp='snk', sigF = 0.05)
crd(Trat, Y, quali = TRUE, mcomp='lsd', sigF = 0.05)
crd(Trat, Y, quali = TRUE, mcomp='lsdb', sigF = 0.05)
crd(Trat, Y, quali = TRUE, mcomp='sk', sigF = 0.05)
crd(Trat, Y, quali = TRUE, mcomp='ccboot', sigF = 0.05)

# ================================
# TESTES DE CONTRASTES ESPECÍFICOS
# ================================
help (read.table)
exp1 <- read.table (file="C:/Users/Joao/Desktop/Estat_EXp_I/Contrast.csv", sep=",", header=TRUE) #
Buscando dados de outro arquivo (neste caso, gerado como CSV no Excel)
exp1
head(exp1) # lista o cabeçalho do conjunto de dados (seis primeiras linhas apenas)
plot(exp1) # gráfico para inspeções iniciais (ex. correlações entre variáveis mensuradas nas
parcelas)
summary(exp1) # resumo estatísticos simples das variáveis do conjunto de dados
names(exp1) # lista as variávies no objeto 'exp1'
attach(exp1) # com este comando o problema se resolve , pois o objeto 'exp1' agora é anexado
diretamente ao caminho de busca do R
# PREPARANDO PARA UMA ANOVA - declarando Fatores (duas opções)
# ============================================================
str(exp1)
exp1$Trat <- factor(exp1$Trat)
Trat <- as.factor(Trat) # Depende do comando 'attach' ter sido executado antes

# ANOVA / MODELO FIXO (Delin. Inteiramente Casualizado)


# ======================================================
is.factor(Trat) # ANOVA => TRAT deve ser um fator e não variável numérica
levels(Trat)

modelo1a <- aov(Y ~ Trat, data=exp1)


modelo1a
summary(modelo1a)
anova(modelo1a)

modelo1 <- lm(Y ~ Trat, data=exp1)


modelo1
summary(modelo1) # soluções do sistema de equações normais ("estimativas" dos parâmetros)
anova(modelo1) # quadro da análise de variância (nesta saída "Residual standard error" é o desvio padrão
residual = Raiz(QMerro))
names(modelo1) # variáveis com resultados do ajuste do modelo definido no objeto 'modelo1b'
par(mfrow=c(2,2)) # divide a matriz gráfica em duas linhas e duas colunas (recebe quatro gráficos)
plot(modelo1) # diagnóstico inicial de problemas relacionados às pressuposições da ANOVA clássica
layout(1) # retorna à configuração gráfica padrão (um gráfico por página)
library(lmtest)
dwtest(Y ~ Trat, data=exp1) # teste de independência dos resíduos (default - Ha: autocorrelação
positiva)
shapiro.test(residuals(modelo1)) # teste de normalidade dos resíduos
bartlett.test(residuals(modelo1)~exp1$Trat) # teste de homogeneidade das variâncias de TRAT
library(asbio)
tukey.add.test(Y, Trat) # teste de aditividade => Error ???
?tukey.add.test # Só p/ DBC ("With an RBD we are testing ... any block")
# Teste dos desvios de aditividade - 2a. opção (script J. B. Duarte / UFG)
qij <- modelo1$fitted.values**2
mod_NA <- lm(qij ~ Trat, data=exp1) # atualizar o modelo em caso de outro delineamento
A <- sum(mod_NA$residuals^2)
B <- sum(modelo1$residuals*qij)
SQ_NA <- (B^2)/A # SQ de não-aditividade, com um grau de liberdade (GL=1)
QM_NA <- SQ_NA/1 # QM de não-aditividade, com um grau de liberdade (GL=1)
SQ_Res <- sum(modelo1$residuals^2)-SQ_NA # SQ do Resíduo (descontando-se os desvios de não-aditividade)
GL_Res <- modelo1$df.residual-1 # GL do Resíduo (descontando-se os desvios de não-aditividade)
QM_Res <- SQ_Res/GL_Res
F_NA <- QM_NA/QM_Res
Pr_NA <- 1-pf(F_NA,1,GL_Res)
result1 <-
matrix(c(1,SQ_NA,QM_NA,F_NA,Pr_NA,GL_Res,SQ_Res,QM_Res,1,1),nrow=2,ncol=5,byrow=T,dimnames=list(c("N_Aditiv.
","Residuals"),c("Df","Sum Sq","Mean Sq","F value","Pr(>F)")))
result1 # Significância da fonte de variação "N_Aditiv.", com "1" grau de liberdade, indica desvios de
pressuposição de aditividade do modelo.

# CASO AS PRESSUPOSIÇÕES SEJAM ATENDIDAS => Trats. Qualitavitos => TCM


# ---COMPARAÇÃO DE MÉDIAS - DIFERENTES MÉTODOS

TukeyHSD(modelo1a) # função não disponível para "lm", mas só para "aov"


TukeyHSD(modelo1a,"Trat",conf.level=0.95,data=exp1) # Teste Tukey (alpha=5%) - função para dados
balanceados (associada a 'aov')
plot(TukeyHSD(modelo1a,"Trat"))
require(ExpDes)

# PARA DELIN. INTEIRAMENTE CASUALIZADO (SÓ P/ ESTE CASO)


# Teste Tukey c/ letras (script adapt. de Ribeiro Junior, 2009)
compara <- TukeyHSD(modelo1a)
dms <- unname(0.5*diff(compara[[1]][1, 2:3]))
dms
medias.ord <- sort(medias, decreasing = TRUE)
i <- pos <- letra <- 1
letras <- character(nlevels(Trat))
while (i <= nlevels(Trat)) {
print(letters[letra])
ind <- (medias.ord[i] - (medias.ord[-(1:i)])) < dms
pos.i <- i + sum(ind)
if (pos.i > pos) {
letras.vec <- rep(" ", length(letras))
letras.vec[i:pos.i] <- letters[letra]
letras <- paste(letras, letras.vec, sep =" ")
pos <- pos.i
letra <- letra + 1
}
i <- i + 1
}
data.frame(Medias = medias.ord,"Tukey"= letras)
# Testes de Comparações Múltiplas (TCM) - obtendo os resultados com o pacote 'agricolae'
require(agricolae)
xtabs(~Trat, na.omit(exp1)) # repetições por nível de TRAT
glr <- df.residual(modelo1) # graus de liberdade do Resíduo
glr
qmr <- deviance(modelo1)/glr # Quadrado médio do Resíduo
qmr
comp<-HSD.test(Y, Trat, glr, qmr, group=T)
comp

# teste t (DMS ou LSD) - baixa proteção contra Erro tipo I


a<-with(exp1, LSD.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05))
a
# teste t com correção de Bonferroni (proteção contra Erro tipo I)
b<-with(exp1, LSD.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05, p.adj="bonferroni"))
b
# teste de Tukey
c<-with(exp1, HSD.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05))
c
# teste de SNK (Student-Newman-Keuls)
d<-with(exp1, SNK.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05))
d
# teste de Duncan - baixa proteção contra Erro tipo I
e<-with(exp1, duncan.test(Y, Trat, DFerror=glr, MSerror=qmr, alpha=0.05))
e

# Obtendo os resultados com o pacote ExpDes (inclui Testes Comparações Múltiplas)


require(ExpDes)
require(doBy)
with(exp1, crd(treat=Trat, resp=Y, mcomp="tukey")) # Tukey (tradicional)
with(exp1, crd(treat=Trat, resp=Y, mcomp="duncan")) # Duncan (tradicional)
with(exp1, crd(treat=Trat, resp=Y, mcomp="snk")) # Student-Newman-Keuls
with(exp1, crd(treat=Trat, resp=Y, mcomp="lsd")) # t-Student (LSD)
with(exp1, crd(treat=Trat, resp=Y, mcomp="lsdb")) # t-Student / Bonferroni
with(exp1, crd(treat=Trat, resp=Y, mcomp="sk")) # Scott-Knott (sem ambiguidades)
with(exp1, crd(treat=Trat, resp=Y, mcomp="ccboot")) # TCM bootstrap (sem ambiguidades)
help(ExpDes) # vide 'index'
# ---CONTRASTES NO QUADRO DE ANOVA (F-Snedecor / t-Student)

require(contrast)
help("contrast")
contrast(modelo1,list(Trat=c("1","2","3","4","5","6"))) # Médias com I.C.
contrast(modelo1,list(Trat="1"),list(Trat="2"))
contrast(modelo1,type="average",list(Trat=c("1","2","3","4","5")),list(Trat="6"))
contrast(modelo1,type="average",list(Trat=c("1","2","3")),list(Trat=c("4","5","4")))
# A função “contrast” exige tamanhos iguais dos dois lados (a e b) ou que um seja “um”.
contrast(modelo1,type="average",list(Trat=c("1","2")),list(Trat="3"))
contrast(modelo1,type="average",list(Trat="1"),list(Trat="2"))
contrast(modelo1,type="average",list(Trat="4"),list(Trat="1"))

ex02.tk <- TukeyHSD(modelo1a, "Trat")


ex02.tk
plot(ex02.tk)
detach(ex02)

# E X T R A S --- E X T R A S --- E X T R A S (não estão funcionando!)


#=============================================================================
# Representando graficamente as médias ajustadas com intervalos de confiança
# (scripts Prof. Walmes Zeviani, LEG - DEST - UFPR)
require(ExpDes)
require(doBy)
pm <- popMeans(modelo1, effect="Trat")
pm <- as.data.frame(pm)
pm <- as.data.frame(popMeans(m0, effect="cultivar", at=list(p2o5=11)))
pm

pm$Trat <- factor(pm$Trat, levels=levels(exp1$Trat))


segplot(Trat~Lower+Upper, center=Estimate, data=pm, segments.fun=panel.arrows, ends="both")
abline(v = 9, lty=2, col="red")
abline(v = 10.5, lty=2, col="red")
abline(v = 12, lty=2, col="red")
segplot(Trat~Lower+Upper, center=Estimate, data=pm,
xlab="Produção (kg/parcela)", ylab="Variedades",
draw.bands=FALSE, segments.fun=panel.arrows, ends="both",
angle=90, length=1, unit="mm")
pm$Upper[5]
pm$Lower[3]
# Construindo um gráfico de barras com os desvios padrão (requer o pacote GREGMISC)
library(gregmisc)
library(help=gregmisc)
help(barplot2)
medias <- tapply(Y, Trat, mean) # table apply(médias)
desvios <- tapply(Y, Trat, sd) # table apply(desvios padrão)
medias
desvios
barplot2(medias, ylim=c(0, max(medias+desvios*2)), plot.ci=T, ci.l=medias-desvios,
ci.u=medias+desvios, col="light gray", xlab="Variedades", ylab="Kg/parcela")
par(mfrow=c(1,2))
boxplot(exp1$PROD ~ exp1$TRAT, col = "lightgray", xlab="Variedades", ylab = "Kg/parcela")
barplot2(medias, ylim=c(0, max(medias+desvios*2)), plot.ci=T, ci.l=medias-desvios, ci.u=medias+desvios,
col="light gray", xlab="Variedades", ylab="Kg/parcela")
par(mfrow=c(1,1)) # "=layout(1)" tem o mesmo efeito (volta ao padrão de um gráfico por página)
barplot(medias)
sort(medias, decreasing=T)
with(modelo1, pairwise.t.test(PROD, TRAT, p.adj="fdr")) # Comparação de médias - t-Student (alpha=5%)
TukeyHSD(aov(PROD ~ TRAT, data=exp1)) # Comparação de médias - Teste Tukey (alpha=5%)
compara <- TukeyHSD(modelo1)
plot(compara)
Rotina SAS – ANOVA COM TESTES DE COMPARAÇÕES DE MÉDIAS
data SIMULADO;
input TRAT BLOCO Y;
datalines;
1 1 87.266
2 1 98.223
3 1 66.402
...
8 4 124.469
9 4 140.229
10 4 132.305
;
run;

proc glm data=SIMULADO;


class TRAT BLOCO;
model Y = BLOCO TRAT;
means Trat / tukey;
means Trat / t;
means Trat / lsd;
means Trat / bon;
means Trat / duncan;
means Trat / snk;
means Trat / scheffe;
means Trat / dunnett("10"); /* teste bilateral - Ha: m(i)=^ m(contr) */
means Trat / dunnettL("10"); /* teste unilateral - Ha: m(i)< m(contr) */
means Trat / dunnettU("10"); /* teste unilateral - Ha: m(i)> m(contr) */
means Trat / sidak;
lsmeans Trat / pdiff=all adjust=tukey;
lsmeans Trat / pdiff=all adjust=t;
lsmeans Trat / pdiff=all adjust=bon;
lsmeans Trat / pdiff=all adjust=scheffe;
lsmeans Trat / pdiff=control("10") adjust=dunnett; /* teste bilateral - Ha: m(i)=^ m(contr) */
lsmeans Trat / pdiff=controlL("10") adjust=dunnett; /* teste unilateral - Ha: m(i)< m(contr) */
lsmeans Trat / pdiff=controlU("10") adjust=dunnett; /* teste unilateral - Ha: m(i)> m(contr) */
lsmeans Trat / pdiff=control adjust=dunnett; /* teste bilateral - Ha: m(i)=^m(contr) - 1o. como controle*/
lsmeans Trat / pdiff=all adjust=simulate;
lsmeans Trat / pdiff=all adjust=smm;
run;
Rotina SAS – ANOVA COM EXPLORAÇÃO DE CONTRASTES DE INTERESSE
data NOGUEIRA;
input VARIED PROD;
datalines;
1 112.3 4 127.9
1 121.0 4 128.3
1 114.3 4 129.5
1 115.8 4 126.5
1 117.2 4 127.3
2 125.3 5 130.1
2 119.7 5 122.4
2 120.8 5 126.7
2 120.5 5 127.3
2 122.3 5 128.9
3 118.4 6 115.2
3 120.5 6 123.2
3 119.7 6 117.8
3 118.3 6 120.8
3 117.8 6 116.4
;
run;
proc glm data=NOGUEIRA;
class VARIED;
model PROD = VARIED/p;
means VARIED /tukey;
run;

proc glm data=NOGUEIRA;


class VARIED;
model PROD = VARIED;
contrast "Todos vs. Testemunha" VARIED 1 1 1 1 1 -5;
contrast "m(123) vs. m(45)" VARIED 1 1 1 -1.5 -1.5;
contrast "m(12) vs. m3" VARIED 1 1 -2;
contrast "m1 vs. m2" VARIED 1 -1;
contrast "m4 vs. m5" VARIED 0 0 0 1 -1;
estimate "Todos vs. Testemunha" VARIED 1 1 1 1 1 -5/divisor=5;
estimate "m(123) vs. m(45)" VARIED 1 1 1 -1.5 -1.5/divisor=3;
estimate "m(12) vs. m3" VARIED 1 1 -2/divisor=2;
estimate "m1 vs. m2" VARIED 1 -1;
estimate "m4 vs. m5" VARIED 0 0 0 1 -1;
run;

Potrebbero piacerti anche