Análise conjunta de experimentos

Walmes Zeviani

##-----------------------------------------------------------------------------
## Definições da sessão.

## Lista de pacotes a serem usados na sessão.
pkg <- c("lattice", "latticeExtra", "doBy", "multcomp", "lme4", "plyr",
         "aod")
sapply(pkg, require, character.only=TRUE)
##      lattice latticeExtra         doBy     multcomp         lme4         plyr          aod 
##         TRUE         TRUE         TRUE         TRUE         TRUE         TRUE         TRUE

source("http://dl.dropboxusercontent.com/u/48140237/apc.R")
source("http://dl.dropboxusercontent.com/u/48140237/equallevels.R")
source("http://dl.dropboxusercontent.com/u/48140237/desdobrglht.R")
## source("http://dl.dropboxusercontent.com/u/48140237/bandas.R")
## source("http://dl.dropboxusercontent.com/u/48140237/segplotby.R")

sessionInfo()
## R version 3.1.0 (2014-04-10)
## Platform: i686-pc-linux-gnu (32-bit)
## 
## locale:
##  [1] LC_CTYPE=pt_BR.UTF-8       LC_NUMERIC=C               LC_TIME=pt_BR.UTF-8       
##  [4] LC_COLLATE=pt_BR.UTF-8     LC_MONETARY=pt_BR.UTF-8    LC_MESSAGES=pt_BR.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] methods   splines   stats     graphics  grDevices utils     datasets  base     
## 
## other attached packages:
##  [1] aod_1.3             plyr_1.8            lme4_1.0-5          Matrix_1.1-3       
##  [5] multcomp_1.2-21     mvtnorm_0.9-9994    doBy_4.5-10         MASS_7.3-33        
##  [9] survival_2.37-7     latticeExtra_0.6-24 RColorBrewer_1.0-5  lattice_0.20-29    
## [13] knitr_1.5          
## 
## loaded via a namespace (and not attached):
## [1] evaluate_0.5.1 formatR_0.9    grid_3.1.0     minqa_1.2.2    nlme_3.1-110   stringr_0.6.2 
## [7] tools_3.1.0

trellis.device(color=FALSE)
##-----------------------------------------------------------------------------
## Leitura dos dados.

da <- read.table("http://www.leg.ufpr.br/~walmes/data/farms.txt",
                 header=TRUE, sep="\t")
str(da)
## 'data.frame':    48 obs. of  4 variables:
##  $ farm : int  1 1 1 1 1 1 2 2 2 2 ...
##  $ block: int  1 1 2 2 3 3 1 1 2 2 ...
##  $ trt  : Factor w/ 2 levels "A","B": 1 2 1 2 1 2 1 2 1 2 ...
##  $ resp : num  30.9 33.3 30.8 30.9 32.3 ...

##-----------------------------------------------------------------------------
## Editar.

da <- transform(da,
                farm=as.factor(farm),
                block=as.factor(block))
str(da)
## 'data.frame':    48 obs. of  4 variables:
##  $ farm : Factor w/ 8 levels "1","2","3","4",..: 1 1 1 1 1 1 2 2 2 2 ...
##  $ block: Factor w/ 3 levels "1","2","3": 1 1 2 2 3 3 1 1 2 2 ...
##  $ trt  : Factor w/ 2 levels "A","B": 1 2 1 2 1 2 1 2 1 2 ...
##  $ resp : num  30.9 33.3 30.8 30.9 32.3 ...

##-----------------------------------------------------------------------------
## Layout.

ftable(farm~block+trt, data=da)
##           farm 1 2 3 4 5 6 7 8
## block trt                     
## 1     A        1 1 1 1 1 1 1 1
##       B        1 1 1 1 1 1 1 1
## 2     A        1 1 1 1 1 1 1 1
##       B        1 1 1 1 1 1 1 1
## 3     A        1 1 1 1 1 1 1 1
##       B        1 1 1 1 1 1 1 1
## ftable(trt~farm+block, data=da)

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

xyplot(resp~trt|farm, groups=block, data=da, type="o")

plot of chunk unnamed-chunk-2

##-----------------------------------------------------------------------------
## Ajuste do modelo que considera apenas o efeito de tratamento como
## fixo, os demais e interações são aleatórios.
## * fixo: trt;
## * aleatório: farm, block dentro de farm e farm interação com trt.

m0 <- lmer(resp~trt+(1|farm)+(1|farm:block)+(1|farm:trt),
           data=da, REML=FALSE)
summary(m0)
## Linear mixed model fit by maximum likelihood ['lmerMod']
## Formula: resp ~ trt + (1 | farm) + (1 | farm:block) + (1 | farm:trt) 
##    Data: da 
## 
##      AIC      BIC   logLik deviance 
##    241.4    252.7   -114.7    229.4 
## 
## Random effects:
##  Groups     Name        Variance Std.Dev.
##  farm:block (Intercept)  0.919   0.958   
##  farm:trt   (Intercept)  8.061   2.839   
##  farm       (Intercept) 17.533   4.187   
##  Residual                1.656   1.287   
## Number of obs: 48, groups: farm:block, 24; farm:trt, 16; farm, 8
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept)   30.211      1.818   16.61
## trtB           0.841      1.467    0.57
## 
## Correlation of Fixed Effects:
##      (Intr)
## trtB -0.403

## Predição dos efeitos aleatórios.
ranef(m0)
## $`farm:block`
##     (Intercept)
## 1:1    -0.06270
## 1:2    -0.69653
## 1:3     0.82623
## 2:1     0.91915
## 2:2     0.02759
## 2:3    -1.06385
## 3:1     0.43810
## 3:2     0.74581
## 3:3    -0.79536
## 4:1    -0.05646
## 4:2     0.07241
## 4:3     0.13553
## 5:1     0.25487
## 5:2    -0.22642
## 5:3    -0.32372
## 6:1     0.72254
## 6:2    -0.09012
## 6:3    -0.78706
## 7:1     0.99247
## 7:2    -0.39615
## 7:3    -0.59603
## 8:1     0.26797
## 8:2    -0.53417
## 8:3     0.22589
## 
## $`farm:trt`
##     (Intercept)
## 1:A    -0.17028
## 1:B     0.75824
## 2:A     2.53631
## 2:B    -3.56397
## 3:A     0.09408
## 3:B     3.31561
## 4:A     3.02067
## 4:B    -1.69133
## 5:A    -1.08595
## 5:B    -1.50516
## 6:A    -0.14137
## 6:B    -1.21573
## 7:A    -3.42833
## 7:B     3.43083
## 8:A    -0.82514
## 8:B     0.47151
## 
## $farm
##   (Intercept)
## 1    1.278767
## 2   -2.235080
## 3    7.415796
## 4    2.891205
## 5   -5.635450
## 6   -2.951573
## 7    0.005443
## 8   -0.769108
## 
## attr(,"class")
## [1] "ranef.mer"

## Existe interação entre farm e trt? Esse componente de variância é
## diferente de zero?

## Modelo que abandona o termo aleatório farm:trt.
m1 <- lmer(resp~trt+(1|farm)+(1|farm:block), data=da)

## Teste para o termo abandonado.
anova(m0, m1)
## Data: da
## Models:
## m1: resp ~ trt + (1 | farm) + (1 | farm:block)
## m0: resp ~ trt + (1 | farm) + (1 | farm:block) + (1 | farm:trt)
##    Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)    
## m1  5 264 274   -127      254                            
## m0  6 241 253   -115      229    25      1    5.7e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

## Existe interação farm:trt.

##-----------------------------------------------------------------------------
## Teste para os termos de efeito fixo.

anova(m0)
## Analysis of Variance Table
##     Df Sum Sq Mean Sq F value
## trt  1  0.544   0.544    0.33

## Não tem p-valor! É de propósito. Leia:
## https://stat.ethz.ch/pipermail/r-help/2006-May/094765.html

## Alternativas (em order de recomendação):
## * Teste de razão de verossimilhanças entre modelos aninhados (um com
##   outro sem o termo fixo de interesse, usar REML=FALSE).
## * Teste de Wald (inferência aproximada, pacote aod).

V <- vcov(m0)
b <- fixef(m0)

Terms <- which(attr(m0@pp$X, "assign")==1)

wt <- wald.test(Sigma=V, b=b, Terms=Terms)
wt
## Wald test:
## ----------
## 
## Chi-squared test:
## X2 = 0.33, df = 1, P(> X2) = 0.57
wt$result
## $chi2
##   chi2     df      P 
## 0.3287 1.0000 0.5664

##-----------------------------------------------------------------------------
## Diagnóstico.

r <- residuals(m0, type="pearson")
f <- fitted(m0)
bfb <- unlist(ranef(m0)[1])
bft <- unlist(ranef(m0)[2])
bf <- unlist(ranef(m0)[3])

xyplot(r~f, type=c("p", "smooth"))

plot of chunk unnamed-chunk-3

xyplot(sqrt(abs(r))~f, type=c("p", "smooth"))

plot of chunk unnamed-chunk-3


qqmath(r)

plot of chunk unnamed-chunk-3

qqmath(bfb)

plot of chunk unnamed-chunk-3

qqmath(bft)

plot of chunk unnamed-chunk-3

qqmath(bf)

plot of chunk unnamed-chunk-3


##-----------------------------------------------------------------------------
## Médias ajustadas.

## Formula só da parte de efeito fixo.
f <- nobars(formula(m0))
X <- LSmatrix(lm(f, da), effect=c("trt"))
str(X)
##  LSmatrix [1:2, 1:2] 1 1 0 1
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:2] "(Intercept)" "trtB"
##  - attr(*, "grid")='data.frame': 2 obs. of  1 variable:
##   ..$ trt: chr [1:2] "A" "B"
##  - attr(*, "class")= chr [1:2] "LSmatrix" "matrix"

## Estimativas das médias.
summary(glht(m0, linfct=X))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Fit: lmer(formula = resp ~ trt + (1 | farm) + (1 | farm:block) + (1 | 
##     farm:trt), data = da, REML = FALSE)
## 
## Linear Hypotheses:
##        Estimate Std. Error z value Pr(>|z|)    
## 1 == 0    30.21       1.82    16.6   <1e-10 ***
## 2 == 0    31.05       1.82    17.1   <1e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)

## Contraste.
summary(glht(m0, linfct=rbind(X[1,]-X[2,])))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Fit: lmer(formula = resp ~ trt + (1 | farm) + (1 | farm:block) + (1 | 
##     farm:trt), data = da, REML = FALSE)
## 
## Linear Hypotheses:
##        Estimate Std. Error z value Pr(>|z|)
## 1 == 0   -0.841      1.467   -0.57     0.57
## (Adjusted p values reported -- single-step method)
##-----------------------------------------------------------------------------
## Para desdobrar a interação farm:trt, tratar como efeito fixo.

m0 <- lmer(resp~farm*trt+(1|farm:block),
           data=da, REML=FALSE)
summary(m0)
## Linear mixed model fit by maximum likelihood ['lmerMod']
## Formula: resp ~ farm * trt + (1 | farm:block) 
##    Data: da 
## 
##      AIC      BIC   logLik deviance 
##   194.87   228.56   -79.44   158.87 
## 
## Random effects:
##  Groups     Name        Variance Std.Dev.
##  farm:block (Intercept) 0.612    0.783   
##  Residual               1.104    1.051   
## Number of obs: 48, groups: farm:block, 24
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept)   31.330      0.756    41.4
## farm2         -0.683      1.070    -0.6
## farm3          6.527      1.070     6.1
## farm4          5.050      1.070     4.7
## farm5         -8.013      1.070    -7.5
## farm6         -4.273      1.070    -4.0
## farm7         -4.777      1.070    -4.5
## farm8         -2.783      1.070    -2.6
## trtB           1.833      0.858     2.1
## farm2:trtB    -7.510      1.213    -6.2
## farm3:trtB     2.450      1.213     2.0
## farm4:trtB    -6.027      1.213    -5.0
## farm5:trtB    -1.440      1.213    -1.2
## farm6:trtB    -2.140      1.213    -1.8
## farm7:trtB     6.337      1.213     5.2
## farm8:trtB     0.393      1.213     0.3
## 
## Correlation of Fixed Effects:
##            (Intr) farm2  farm3  farm4  farm5  farm6  farm7  farm8  trtB   frm2:B frm3:B frm4:B
## farm2      -0.707                                                                             
## farm3      -0.707  0.500                                                                      
## farm4      -0.707  0.500  0.500                                                               
## farm5      -0.707  0.500  0.500  0.500                                                        
## farm6      -0.707  0.500  0.500  0.500  0.500                                                 
## farm7      -0.707  0.500  0.500  0.500  0.500  0.500                                          
## farm8      -0.707  0.500  0.500  0.500  0.500  0.500  0.500                                   
## trtB       -0.567  0.401  0.401  0.401  0.401  0.401  0.401  0.401                            
## farm2:trtB  0.401 -0.567 -0.284 -0.284 -0.284 -0.284 -0.284 -0.284 -0.707                     
## farm3:trtB  0.401 -0.284 -0.567 -0.284 -0.284 -0.284 -0.284 -0.284 -0.707  0.500              
## farm4:trtB  0.401 -0.284 -0.284 -0.567 -0.284 -0.284 -0.284 -0.284 -0.707  0.500  0.500       
## farm5:trtB  0.401 -0.284 -0.284 -0.284 -0.567 -0.284 -0.284 -0.284 -0.707  0.500  0.500  0.500
## farm6:trtB  0.401 -0.284 -0.284 -0.284 -0.284 -0.567 -0.284 -0.284 -0.707  0.500  0.500  0.500
## farm7:trtB  0.401 -0.284 -0.284 -0.284 -0.284 -0.284 -0.567 -0.284 -0.707  0.500  0.500  0.500
## farm8:trtB  0.401 -0.284 -0.284 -0.284 -0.284 -0.284 -0.284 -0.567 -0.707  0.500  0.500  0.500
##            frm5:B frm6:B frm7:B
## farm2                          
## farm3                          
## farm4                          
## farm5                          
## farm6                          
## farm7                          
## farm8                          
## trtB                           
## farm2:trtB                     
## farm3:trtB                     
## farm4:trtB                     
## farm5:trtB                     
## farm6:trtB  0.500              
## farm7:trtB  0.500  0.500       
## farm8:trtB  0.500  0.500  0.500

##-----------------------------------------------------------------------------
## Testes de Wald.

V <- vcov(m0)
b <- fixef(m0)

## Termos de efeito fixo.
nobars(formula(m0))
## resp ~ farm * trt
a <- attr(m0@pp$X, "assign"); a
##  [1] 0 1 1 1 1 1 1 1 2 3 3 3 3 3 3 3
split(fixef(m0), a)
## $`0`
## (Intercept) 
##       31.33 
## 
## $`1`
##   farm2   farm3   farm4   farm5   farm6   farm7   farm8 
## -0.6833  6.5267  5.0500 -8.0133 -4.2733 -4.7767 -2.7833 
## 
## $`2`
##  trtB 
## 1.833 
## 
## $`3`
## farm2:trtB farm3:trtB farm4:trtB farm5:trtB farm6:trtB farm7:trtB farm8:trtB 
##    -7.5100     2.4500    -6.0267    -1.4400    -2.1400     6.3367     0.3933

## Teste para farm.
Terms <- which(a==1)
wald.test(Sigma=V, b=b, Terms=Terms)$result
## $chi2
##  chi2    df     P 
## 299.9   7.0   0.0

## Teste para trt.
Terms <- which(a==2)
wald.test(Sigma=V, b=b, Terms=Terms)$result
## $chi2
##    chi2      df       P 
## 4.56765 1.00000 0.03258

## Teste para farm:trt.
Terms <- which(a==3)
wald.test(Sigma=V, b=b, Terms=Terms)$result
## $chi2
##  chi2    df     P 
## 187.3   7.0   0.0

##-----------------------------------------------------------------------------
## Médias ajustadas.

## Formula só da parte de efeito fixo.
f <- nobars(formula(m0))
X <- LSmatrix(lm(f, da), effect=c("farm", "trt"))
str(X)
##  LSmatrix [1:16, 1:16] 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:16] "(Intercept)" "farm2" "farm3" "farm4" ...
##  - attr(*, "grid")='data.frame': 16 obs. of  2 variables:
##   ..$ farm: chr [1:16] "1" "2" "3" "4" ...
##   ..$ trt : chr [1:16] "A" "A" "A" "A" ...
##  - attr(*, "class")= chr [1:2] "LSmatrix" "matrix"

grid <- attr(X, "grid")
grid <- equallevels(grid, da)

## Estimativas das médias.
g <- summary(glht(m0, linfct=X), test=adjusted(type="fdr"))
ci <- confint(g, calpha=univariate_calpha())$confint

grid <- cbind(grid, ci)
grid
##    farm trt Estimate   lwr   upr
## 1     1   A    31.33 29.85 32.81
## 2     2   A    30.65 29.16 32.13
## 3     3   A    37.86 36.37 39.34
## 4     4   A    36.38 34.90 37.86
## 5     5   A    23.32 21.83 24.80
## 6     6   A    27.06 25.57 28.54
## 7     7   A    26.55 25.07 28.04
## 8     8   A    28.55 27.06 30.03
## 9     1   B    33.16 31.68 34.65
## 10    2   B    24.97 23.49 26.45
## 11    3   B    42.14 40.66 43.62
## 12    4   B    32.19 30.70 33.67
## 13    5   B    23.71 22.23 25.19
## 14    6   B    26.75 25.27 28.23
## 15    7   B    34.72 33.24 36.21
## 16    8   B    30.77 29.29 32.26

##-----------------------------------------------------------------------------
## Contrastes.

## Parte a matriz de acordo com farm.
L <- by(X, grid$farm, FUN=as.matrix)
L <- lapply(L, "rownames<-", levels(da$trt))

L <- lapply(L, desdobr.glht, m0=m0, focus="trt")
L
## $`1`
##   trt estimate   lwr   upr cld
## 1   A    31.33 29.85 32.81   b
## 2   B    33.16 31.68 34.65   a
## 
## $`2`
##   trt estimate   lwr   upr cld
## 1   A    30.65 29.16 32.13   b
## 2   B    24.97 23.49 26.45   a
## 
## $`3`
##   trt estimate   lwr   upr cld
## 1   A    37.86 36.37 39.34   b
## 2   B    42.14 40.66 43.62   a
## 
## $`4`
##   trt estimate  lwr   upr cld
## 1   A    36.38 34.9 37.86   b
## 2   B    32.19 30.7 33.67   a
## 
## $`5`
##   trt estimate   lwr   upr cld
## 1   A    23.32 21.83 24.80   a
## 2   B    23.71 22.23 25.19   a
## 
## $`6`
##   trt estimate   lwr   upr cld
## 1   A    27.06 25.57 28.54   a
## 2   B    26.75 25.27 28.23   a
## 
## $`7`
##   trt estimate   lwr   upr cld
## 1   A    26.55 25.07 28.04   b
## 2   B    34.72 33.24 36.21   a
## 
## $`8`
##   trt estimate   lwr   upr cld
## 1   A    28.55 27.06 30.03   b
## 2   B    30.77 29.29 32.26   a

##-----------------------------------------------------------------------------
## Gráfico.

grid <- ldply(L)
names(grid)[1] <- "farm"
grid <- equallevels(grid, da)

segplot(trt~lwr+upr|farm, centers=estimate,
        ylab="Tratamento", xlab="Resposta",
        data=grid, draw=FALSE, strip=FALSE, strip.left=TRUE,
        layout=c(1,NA), cld=grid$cld,
        panel=function(x, y, z, centers, subscripts, cld, ...){
            panel.segplot(x, y, z, centers=centers,
                          subscripts=subscripts, ...)
            panel.text(x=centers[subscripts], y=as.numeric(z)[subscripts],
                       labels=cld[subscripts], pos=4)
        })

plot of chunk unnamed-chunk-4