Ajuste de modelos lineares e mistos no ambiente R

09 e 10 de Outubro de 2014 - Piracicaba - SP
Prof. Dr. Walmes M. Zeviani
Escola Superior de Agricultura “Luiz de Queiroz” - USP
Lab. de Estatística e Geoinformação - LEG
Pós Graduação em Genética e Melhoramento de Plantas Departamento de Estatística - UFPR

Análise de experimento em parcela subsubdividida

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

## Lista de pacotes a serem usados na sessão.
pkg <- c("lattice", "latticeExtra", "gridExtra", "doBy", "multcomp",
         "reshape", "plyr", "nlme", "wzRfun")
sapply(pkg, require, character.only=TRUE)
##      lattice latticeExtra    gridExtra         doBy     multcomp      reshape 
##         TRUE         TRUE         TRUE         TRUE         TRUE         TRUE 
##         plyr         nlme       wzRfun 
##         TRUE         TRUE         TRUE
## source("http://dl.dropboxusercontent.com/u/48140237/apc.R")
## source("http://dl.dropboxusercontent.com/u/48140237/segplotby.R")
## source("http://dl.dropboxusercontent.com/u/48140237/equallevels.R")

sessionInfo()
## R version 3.1.1 (2014-07-10)
## Platform: x86_64-pc-linux-gnu (64-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   grid      stats     graphics  grDevices utils     datasets  base     
## 
## other attached packages:
##  [1] wzRfun_0.2          nlme_3.1-117        plyr_1.8.1          reshape_0.8.5      
##  [5] multcomp_1.3-3      TH.data_1.0-3       mvtnorm_0.9-9997    doBy_4.5-10        
##  [9] MASS_7.3-34         survival_2.37-7     gridExtra_0.9.1     latticeExtra_0.6-26
## [13] RColorBrewer_1.0-5  lattice_0.20-29     knitr_1.6          
## 
## loaded via a namespace (and not attached):
##  [1] evaluate_0.5.5      formatR_0.10        lme4_1.1-6          Matrix_1.1-4       
##  [5] methods_3.1.1       minqa_1.2.3         Rcpp_0.11.2         RcppEigen_0.3.2.0.2
##  [9] sandwich_2.3-0      stringr_0.6.2       tools_3.1.1         zoo_1.7-10
trellis.device(color=FALSE)

##-----------------------------------------------------------------------------
## Leitura dos dados.

da <- read.table("http://www.leg.ufpr.br/~walmes/data/soja_solo_tcc.txt",
                 header=TRUE, sep="\t")
str(da)
## 'data.frame':    80 obs. of  16 variables:
##  $ sistema: Factor w/ 2 levels "convencional",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ adubpk : int  40 40 40 40 40 40 40 40 60 60 ...
##  $ prof   : Factor w/ 2 levels "00-20","20-40": 1 1 1 1 2 2 2 2 1 1 ...
##  $ bloco  : Factor w/ 4 levels "I","II","III",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ Zn     : num  0.8 0.9 0.9 1.2 0.7 0.3 0.7 1.1 1.3 1.1 ...
##  $ phcacl2: num  5.1 5.3 4.7 5 4.6 4.3 4.4 4.5 5.8 6.5 ...
##  $ phh2o  : num  5.9 6.3 5.3 5.6 5.2 5 5 5.1 6.6 7.5 ...
##  $ P      : int  3 7 2 2 2 2 1 2 4 6 ...
##  $ K      : num  2.2 1.7 2.8 4.4 1.6 1 1.9 3.8 3 1.5 ...
##  $ Al     : num  0 0 2.5 0.6 3.1 7.4 6.6 8 0 0 ...
##  $ Ca     : int  45 58 30 37 27 19 23 22 27 81 ...
##  $ Mg     : int  34 33 16 18 23 12 13 10 36 33 ...
##  $ Hal    : int  47 38 72 53 69 89 80 76 29 19 ...
##  $ sb     : num  81.2 92.7 48.8 59.4 51.6 ...
##  $ ctc    : num  128 131 121 112 121 ...
##  $ v      : int  63 70 40 52 42 26 32 32 76 85 ...
##-----------------------------------------------------------------------------
## Visualizar.

xyplot(ctc~adubpk|sistema, groups=prof, data=da, type=c("p","smooth"),
       auto.key=TRUE)
##-----------------------------------------------------------------------------
## Análise considerando o modelo para experimentos em parcela
## subdividida sendo o sistema a parcela e a adubação a subparcela.

## Efeito categórico para adub para começar.
da$adub <- factor(da$adubpk)

## Níveis das parcelas e subparcelas.
da$parc <- with(da, interaction(bloco, sistema, drop=TRUE))
da$subp <- with(da, interaction(bloco, sistema, adub, drop=TRUE))
str(da)
## 'data.frame':    80 obs. of  19 variables:
##  $ sistema: Factor w/ 2 levels "convencional",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ adubpk : int  40 40 40 40 40 40 40 40 60 60 ...
##  $ prof   : Factor w/ 2 levels "00-20","20-40": 1 1 1 1 2 2 2 2 1 1 ...
##  $ bloco  : Factor w/ 4 levels "I","II","III",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ Zn     : num  0.8 0.9 0.9 1.2 0.7 0.3 0.7 1.1 1.3 1.1 ...
##  $ phcacl2: num  5.1 5.3 4.7 5 4.6 4.3 4.4 4.5 5.8 6.5 ...
##  $ phh2o  : num  5.9 6.3 5.3 5.6 5.2 5 5 5.1 6.6 7.5 ...
##  $ P      : int  3 7 2 2 2 2 1 2 4 6 ...
##  $ K      : num  2.2 1.7 2.8 4.4 1.6 1 1.9 3.8 3 1.5 ...
##  $ Al     : num  0 0 2.5 0.6 3.1 7.4 6.6 8 0 0 ...
##  $ Ca     : int  45 58 30 37 27 19 23 22 27 81 ...
##  $ Mg     : int  34 33 16 18 23 12 13 10 36 33 ...
##  $ Hal    : int  47 38 72 53 69 89 80 76 29 19 ...
##  $ sb     : num  81.2 92.7 48.8 59.4 51.6 ...
##  $ ctc    : num  128 131 121 112 121 ...
##  $ v      : int  63 70 40 52 42 26 32 32 76 85 ...
##  $ adub   : Factor w/ 5 levels "40","60","90",..: 1 1 1 1 1 1 1 1 2 2 ...
##  $ parc   : Factor w/ 8 levels "I.convencional",..: 5 6 7 8 5 6 7 8 5 6 ...
##  $ subp   : Factor w/ 40 levels "I.convencional.40",..: 5 6 7 8 5 6 7 8 13 14 ...
## Adub categórico.
m0 <- lme(ctc~bloco+sistema*adub*prof, random=~1|parc/subp, data=da,
          method="ML")

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

r <- residuals(m0, type="pearson")
f <- fitted(m0)
bp <- unlist(ranef(m0)[1])
bs <- unlist(ranef(m0)[2])

grid.arrange(nrow=3,
             xyplot(r~f, type=c("p", "smooth")),
             xyplot(sqrt(abs(r))~f, type=c("p", "smooth")),
             qqmath(r), qqmath(bp), qqmath(bs))

plot of chunk unnamed-chunk-3

##-----------------------------------------------------------------------------
## Quadro para o teste dos efeitos fixos (Wald).

anova(m0)
##                   numDF denDF F-value p-value
## (Intercept)           1    30   12774  <.0001
## bloco                 3     3       2  0.2364
## sistema               1     3       3  0.1747
## adub                  4    24       1  0.3130
## prof                  1    30      16  0.0004
## sistema:adub          4    24       1  0.4574
## sistema:prof          1    30       5  0.0303
## adub:prof             4    30       1  0.5711
## sistema:adub:prof     4    30       0  0.8630
## Abandono das interações não significativas.
m1 <- update(m0, .~bloco+sistema*prof+adubpk)
## m2 <- update(m0, .~bloco+sistema*prof)

anova(m1, m0)
##    Model df   AIC   BIC logLik   Test L.Ratio p-value
## m1     1 11 572.1 598.3 -275.1                       
## m0     2 26 589.9 651.8 -268.9 1 vs 2   12.24  0.6605
anova(m1)
##              numDF denDF F-value p-value
## (Intercept)      1    38   13649  <.0001
## bloco            3     3       3  0.2211
## sistema          1     3       3  0.1645
## prof             1    38      18  0.0002
## adubpk           1    31       4  0.0585
## sistema:prof     1    38       6  0.0222
## Sem efeito da adubação. O que existe é uma diferença entre camadas
## para a que depende do sistema.
##-----------------------------------------------------------------------------
## Obter as médias de ctc em cada prof para cada sistema. Pode-se ficar
## a adubação em qualquer nível, bem como bloco.

X <- LSmatrix(lm(formula(m1), data=da), effect=c("sistema","prof"),
              at=list(adubpk=120))
head(X)
##      (Intercept) blocoII blocoIII blocoIV sistemadireto prof20-40 adubpk
## [1,]           1    0.25     0.25    0.25             0         0    120
## [2,]           1    0.25     0.25    0.25             1         0    120
## [3,]           1    0.25     0.25    0.25             0         1    120
## [4,]           1    0.25     0.25    0.25             1         1    120
##      sistemadireto:prof20-40
## [1,]                       0
## [2,]                       0
## [3,]                       0
## [4,]                       1
grid <- attr(X, "grid")
rownames(X) <- apply(grid, 1, paste, collapse="|")

L <- by(X, grid$sistema, apc, lev=c(20,40))
L <- lapply(L, as.matrix); L
## $convencional
##       (Intercept) blocoII blocoIII blocoIV sistemadireto prof20-40 adubpk
## 20-40           0       0        0       0             0        -1      0
##       sistemadireto:prof20-40
## 20-40                       0
## 
## $direto
##       (Intercept) blocoII blocoIII blocoIV sistemadireto prof20-40 adubpk
## 20-40           0       0        0       0             0        -1      0
##       sistemadireto:prof20-40
## 20-40                      -1
str(L)
## List of 2
##  $ convencional: num [1, 1:8] 0 0 0 0 0 -1 0 0
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr "20-40"
##   .. ..$ : chr [1:8] "(Intercept)" "blocoII" "blocoIII" "blocoIV" ...
##  $ direto      : num [1, 1:8] 0 0 0 0 0 -1 0 -1
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr "20-40"
##   .. ..$ : chr [1:8] "(Intercept)" "blocoII" "blocoIII" "blocoIV" ...
Xc <- do.call(rbind, L)
rownames(Xc) <- paste0(names(L), "/", rownames(Xc))
Xc
##                    (Intercept) blocoII blocoIII blocoIV sistemadireto prof20-40 adubpk
## convencional/20-40           0       0        0       0             0        -1      0
## direto/20-40                 0       0        0       0             0        -1      0
##                    sistemadireto:prof20-40
## convencional/20-40                       0
## direto/20-40                            -1
## Teste para os contrastes.
summary(glht(m1, linfct=Xc))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Fit: lme.formula(fixed = ctc ~ bloco + sistema + prof + adubpk + sistema:prof, 
##     data = da, random = ~1 | parc/subp, method = "ML")
## 
## Linear Hypotheses:
##                         Estimate Std. Error z value Pr(>|z|)    
## convencional/20-40 == 0     2.69       1.99    1.35     0.32    
## direto/20-40 == 0           9.78       1.99    4.90  1.9e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)
## Médias com IC.
ci <- confint(glht(m1, linfct=X), calpha=univariate_calpha())

grid <- cbind(grid, ci$confint)
grid <- equallevels(grid, da)
grid
##                             sistema  prof adubpk Estimate   lwr   upr
## convencional|00-20|120 convencional 00-20    120    124.7 121.1 128.4
## direto|00-20|120             direto 00-20    120    132.2 128.5 135.9
## convencional|20-40|120 convencional 20-40    120    122.1 118.4 125.7
## direto|20-40|120             direto 20-40    120    122.4 118.7 126.1
##-----------------------------------------------------------------------------
## Representação.

## names(trellis.par.get())

l <- levels(grid$prof)
key <- list(corner=c(x=0.9, y=0.05),
            type="o", divide=1,
            title="Camada do solo (cm)", cex.title=1.1,
            lines=list(pch=1:length(l),
                col=trellis.par.get("plot.symbol")$col),
            text=list(l))

segplot(sistema~lwr+upr, centers=Estimate, groups=grid$prof, f=0.05,
        data=grid, draw=FALSE, panel=panel.segplotBy, key=key,
        scales=list(y=list(rot=90)),
        pch=as.integer(grid$prof),
        xlab="CTC do solo",
        ylab="Sistema de cultivo")

plot of chunk unnamed-chunk-5

##-----------------------------------------------------------------------------
## Os erros padrões de comparações de prof dentro de sistema e de
## sistema dentro de prof são diferentes pois são fatores com níveis em
## estratos diferentes no modelos misto de parcela subsubdividida.

## Desdobrar prof dentro (fixando) de sistema.
L <- by(X, grid$sistema, apc, lev=c(20,40))
L <- lapply(L, as.matrix)
Xc <- do.call(rbind, L)
rownames(Xc) <- paste0(names(L), "/", rownames(Xc))
summary(glht(m1, linfct=Xc))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Fit: lme.formula(fixed = ctc ~ bloco + sistema + prof + adubpk + sistema:prof, 
##     data = da, random = ~1 | parc/subp, method = "ML")
## 
## Linear Hypotheses:
##                         Estimate Std. Error z value Pr(>|z|)    
## convencional/20-40 == 0     2.69       1.99    1.35     0.32    
## direto/20-40 == 0           9.78       1.99    4.90  1.9e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)
## Desdobrar sistema dentro (fixando) de prof.
L <- by(X, grid$prof, apc, lev=levels(grid$sistema))
L <- lapply(L, as.matrix)
Xc <- do.call(rbind, L)
rownames(Xc) <- paste0(names(L), "/", rownames(Xc))
summary(glht(m1, linfct=Xc))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Fit: lme.formula(fixed = ctc ~ bloco + sistema + prof + adubpk + sistema:prof, 
##     data = da, random = ~1 | parc/subp, method = "ML")
## 
## Linear Hypotheses:
##                                Estimate Std. Error z value Pr(>|z|)   
## 00-20/convencional-direto == 0    -7.42       2.46   -3.02    0.005 **
## 20-40/convencional-direto == 0    -0.34       2.46   -0.14    0.987   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)
summary(glht(m1, linfct=X))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Fit: lme.formula(fixed = ctc ~ bloco + sistema + prof + adubpk + sistema:prof, 
##     data = da, random = ~1 | parc/subp, method = "ML")
## 
## Linear Hypotheses:
##                             Estimate Std. Error z value Pr(>|z|)    
## convencional|00-20|120 == 0   124.75       1.88    66.5   <2e-16 ***
## direto|00-20|120 == 0         132.17       1.88    70.4   <2e-16 ***
## convencional|20-40|120 == 0   122.06       1.88    65.0   <2e-16 ***
## direto|20-40|120 == 0         122.40       1.88    65.2   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)