Análise didática de experimento em parcela subdividida

##===============================================================================
## Título: Análise didática de experimento em parcela subdividida
## Versão: v4
## Objetivos:
##===============================================================================
## a) Mostrar diferentes alternativas de análise dos experimentos em parcelas
##    subdivididas
## b) Testes de comparação de médias e análise de contrastes
##===============================================================================

# Leitura dos dados
# https://sites.google.com/site/agrobiostat/files
#=======================================
dados<-read.table('./dados/eps.txt',
                  header=T)
head(dados, 13)
str(dados)

is.factor(dados$bl) 
is.factor(dados$adubo)
is.factor(dados$dose)
is.numeric(dados$y)

summary(dados)

#=======================================
#============== ANOVA ==================
#=======================================
av <-aov(y ~ bl + adubo * dose + Error(bl/adubo),
         data=dados)

summary(av) # Notar que a interação entre adubo e dose
            # é significativa

library(TukeyC)
cv(av)

#=======================================
#==== Ftab. GL adubo 3; GL resíduo 9 ===
#=======================================
(Ftab1 <- qf(5 / 100,
             3,
             9,
             lower.tail=FALSE))

#=======================================
#Ftab. GL adubo:dose 6 ; GL resíduo 24
#=======================================
(Ftab2 <- qf(5 / 100,
             6,
             24,
             lower.tail=FALSE))

#=======================================
#===== Ftab.GL dose 2; GL resíduo 24 ===
#=======================================
(Ftab3 <- qf(5 / 100,
             2,
             24,
             lower.tail=FALSE))

#=======================================
#======== GRÁFICO ADUBO ================
#=======================================
curve(expr=df(x, 3, 9),
      main="ADUBO - F calculado F(3, 9) gl",
      xlab="F",
      ylab="Densidade de probabilidades, f(F)",
      xlim=c(0, 10),
      n=1e3)

abline(v=Ftab1,
       col="red")

abline(h=0,
       lty=2)

xf <- seq(Ftab1,
          10,
          0.01)

ydf <- df(xf,
          3,
          9)

polygon(c(Ftab1, xf),
        c(0, ydf),
        col="red")

text(x=6,
     y=.1,
     paste("pf(>=",
           round(Ftab1, 2),
           ") =",
           round(pf(Ftab1,
                    3,
                    9,
                    lower.tail=F),
                 4)),
     cex=0.8,
     col="black")

#=======================================
#============ GRÁFICO DOSE =============
#=======================================
curve(expr=df(x, 2, 24),
      main="DOSE F calculado F(2, 24) gl",
      xlab="Valor F",
      ylab="Densidade Probabilística F(f)",
      xlim=c(0, 10),
      n=1e3)

abline(v=Ftab3,
       col="red")

abline(h=0,
       lty=2)

xf <- seq(Ftab3,
          10,
          0.001)

ydf <- df(xf,
          2,
          24)

polygon(c(Ftab3, xf),
        c(0, ydf),
        col="red")

text(x=5,
     y=.1,
     paste("pf(>=",
           round(Ftab3, 2),
           ") =",
           round(pf(Ftab3,
                    2,
                    24,
                    lower.tail=F),
                 4)),
     cex=0.8,
     col="black")

#=======================================
#======== GRÁFICO ADUBO:DOSE ===========
#=======================================
curve(expr=df(x, 6, 24),
      main="ADUBO:DOSE - F calculado F(6, 24) gl",
      xlab="F",
      ylab="Densidade Probabilística F(f)",
      xlim=c(0, 10),
      n=1e3)

abline(v=Ftab2,
       col="red")

abline(h=0,
       lty=2)

xf <- seq(Ftab2,
          10,
          0.001)

ydf <- df(xf,
          6,
          24)

polygon(c(Ftab2, xf),
        c(0, ydf),
        col="red")

text(x=4,
     y=.1,
     paste("pf(>=",
           round(Ftab2, 2),
           ") =",
           round(pf(Ftab2,
                    6,
                    24,
                    lower.tail=F),
                 4)),
     cex=0.8,
     col="black")

#=======================================
#============  INTERAÇÃO  ==============
#=======================================
par(mfrow = c(2, 1))

with(dados, 
     interaction.plot(adubo, 
                      dose, 
                      y, 
                      col = 1:4, 
                      lwd = 2, 
                      ylab = "Kg/ha"))


with(dados, 
     interaction.plot(dose, 
                      adubo, 
                      y, 
                      col = 1:4, 
                      lwd = 2, 
                      ylab = "Kg/ha"))

#=======================================
#============== TUKEY ==================
#=======================================
# Testando efeito principal das parcelas (adubo)
# (finalidade didática pois a interação é significativa: necessário desdobrar!)
ta <- TukeyC(av,
             which='adubo',
             error='bl:adubo',
             sig.level=.05)

summary(ta)

# Testando efeito principal da subparcela (dose)
# (finalidade didática pois a interação é significativa: necessário desdobrar!)
td <- TukeyC(av,
             which='dose',
             error='Within',
             sig.level=0.05)

summary(td)

#=======================================================
# adubo/dose: estudando dose dentro dos níveis de adubo
#=======================================================   
#===: nível 1  
tad1 <- TukeyC.nest(av,
                   which='adubo:dose',
                   error='Within',
                   sig.level=0.05,
                   fl1=1)  # 1: SALITRE C

summary(tad1)

#===: nível 2
tad2 <- TukeyC.nest(av,
                    which='adubo:dose',
                    error='Within',
                    sig.level=0.05,
                    fl1=2)  # 2: SULFATO

summary(tad2)

#===: nível 3
tad3 <- TukeyC.nest(av,
                    which='adubo:dose',
                    error='Within',
                    sig.level=0.05,
                    fl1=3)  # 3: URÉIA

summary(tad3)

#===: nível 4
tad4 <- TukeyC.nest(av,
                    which='adubo:dose',
                    error='Within',
                    sig.level=0.05,
                    fl1=4)  # 4: CALNITRO

summary(tad4)

#=======================================
#============ CONTRASTES ===============
#=======================================  
# É bem trabalhoso no caso dos experimentos em parcelas subdividadas
# devido a mais de uma estimativa do resíduo!

# Matriz de contrastes dos adubos
                                     #A1  A2   A3   A4
mca <- rbind('A2 vs. (A1, A3, A4)' = c(-1,  3,  -1,  -1),
             'A3 vs. (A1, A4)'     = c(-1,  0,   2,  -1),
             'A1 vs. A4'           = c( 1,  0,   0,  -1))

# Matriz de contrastes das doses
                                 #D1  D2  D3
mcd <- rbind('D3 vs. (D1, D2)' = c(-1, -1,  2),
             'D1 vs. D2'       = c( 1, -1,  0))

library(gmodels) # Necessário para a função: make.contrasts

## O modelo usado para a ANOVA
## não fornece todos os resultados corretos:
# av2 <-aov(y ~ bl + adubo * dose + Error(bl/adubo),
#           data=dados,
#           contrasts=list('adubo'=make.contrasts(mca),
#                          'dose'=make.contrasts(mcd)))

##-----------------------------------------------------------------------------------
## Alternativa 1:
## Usar o modelo fatorial
## e corrigir manualmente as estimativas dos contrastes associados a subparcela
## (um pouco trabalhoso)
##-----------------------------------------------------------------------------------

## Necessário aninhar os efeitos!
av2 <-aov(y ~ bl + adubo + adubo/dose,
          data=dados,
          contrasts=list('adubo'=make.contrasts(mca),
                         'dose'=make.contrasts(mcd)))

effects(av2)[1:15]

sm <- summary(av2,                                            
              split=list('adubo'=list('A2 vs. (A1, A3, A4)' = 1,
                                      'A3 vs. (A1, A4)'     = 2,
                                      'A1 vs. A4'           = 3),
                         'adubo:dose'=list('A1/dose*'          = c(1, 5),
                                           'A1/d3 vs. (d1, d2)'= 1,
                                           'A1/d1 vs. d2'      = 5,
                                           'A2/dose*'          = c(2, 6),
                                           'A2/d3 vs. (d1, d2)'= 2,
                                           'A2/d1 vs. d2'      = 6,
                                           'A3/dose*'          = c(3, 7),
                                           'A3/d3 vs. (d1, d2)'= 3,
                                           'A3/d1 vs. d2'      = 7,
                                           'A4/dose*'          = c(4, 8),
                                           'A4/d3 vs. (d1, d2)'= 4,
                                           'A4/d1 vs. d2'      = 8
                                           )))

sm # Como o modelo informado não é correto,
   # foi usado apenas para estimar os contrastes, observar que n erro b (subparcela):
   # O qmd (141717) está errada, o correto é 74480!
   # os graus de liberdade (33) estão errados, o correto é 24!

# Corrigindo os testes:
# Efeitos de dose em cada nível de adubo
round(pf(sm[[1]][c(7, 10, 13, 16), 3] / 74480, # 74480 erro associado a subparcela
         2, 
         24, # Graus de liberdade associados a subparcela
         lower.tail=FALSE),
      3)


# Contrastes de dose em cada nível de adubo
round(pf(sm[[1]][c(8, 9, 11, 12, 14, 15, 17, 18), 3] / 74480,
         1, 
         24, 
         lower.tail=FALSE),
      3)

##-----------------------------------------------------------------------------------
## Alternativa 2:
## Com a participação do prof. Ivan Bezerra Allaman
## foi possível fazer a decomposição da SQD desse experimento corretamente!
##-----------------------------------------------------------------------------------
av3 <-aov(y ~ bl + adubo + adubo/dose + Error(bl/adubo),
          data=dados,
          contrasts=list('adubo'=make.contrasts(mca),
                         'dose'=make.contrasts(mcd)))

effects(av3) # Mensagem de erro -> método não aplicado a classe!
coef(av3)    # Dá para pegar a mesma informação com a função coef!

summary(av3)

summary(av3,
        split=list('adubo'=list('A2 vs. (A1, A3, A4)' = 1,
                                'A3 vs. (A1, A4)'     = 2,
                                'A1 vs. A4'           = 3),
                   'adubo:dose'=list('A1/dose*'          = c(1, 5),
                                     'A1/d3 vs. (d1, d2)'= 1,
                                     'A1/d1 vs. d2'      = 5,
                                     'A2/dose*'          = c(2, 6),
                                     'A2/d3 vs. (d1, d2)'= 2,
                                     'A2/d1 vs. d2'      = 6,
                                     'A3/dose*'          = c(3, 7),
                                     'A3/d3 vs. (d1, d2)'= 3,
                                     'A3/d1 vs. d2'      = 7,
                                     'A4/dose*'          = c(4, 8),
                                     'A4/d3 vs. (d1, d2)'= 4,
                                     'A4/d1 vs. d2'      = 8
                                     )))