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 subdividida

##-----------------------------------------------------------------------------
## 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
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_planta_tcc.txt",
                 header=TRUE, sep="\t")
str(da)
## 'data.frame':    40 obs. of  9 variables:
##  $ sistema : Factor w/ 2 levels "convencional",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ adubpk  : int  40 40 40 40 60 60 60 60 90 90 ...
##  $ bloco   : Factor w/ 4 levels "I","II","III",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ alt15.12: num  50.6 48.3 51.6 43.3 49 50.3 51 49 48.6 56.3 ...
##  $ alt05.01: num  69.6 59.6 68.3 60 63 69.3 64.3 67 58 61.6 ...
##  $ alt26.01: num  76.6 74.6 70.3 68 68.3 74 67 64.6 66.3 67.6 ...
##  $ alt1vag : num  12.6 14 14 15.3 12.3 13.6 15.3 12.3 15 14 ...
##  $ prod    : num  2044 2383 3137 2889 2308 ...
##  $ p100    : num  32 30.3 33.7 29 29.4 30.9 30.3 31.3 32 30.8 ...
##-----------------------------------------------------------------------------
## Visualizar.

xyplot(prod~adubpk|bloco, groups=sistema, data=da, type="o",
       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.
da$parcela <- with(da, interaction(bloco, sistema, drop=TRUE))

## Adub categórico.
m0 <- lme(prod~bloco+sistema*adub, random=~1|parcela, data=da,
          method="ML")

## Adub linear.
m1 <- update(m0, prod~bloco+sistema*adubpk)

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

r <- residuals(m0, type="pearson")
f <- fitted(m0)
b <- unlist(ranef(m0))

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

plot of chunk unnamed-chunk-3

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

anova(m0)
##              numDF denDF F-value p-value
## (Intercept)      1    24  1360.8  <.0001
## bloco            3     3     1.2  0.4383
## sistema          1     3     0.5  0.5250
## adub             4    24     2.9  0.0414
## sistema:adub     4    24     0.9  0.5045
anova(m1, m0)
##    Model df   AIC   BIC logLik   Test L.Ratio p-value
## m1     1  9 603.0 618.2 -292.5                       
## m0     2 15 611.1 636.4 -290.5 1 vs 2   3.963  0.6817
anova(m1)
##                numDF denDF F-value p-value
## (Intercept)        1    30  1663.3  <.0001
## bloco              3     3     1.5  0.3766
## sistema            1     3     0.6  0.4857
## adubpk             1    30    11.9  0.0017
## sistema:adubpk     1    30     1.4  0.2464
## Teste de razão de verossimilhanças para o efeito de sistema.
m2 <- update(m0, prod~bloco+adubpk)
anova(m2, m0)
##    Model df   AIC   BIC logLik   Test L.Ratio p-value
## m2     1  7 601.4 613.2 -293.7                       
## m0     2 15 611.1 636.4 -290.5 1 vs 2   6.341  0.6091
##-----------------------------------------------------------------------------
## Obter os valores preditos com bandas de confiança.

pred <- with(da, expand.grid(bloco=levels(bloco),
                             sistema=levels(sistema),
                             adubpk=seq(40,150,by=10)))
str(pred)
## 'data.frame':    96 obs. of  3 variables:
##  $ bloco  : Factor w/ 4 levels "I","II","III",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ sistema: Factor w/ 2 levels "convencional",..: 1 1 1 1 2 2 2 2 1 1 ...
##  $ adubpk : num  40 40 40 40 40 40 40 40 50 50 ...
##  - attr(*, "out.attrs")=List of 2
##   ..$ dim     : Named int  4 2 12
##   .. ..- attr(*, "names")= chr  "bloco" "sistema" "adubpk"
##   ..$ dimnames:List of 3
##   .. ..$ bloco  : chr  "bloco=I" "bloco=II" "bloco=III" "bloco=IV"
##   .. ..$ sistema: chr  "sistema=convencional" "sistema=direto"
##   .. ..$ adubpk : chr  "adubpk= 40" "adubpk= 50" "adubpk= 60" "adubpk= 70" ...
## Matriz para predição com todos os blocos.
X <- model.matrix(formula(m1)[-2], data=pred)
head(X)
##   (Intercept) blocoII blocoIII blocoIV sistemadireto adubpk sistemadireto:adubpk
## 1           1       0        0       0             0     40                    0
## 2           1       1        0       0             0     40                    0
## 3           1       0        1       0             0     40                    0
## 4           1       0        0       1             0     40                    0
## 5           1       0        0       0             1     40                   40
## 6           1       1        0       0             1     40                   40
## Para obter o efeito médio dos blocos
g <- aggregate(X~sistema+adubpk, data=pred, mean)
head(g)
##        sistema adubpk (Intercept) blocoII blocoIII blocoIV sistemadireto adubpk
## 1 convencional     40           1    0.25     0.25    0.25             0     40
## 2       direto     40           1    0.25     0.25    0.25             1     40
## 3 convencional     50           1    0.25     0.25    0.25             0     50
## 4       direto     50           1    0.25     0.25    0.25             1     50
## 5 convencional     60           1    0.25     0.25    0.25             0     60
## 6       direto     60           1    0.25     0.25    0.25             1     60
##   sistemadireto:adubpk
## 1                    0
## 2                   40
## 3                    0
## 4                   50
## 5                    0
## 6                   60
str(g)
## 'data.frame':    24 obs. of  9 variables:
##  $ sistema             : Factor w/ 2 levels "convencional",..: 1 2 1 2 1 2 1 2 1 2 ...
##  $ adubpk              : num  40 40 50 50 60 60 70 70 80 80 ...
##  $ (Intercept)         : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ blocoII             : num  0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 ...
##  $ blocoIII            : num  0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 ...
##  $ blocoIV             : num  0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 ...
##  $ sistemadireto       : num  0 1 0 1 0 1 0 1 0 1 ...
##  $ adubpk              : num  40 40 50 50 60 60 70 70 80 80 ...
##  $ sistemadireto:adubpk: num  0 40 0 50 0 60 0 70 0 80 ...
w <- 1:2
pred <- g[,w]
X <- as.matrix(g[,-w])

## Verifica se os nomes correspondem.
colnames(X)==names(fixef(m1))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## Obtém os erros padrões e limites dos intervalos de confiança.
U <- chol(vcov(m1))
pred$se <- sqrt(apply(X%*%t(U), 1, function(x) sum(x^2)))
zval <- qnorm(p=c(lwr=0.025, fit=0.5, upr=0.975))
me <- outer(pred$se, zval, "*")
fit <- crossprod(t(X), fixef(m1))

pred <- cbind(pred, sweep(me, 1, fit, "+"))
str(pred)
## 'data.frame':    24 obs. of  6 variables:
##  $ sistema: Factor w/ 2 levels "convencional",..: 1 2 1 2 1 2 1 2 1 2 ...
##  $ adubpk : num  40 40 50 50 60 60 70 70 80 80 ...
##  $ se     : num  138 138 124 124 111 ...
##  $ lwr    : num  2400 2323 2462 2422 2522 ...
##  $ fit    : num  2670 2593 2705 2665 2740 ...
##  $ upr    : num  2940 2864 2948 2908 2959 ...
##-----------------------------------------------------------------------------
## Representação.

sub <-
    "Retas não diferem entre si pelo teste de razão de verossimilhanças (5%)."

xyplot(fit~adubpk, groups=sistema, data=pred, type="l",
       auto.key=list(points=FALSE, lines=TRUE,
           title="Sistema de cultivo", cex.title=1.1,
           corner=c(0.05,0.95)),
       xlab=expression("Adubação com PK"~(kg~ha^{-1})),
       ylab=expression("Produtividade"~(kg~ha^{-1})),
       sub=list(sub, font=3, cex=0.8),
       prepanel=prepanel.cbH, cty="bands",
       ly=pred$lwr, uy=pred$upr, alpha=0.1, fill=1,
       panel.groups=panel.cbH,
       panel=panel.superpose)

plot of chunk unnamed-chunk-5