Experimento em arranjo fatorial

Walmes Zeviani


Definições da sessão

##-----------------------------------------------------------------------------
## Definições da sessão, pacotes a serem usados.

pkg <- c("lattice", "latticeExtra", "reshape",
         "doBy", "multcomp",
         "plyr", "wzRfun")
sapply(pkg, library, character.only=TRUE, logical.return=TRUE)
##      lattice latticeExtra      reshape         doBy     multcomp         plyr 
##         TRUE         TRUE         TRUE         TRUE         TRUE         TRUE 
##       wzRfun 
##         TRUE

source("lattice_setup.R")

##-----------------------------------------------------------------------------
## Informações sobre as versões dos pacotes.

sessionInfo()
## R version 3.1.1 (2014-07-10)
## Platform: i686-pc-linux-gnu (32-bit)
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=pt_BR.UTF-8       
##  [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=pt_BR.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=pt_BR.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
## [10] LC_TELEPHONE=C             LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] splines   stats     graphics  grDevices utils     datasets  base     
## 
## other attached packages:
##  [1] wzRfun_0.1          plyr_1.8.1          multcomp_1.3-3      TH.data_1.0-3      
##  [5] mvtnorm_0.9-99992   doBy_4.5-10         MASS_7.3-33         survival_2.37-7    
##  [9] reshape_0.8.5       latticeExtra_0.6-26 RColorBrewer_1.0-5  lattice_0.20-29    
## [13] knitr_1.5          
## 
## loaded via a namespace (and not attached):
##  [1] evaluate_0.5.5      formatR_0.10        grid_3.1.1          lme4_1.1-6         
##  [5] Matrix_1.1-4        methods_3.1.1       minqa_1.2.3         nlme_3.1-117       
##  [9] Rcpp_0.11.1         RcppEigen_0.3.2.1.2 sandwich_2.3-0      stringr_0.6.2      
## [13] tools_3.1.1         zoo_1.7-11

## obs: Para instalar um pacote faça:
## install.packages("nome_do_pacote", dependencies=TRUE)

Análise dos dados

##-----------------------------------------------------------------------------
## Experimento com doses de cama de frango como adubação em milho
## safrinha com 3 métodos de menejo.

da <-
    read.table("http://www.leg.ufpr.br/~walmes/data/camafrango_prod.txt",
               header=TRUE, sep="\t")
str(da)
## 'data.frame':    60 obs. of  13 variables:
##  $ manejo: Factor w/ 3 levels "incorp","incorp120",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ cama  : int  0 0 0 0 2 2 2 2 4 4 ...
##  $ bloco : int  1 2 3 4 1 2 3 4 1 2 ...
##  $ altes : num  38.4 69.8 52.8 39.2 60 54.6 55.2 50.8 62.6 54 ...
##  $ altpl : num  109.2 131.4 103.8 86.8 126 ...
##  $ maspl : num  53.6 72.6 83.6 55.6 97.6 60.6 72.6 81.6 88.6 82.6 ...
##  $ stand : num  9375 31250 16406 12500 17188 ...
##  $ mases : num  95.4 111.5 95.7 67.2 96.8 ...
##  $ masgr : num  60.8 73.4 58.6 35 60.9 ...
##  $ indice: num  29 28.5 24.6 22.2 23.9 ...
##  $ prod  : num  570 2293 961 438 1047 ...
##  $ p100  : num  25 24.2 28.6 25.2 26.1 ...
##  $ dens  : num  0.718 0.741 0.703 0.716 0.689 0.73 0.682 0.73 0.739 0.712 ...

da$bloco <- factor(da$bloco)

## Tabelas de frequência.
with(da, ftable(cama~bloco+manejo))
##                 cama 0 2 4 8 16
## bloco manejo                   
## 1     incorp         1 1 1 1  1
##       incorp120      1 1 1 1  1
##       lanco120       1 1 1 1  1
## 2     incorp         1 1 1 1  1
##       incorp120      1 1 1 1  1
##       lanco120       1 1 1 1  1
## 3     incorp         1 1 1 1  1
##       incorp120      1 1 1 1  1
##       lanco120       1 1 1 1  1
## 4     incorp         1 1 1 1  1
##       incorp120      1 1 1 1  1
##       lanco120       1 1 1 1  1

##-----------------------------------------------------------------------------
## Ver.

xyplot(prod~cama, groups=manejo, data=da,
       type=c("p","a"), auto.key=TRUE)

plot of chunk unnamed-chunk-3


xyplot(prod~cama|manejo, groups=bloco, data=da,
       type=c("p","a"), auto.key=TRUE)

plot of chunk unnamed-chunk-3


xyplot(stand~cama, groups=manejo, data=da,
       type=c("p","a"), auto.key=TRUE)

plot of chunk unnamed-chunk-3


xyplot(prod/stand~cama, groups=manejo, data=da,
       type=c("p","a"), auto.key=TRUE)

plot of chunk unnamed-chunk-3


## Se fossem tratamentos aplicados após estabelecimento de stand...

##-----------------------------------------------------------------------------
## Ajuste do modelo.

## Modelo considerando cama como fator (modelo saturado).
m0 <- lm(prod~bloco+manejo*factor(cama), data=da)

par(mfrow=c(2,2))
plot(m0)

plot of chunk unnamed-chunk-3

layout(1)

## Uma transformação Box-Cox confere melhoras?
MASS::boxcox(m0)

plot of chunk unnamed-chunk-3


anova(m0)
## Analysis of Variance Table
## 
## Response: prod
##                     Df   Sum Sq Mean Sq F value Pr(>F)  
## bloco                3  5927481 1975827    3.81  0.017 *
## manejo               2  1316030  658015    1.27  0.292  
## factor(cama)         4  7034127 1758532    3.39  0.017 *
## manejo:factor(cama)  8  6755740  844468    1.63  0.146  
## Residuals           42 21788948  518784                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

## Modelo considerando efeito linear para cama.
m1 <- lm(prod~bloco+manejo*cama, data=da)

par(mfrow=c(2,2))
plot(m1)

plot of chunk unnamed-chunk-3

layout(1)

## Teste da falta de ajuste.
anova(m0, m1)
## Analysis of Variance Table
## 
## Model 1: prod ~ bloco + manejo * factor(cama)
## Model 2: prod ~ bloco + manejo * cama
##   Res.Df      RSS Df Sum of Sq    F Pr(>F)
## 1     42 21788948                         
## 2     51 23291258 -9  -1502311 0.32   0.96

anova(m1)
## Analysis of Variance Table
## 
## Response: prod
##             Df   Sum Sq Mean Sq F value  Pr(>F)    
## bloco        3  5927481 1975827    4.33 0.00859 ** 
## manejo       2  1316030  658015    1.44 0.24620    
## cama         1  6335428 6335428   13.87 0.00049 ***
## manejo:cama  2  5952129 2976064    6.52 0.00302 ** 
## Residuals   51 23291258  456691                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

##-----------------------------------------------------------------------------
## Partição das somas de quadrados dos efeitos lineares.

m2 <- aov(prod~bloco+manejo/cama, data=da)
coef(m2)
##          (Intercept)               bloco2               bloco3               bloco4 
##              1341.71                29.69              -427.86              -726.09 
##      manejoincorp120       manejolanco120    manejoincorp:cama manejoincorp120:cama 
##               916.74              -140.53                76.57               -18.27 
##  manejolanco120:cama 
##               114.03

## Ocorrências.
oc <- paste0("manejo", levels(da$manejo), ":cama")
as <- m2$assign; as
## [1] 0 1 1 1 2 2 3 3 3

linear.ef <- lapply(oc, grep, x=names(coef(m2))[as==3])
names(linear.ef) <- abbreviate(levels(da$manejo))
linear.ef
## $incr
## [1] 1
## 
## $i120
## [1] 2
## 
## $l120
## [1] 3

## Somas de quadrados repartidas por manejo testando o efeito linear de
## cama de frango.
summary(m2, split=list("manejo:cama"=linear.ef))
##                     Df   Sum Sq Mean Sq F value  Pr(>F)    
## bloco                3  5927481 1975827    4.33  0.0086 ** 
## manejo               2  1316030  658015    1.44  0.2462    
## manejo:cama          3 12287556 4095852    8.97 7.1e-05 ***
##   manejo:cama: incr  1  3752360 3752360    8.22  0.0060 ** 
##   manejo:cama: i120  1   213624  213624    0.47  0.4971    
##   manejo:cama: l120  1  8321572 8321572   18.22 8.6e-05 ***
## Residuals           51 23291258  456691                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

##-----------------------------------------------------------------------------
## Coeficientes.

## Estão sob restrição.
summary(m1)
## 
## Call:
## lm(formula = prod ~ bloco + manejo * cama, data = da)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1914.7  -420.4    36.7   393.2  1108.5 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            1341.7      267.1    5.02  6.6e-06 ***
## bloco2                   29.7      246.8    0.12   0.9047    
## bloco3                 -427.9      246.8   -1.73   0.0890 .  
## bloco4                 -726.1      246.8   -2.94   0.0049 ** 
## manejoincorp120         916.7      311.5    2.94   0.0049 ** 
## manejolanco120         -140.5      311.5   -0.45   0.6538    
## cama                     76.6       26.7    2.87   0.0060 ** 
## manejoincorp120:cama    -94.8       37.8   -2.51   0.0153 *  
## manejolanco120:cama      37.5       37.8    0.99   0.3261    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 676 on 51 degrees of freedom
## Multiple R-squared:  0.456,  Adjusted R-squared:  0.371 
## F-statistic: 5.35 on 8 and 51 DF,  p-value: 6.79e-05

M <- model.matrix(m1)
attributes(M)
## $dim
## [1] 60  9
## 
## $dimnames
## $dimnames[[1]]
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16" "17"
## [18] "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34"
## [35] "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" "51"
## [52] "52" "53" "54" "55" "56" "57" "58" "59" "60"
## 
## $dimnames[[2]]
## [1] "(Intercept)"          "bloco2"               "bloco3"              
## [4] "bloco4"               "manejoincorp120"      "manejolanco120"      
## [7] "cama"                 "manejoincorp120:cama" "manejolanco120:cama" 
## 
## 
## $assign
## [1] 0 1 1 1 2 2 3 4 4
## 
## $contrasts
## $contrasts$bloco
## [1] "contr.treatment"
## 
## $contrasts$manejo
## [1] "contr.treatment"

## Estimativas com 0 e 2 ton de cama.
LSmeans(m1, effect="manejo", at=list(cama=0))
##   estimate    se df t.stat   p.value    lwr  upr    manejo cama
## 1   1060.6 220.3 51  4.815 1.356e-05  618.4 1503    incorp    0
## 2   1977.4 220.3 51  8.977 4.479e-12 1535.1 2420 incorp120    0
## 3    920.1 220.3 51  4.177 1.156e-04  477.9 1362  lanco120    0
LSmeans(m1, effect="manejo", at=list(cama=2))
##   estimate    se df t.stat   p.value    lwr  upr    manejo cama
## 1     1214 185.1 51  6.558 2.712e-08  842.2 1585    incorp    2
## 2     1941 185.1 51 10.487 2.487e-14 1569.3 2312 incorp120    2
## 3     1148 185.1 51  6.204 9.817e-08  776.6 1520  lanco120    2

## E as estimativas dos coeficientes de inclinação? Truque.
X1 <- LSmatrix(m1, effect="manejo", at=list(cama=1))
X0 <- LSmatrix(m1, effect="manejo", at=list(cama=0))
X <- X1-X0
rownames(X) <- levels(da$manejo)

g <- glht(m1, linfct=X)
summary(g, test=adjusted(type="fdr"))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Fit: lm(formula = prod ~ bloco + manejo * cama, data = da)
## 
## Linear Hypotheses:
##                Estimate Std. Error t value Pr(>|t|)    
## incorp == 0        76.6       26.7    2.87  0.00903 ** 
## incorp120 == 0    -18.3       26.7   -0.68  0.49711    
## lanco120 == 0     114.0       26.7    4.27  0.00026 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- fdr method)
confint(g, calpha=univariate_calpha())
## 
##   Simultaneous Confidence Intervals
## 
## Fit: lm(formula = prod ~ bloco + manejo * cama, data = da)
## 
## Quantile = 2.008
## 95% confidence level
##  
## 
## Linear Hypotheses:
##                Estimate lwr     upr    
## incorp == 0     76.571   22.942 130.199
## incorp120 == 0 -18.270  -71.898  35.359
## lanco120 == 0  114.028   60.400 167.657

##-----------------------------------------------------------------------------
## A mesma coisa de uma forma mais simples mudando a fórmula do modelo.

m2 <- lm(prod~0+manejo/cama+bloco, data=da,
         contrasts=list(bloco=contr.sum))
summary(m2)
## 
## Call:
## lm(formula = prod ~ 0 + manejo/cama + bloco, data = da, contrasts = list(bloco = contr.sum))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1914.7  -420.4    36.7   393.2  1108.5 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## manejoincorp           1060.6      220.3    4.81  1.4e-05 ***
## manejoincorp120        1977.4      220.3    8.98  4.5e-12 ***
## manejolanco120          920.1      220.3    4.18  0.00012 ***
## bloco1                  281.1      151.1    1.86  0.06866 .  
## bloco2                  310.8      151.1    2.06  0.04487 *  
## bloco3                 -146.8      151.1   -0.97  0.33591    
## manejoincorp:cama        76.6       26.7    2.87  0.00602 ** 
## manejoincorp120:cama    -18.3       26.7   -0.68  0.49711    
## manejolanco120:cama     114.0       26.7    4.27  8.6e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 676 on 51 degrees of freedom
## Multiple R-squared:  0.889,  Adjusted R-squared:  0.869 
## F-statistic: 45.2 on 9 and 51 DF,  p-value: <2e-16

##-----------------------------------------------------------------------------
## Testando se as inclinações são iguais.

Xc <- apc(X)
h <- glht(m1, linfct=Xc)
summary(h, test=adjusted(type="fdr"))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Fit: lm(formula = prod ~ bloco + manejo * cama, data = da)
## 
## Linear Hypotheses:
##                             Estimate Std. Error t value Pr(>|t|)   
## incorp:1-incorp120:1 == 0       94.8       37.8    2.51   0.0229 * 
## incorp:1-lanco120:1 == 0       -37.5       37.8   -0.99   0.3261   
## incorp120:1-lanco120:1 == 0   -132.3       37.8   -3.50   0.0029 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- fdr method)

##-----------------------------------------------------------------------------
## Gráfico dos observados, preditos e bandas.

## São os valores preditos sob **efeito do bloco 1!**
pred <- expand.grid(bloco="1",
                    manejo=levels(da$manejo),
                    cama=seq(0,16,by=2))
aux <- predict(m1, newdata=pred, interval="confidence")
pred <- cbind(pred, aux)
str(pred)
## 'data.frame':    27 obs. of  6 variables:
##  $ bloco : Factor w/ 1 level "1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ manejo: Factor w/ 3 levels "incorp","incorp120",..: 1 2 3 1 2 3 1 2 3 1 ...
##  $ cama  : num  0 0 0 2 2 2 4 4 4 6 ...
##  $ fit   : num  1342 2258 1201 1495 2222 ...
##  $ lwr   : num  805 1722 665 1015 1742 ...
##  $ upr   : num  1878 2795 1737 1975 2702 ...

## Melhorar a legenda.
tx <- c("Incorporado", "Incorporado+NPK", "À lanço+NPK")
lgd <- simpleKey(columns=1, text=tx,
                 points=FALSE, lines=TRUE,
                 corner=c(0.03,0.97))

xyplot(fit~cama, groups=manejo, data=pred,
       type="l", key=lgd,
       xlab=expression("Cama de frango"~(ton~ha^{-1})),
       ylab=expression("Produtividade"~(kg~ha^{-1})),
       ly=pred$lwr, uy=pred$upr, cty="bands", alpha=0.5,# fill=1,
       prepanel=prepanel.cbH, panel.groups=panel.cbH, panel=panel.superpose)

plot of chunk unnamed-chunk-3


##-----------------------------------------------------------------------------
## Como especificar um modelo com as restrições de que 1) b1_incorp120==0
## e 2) b1_incorp==b1_lanco120?

## Em 1).
da$cama.res <- ifelse(da$manejo=="incorp120", 0, 1)

## Em 2).
da$man.res <- da$manejo
levels(da$man.res)
## [1] "incorp"    "incorp120" "lanco120"
levels(da$man.res) <- c("inclan", "inc120", "inclan")
levels(da$man.res)
## [1] "inclan" "inc120"
with(da, ftable(manejo~man.res))
##         manejo incorp incorp120 lanco120
## man.res                                 
## inclan             20         0       20
## inc120              0        20        0

m3 <- lm(prod~bloco+manejo+man.res:I(cama*cama.res), data=da)
coef(m3)
##                      (Intercept)                           bloco2 
##                          1229.34                            29.69 
##                           bloco3                           bloco4 
##                          -427.86                          -726.09 
##                  manejoincorp120                   manejolanco120 
##                           919.49                            84.22 
## man.resinclan:I(cama * cama.res) man.resinc120:I(cama * cama.res) 
##                            95.30                               NA

anova(m1, m3)
## Analysis of Variance Table
## 
## Model 1: prod ~ bloco + manejo * cama
## Model 2: prod ~ bloco + manejo + man.res:I(cama * cama.res)
##   Res.Df      RSS Df Sum of Sq    F Pr(>F)
## 1     51 23291258                         
## 2     53 23953867 -2   -662609 0.73   0.49

##-----------------------------------------------------------------------------
## Predição.

pred$cama.res <- ifelse(pred$manejo=="incorp120", 0, 1)
pred$man.res <- pred$manejo
levels(pred$man.res)
## [1] "incorp"    "incorp120" "lanco120"
levels(pred$man.res) <- c("inclan", "inc120", "inclan")

aux <- predict(m3, newdata=pred, interval="confidence")
## Warning: prediction from a rank-deficient fit may be misleading
colnames(aux) <- paste0(colnames(aux), "r")
pred <- cbind(pred, aux)
str(pred)
## 'data.frame':    27 obs. of  11 variables:
##  $ bloco   : Factor w/ 1 level "1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ manejo  : Factor w/ 3 levels "incorp","incorp120",..: 1 2 3 1 2 3 1 2 3 1 ...
##  $ cama    : num  0 0 0 2 2 2 4 4 4 6 ...
##  $ fit     : num  1342 2258 1201 1495 2222 ...
##  $ lwr     : num  805 1722 665 1015 1742 ...
##  $ upr     : num  1878 2795 1737 1975 2702 ...
##  $ cama.res: num  1 0 1 1 0 1 1 0 1 1 ...
##  $ man.res : Factor w/ 2 levels "inclan","inc120": 1 2 1 1 2 1 1 2 1 1 ...
##  $ fitr    : num  1229 2149 1314 1420 2149 ...
##  $ lwrr    : num  747 1722 831 968 1722 ...
##  $ uprr    : num  1712 2575 1796 1872 2575 ...

xyplot(fitr~cama, groups=manejo, data=pred,
       type="l", key=lgd,
       xlab=expression("Cama de frango"~(ton~ha^{-1})),
       ylab=expression("Produtividade"~(kg~ha^{-1})),
       ly=pred$lwrr, uy=pred$uprr, cty="bands", alpha=0.1, fill=1,
       prepanel=prepanel.cbH, panel.groups=panel.cbH, panel=panel.superpose)

plot of chunk unnamed-chunk-3