Curso de estatística experimental com aplicações em R |
|
12 à 14 de Novembro de 2014 - Manaus - AM |
Prof. Dr. Walmes M. Zeviani |
Embrapa Amazônia Ocidental |
Lab. de Estatística e Geoinformação - LEG |
Departamento de Estatística - UFPR |
##-----------------------------------------------------------------------------
## Definições da sessão, pacotes a serem usados.
pkg <- c("lattice", "latticeExtra", "doBy", "multcomp", "reshape",
"plyr", "wzRfun")
sapply(pkg, library, character.only=TRUE, logical.return=TRUE)
## lattice latticeExtra doBy multcomp reshape 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] methods splines stats graphics grDevices utils datasets base
##
## other attached packages:
## [1] wzRfun_0.3 plyr_1.8.1 reshape_0.8.5 multcomp_1.3-7
## [5] TH.data_1.0-3 mvtnorm_0.9-9997 doBy_4.5-11 MASS_7.3-34
## [9] survival_2.37-7 latticeExtra_0.6-26 RColorBrewer_1.0-5 lattice_0.20-29
## [13] rmarkdown_0.3.3 knitr_1.7
##
## loaded via a namespace (and not attached):
## [1] digest_0.6.4 evaluate_0.5.5 formatR_1.0 grid_3.1.1 htmltools_0.2.6
## [6] Matrix_1.1-4 Rcpp_0.11.3 sandwich_2.3-0 stringr_0.6.2 tools_3.1.1
## [11] yaml_2.1.13 zoo_1.7-10
## obs: Para instalar um pacote faça:
## install.packages("nome_do_pacote", dependencies=TRUE)
##-----------------------------------------------------------------------------
## Lendo arquivos de dados.
## Url de um arquivo com dados.
url <- "http://www.leg.ufpr.br/~walmes/data/montgomery_14-5.txt"
## Importa os dados a partir do arquivo na web.
da <- read.table(file=url, header=TRUE, sep="\t")
names(da) <- substr(names(da), 1, 4)
## Convertendo para fator.
da <- transform(da, isol=factor(isol), temp=factor(temp))
## Mostra a estrutura do objeto.
str(da)
## 'data.frame': 72 obs. of 3 variables:
## $ isol: Factor w/ 4 levels "1","2","3","4": 1 1 1 2 2 2 3 3 3 4 ...
## $ temp: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ y : num 6.6 2.7 6 3 2.1 5.9 5.7 3.2 5.3 7 ...
## Os dados são de um experimento para verificar o efeito a adubação com
## potássio nos componentes de produção de soja sob diferentes níveis de
## umidade.
##-----------------------------------------------------------------------------
## Análise exploratória.
xyplot(y~temp, groups=isol, data=da,
type=c("p","a"), auto.key=list(columns=nlevels(da$isol)))
\[ \begin{aligned} Y|\text{fontes de variação} &\,\sim \text{Normal}(\mu_{ij}, \sigma^2) \newline \mu_{ij} &= \mu+\alpha_i+\tau_j \end{aligned} \]
em que \(\alpha_i\) é o efeito do isolante \(i\), \(\tau_j\) o efeito da temperatura \(j\) sobre a média da variável resposta \(Y\). \(\mu\) é a média de \(Y\) na ausência do efeito dos termos mencioandos. \(\mu_{ij}\) é a média para as observações na combinação \(ij\) e \(\sigma^2\) é a variância das observações ao redor desse valor médio.
##-----------------------------------------------------------------------------
## Espeficicação do modelo.
m0 <- lm(y~isol*temp, data=da)
## Resíduos.
par(mfrow=c(2,2)); plot(m0); layout(1)
## MASS::boxcox(m0)
## Quadro de anova.
anova(m0)
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## isol 3 453.61 151.203 40.0658 2.421e-14 ***
## temp 2 2.44 1.222 0.3237 0.7247
## isol:temp 6 38.54 6.423 1.7019 0.1362
## Residuals 60 226.43 3.774
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##-----------------------------------------------------------------------------
## Partição da soma de quadrados.
## Essa etapa não é obrigatória porém muitos aplicativos reportam a
## particação do quadro de análise de variância como parte dos
## resultados do desdobramente da interação. Aqui será feito à titulo de
## demonstração.
## Partição para efeito de temp dentro de cada isol. Não faz muito
## sentido fazer o desdobramente porque não houve interação. Será feito
## por razões de demonstação.
m1 <- aov(y~isol/temp, data=da)
summary(m1)
## Df Sum Sq Mean Sq F value Pr(>F)
## isol 3 453.6 151.20 40.066 2.42e-14 ***
## isol:temp 8 41.0 5.12 1.357 0.234
## Residuals 60 226.4 3.77
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ef <- data.frame(fv=m1$assign, par=names(coef(m1)),
stringsAsFactors=FALSE)
ef2 <- subset(ef, fv==2)
i <- paste0("^isol", levels(da$isol), ":temp")
TinI <- lapply(i, grep, x=ef2$par)
names(TinI) <- levels(da$isol)
lapply(TinI, function(i) ef2[i,])
## $`1`
## fv par
## 5 2 isol1:temp2
## 9 2 isol1:temp3
##
## $`2`
## fv par
## 6 2 isol2:temp2
## 10 2 isol2:temp3
##
## $`3`
## fv par
## 7 2 isol3:temp2
## 11 2 isol3:temp3
##
## $`4`
## fv par
## 8 2 isol4:temp2
## 12 2 isol4:temp3
## Quadro de análise de variância particionado.
summary(m1, split=list("isol:temp"=TinI))
## Df Sum Sq Mean Sq F value Pr(>F)
## isol 3 453.6 151.20 40.066 2.42e-14 ***
## isol:temp 8 41.0 5.12 1.357 0.234
## isol:temp: 1 2 10.5 5.25 1.390 0.257
## isol:temp: 2 2 13.7 6.87 1.821 0.171
## isol:temp: 3 2 15.3 7.67 2.032 0.140
## isol:temp: 4 2 1.4 0.70 0.187 0.830
## Residuals 60 226.4 3.77
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##-----------------------------------------------------------------------------
## Outra forma de avaliar a mesma hipótese é pela estatística F do teste
## de Wald. Esse mecanismo de teste de hipótese é mais geral e pode ser
## usado em outras classes de modelo, como glm, modelos de sobrevivência
## e modelos mistos.
i <- paste0("^isol", levels(da$isol), ":temp")
TinI <- lapply(i, grep, x=ef$par)
names(TinI) <- levels(da$isol)
lapply(TinI, function(i) ef[i,])
## $`1`
## fv par
## 5 2 isol1:temp2
## 9 2 isol1:temp3
##
## $`2`
## fv par
## 6 2 isol2:temp2
## 10 2 isol2:temp3
##
## $`3`
## fv par
## 7 2 isol3:temp2
## 11 2 isol3:temp3
##
## $`4`
## fv par
## 8 2 isol4:temp2
## 12 2 isol4:temp3
## Matriz de covariância dos efeitos e estimativas. É um teste baseado
## em aproximação quadrática.
Sigma <- vcov(m1)
b <- coef(m1)
## Requer que o pacote 'aod' esteja instalado.
Fwald <- sapply(TinI, simplify=FALSE,
function(i){
wt <- aod::wald.test(
Sigma=Sigma,
b=b, Terms=i,
df=df.residual(m1))$result$Ftest[c(1,4)]
data.frame(as.list(wt))
})
## str(Fwald)
## Valores de F e correspondente p-valor.
do.call(rbind, Fwald)
## Fstat P
## 1 1.3902649 0.2569143
## 2 1.8208584 0.1707186
## 3 2.0316652 0.1400400
## 4 0.1865169 0.8303238
##-----------------------------------------------------------------------------
## Comparações múltiplas para isol.
## Pelo teste F não existe efeito de temperatura.
LSmeans(m0, effect="temp")
## estimate se df t.stat p.value lwr upr temp
## 1 5.620833 0.3965403 60 14.17468 8.221715e-21 4.827635 6.414032 1
## 2 5.679167 0.3965403 60 14.32179 5.085369e-21 4.885968 6.472365 2
## 3 5.262500 0.3965403 60 13.27103 1.670691e-19 4.469301 6.055699 3
## Para isolante, fazer comparações múltiplas.
LSmeans(m0, effect="isol")
## estimate se df t.stat p.value lwr upr isol
## 1 4.183333 0.4578853 60 9.136204 5.827113e-13 3.267426 5.099240 1
## 2 2.350000 0.4578853 60 5.132290 3.252575e-06 1.434093 3.265907 2
## 3 6.511111 0.4578853 60 14.219961 7.089549e-21 5.595204 7.427018 3
## 4 9.038889 0.4578853 60 19.740509 6.284742e-28 8.122982 9.954796 4
X <- LSmatrix(m0, effect="isol")
grid <- equallevels(attr(X, "grid"), da)
rownames(X) <- levels(grid$isol)
grid <- apmc(X, model=m0, focus="isol", test="single-step")
grid
## isol estimate lwr upr cld
## 1 1 4.183333 3.267426 5.099240 c
## 2 2 2.350000 1.434093 3.265907 d
## 3 3 6.511111 5.595204 7.427018 b
## 4 4 9.038889 8.122982 9.954796 a
##-----------------------------------------------------------------------------
## Representação gráfica dos resultados.
ylab <- "y"
xlab <- "Isolante"
sub <- list(
"Médias seguidas de mesma letra indicam diferença nula à 5%.",
font=1, cex=0.8)
## Gráfico final.
segplot(isol~lwr+upr, centers=estimate,
data=grid, draw=FALSE,
xlab=xlab, ylab=ylab, sub=sub,
letras=sprintf("%0.2f %s", grid$estimate, grid$cld),
panel=function(x, y, z, subscripts, centers, letras, ...){
panel.segplot(x=x, y=y, z=z, centers=centers,
subscripts=subscripts, ...)
panel.text(y=as.numeric(z)[subscripts],
x=centers[subscripts],
label=letras[subscripts],
srt=0, adj=c(0.5,-0.5))
})
##-----------------------------------------------------------------------------
## Análise com o pacote ExpDes.
require(ExpDes)
## Loading required package: ExpDes
##
## Attaching package: 'ExpDes'
##
## The following object is masked from 'package:MASS':
##
## ginv
## Funções do pacote ExpDes.
ls("package:ExpDes")
## [1] "ccboot" "crd" "duncan" "fat2.ad.crd" "fat2.ad.rbd"
## [6] "fat2.crd" "fat2.rbd" "fat3.ad.crd" "fat3.ad.rbd" "fat3.crd"
## [11] "fat3.rbd" "ginv" "lastC" "latsd" "lsd"
## [16] "lsdb" "order.group" "order.stat.SNK" "rbd" "reg.poly"
## [21] "scottknott" "snk" "split2.crd" "split2.rbd" "tapply.stat"
## [26] "tukey"
## Factorial (2 factors) in complete randomized design.
with(da, fat2.crd(factor1=isol, factor2=temp, resp=y,
quali=c(TRUE, TRUE), mcomp="tukey"))
## ------------------------------------------------------------------------
## Legend:
## FACTOR 1: F1
## FACTOR 2: F2
## ------------------------------------------------------------------------
##
##
## Analysis of Variance Table
## ------------------------------------------------------------------------
## DF SS MS Fc Pr>Fc
## F1 3 453.61 151.203 40.066 0.00000
## F2 2 2.44 1.222 0.324 0.72471
## F1*F2 6 38.54 6.423 1.702 0.13619
## Residuals 60 226.43 3.774
## Total 71 721.02
## ------------------------------------------------------------------------
## CV = 35.19 %
##
## ------------------------------------------------------------------------
## Shapiro-Wilk normality test
## p-value: 0.4915693
## According to Shapiro-Wilk normality test at 5% of significance, residuals can be considered normal.
## ------------------------------------------------------------------------
##
## Not significant interaction: analyzing the simple effect
## ------------------------------------------------------------------------
## F1
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a 4 9.038889
## b 3 6.511111
## c 1 4.183333
## d 2 2.35
## ------------------------------------------------------------------------
##
## F2
## According to the F test, the means of this factor are statistical equal.
## Levels Means
## 1 1 5.620833
## 2 2 5.679167
## 3 3 5.262500
## ------------------------------------------------------------------------
## E se temperatura for considerada como numérica? Se for declarado
## efeito linear para ela?
da$tmp <- as.numeric(as.character(da$temp))
m2 <- lm(y~isol*tmp, data=da)
## Tem falta de ajuste?
anova(m2, m0)
## Analysis of Variance Table
##
## Model 1: y ~ isol * tmp
## Model 2: y ~ isol * temp
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 64 228.56
## 2 60 226.43 4 2.1306 0.1411 0.9662
## Quadro de anova.
anova(m2)
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## isol 3 453.61 151.203 42.3385 3.375e-15 ***
## tmp 1 1.54 1.541 0.4315 0.51363
## isol:tmp 3 37.31 12.436 3.4822 0.02081 *
## Residuals 64 228.56 3.571
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Estimativas dos efeitos/coeficientes.
summary(m2)
##
## Call:
## lm(formula = y ~ isol * tmp, data = da)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0028 -1.1222 0.1014 1.1743 4.2806
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.0500 1.1785 5.134 2.87e-06 ***
## isol2 -1.5667 1.6666 -0.940 0.3507
## isol3 -1.7222 1.6666 -1.033 0.3053
## isol4 2.6056 1.6666 1.563 0.1229
## tmp -0.9333 0.5455 -1.711 0.0919 .
## isol2:tmp -0.1333 0.7715 -0.173 0.8633
## isol3:tmp 2.0250 0.7715 2.625 0.0108 *
## isol4:tmp 1.1250 0.7715 1.458 0.1497
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.89 on 64 degrees of freedom
## Multiple R-squared: 0.683, Adjusted R-squared: 0.6483
## F-statistic: 19.7 on 7 and 64 DF, p-value: 8.592e-14
## Valores preditos.
da$ypred <- predict(m2)
## Obsevados vs preditos.
xyplot(y~temp, groups=isol, data=da,
auto.key=list(columns=nlevels(da$isol)))+
as.layer(
xyplot(ypred~temp, groups=isol, data=da, type="l")
)
## Quais as inclinações que diferem de zero?
m3 <- lm(y~0+isol/tmp, data=da)
summary(m3)
##
## Call:
## lm(formula = y ~ 0 + isol/tmp, data = da)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0028 -1.1222 0.1014 1.1743 4.2806
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## isol1 6.0500 1.1785 5.134 2.87e-06 ***
## isol2 4.4833 1.1785 3.804 0.000320 ***
## isol3 4.3278 1.1785 3.672 0.000492 ***
## isol4 8.6556 1.1785 7.345 4.61e-10 ***
## isol1:tmp -0.9333 0.5455 -1.711 0.091950 .
## isol2:tmp -1.0667 0.5455 -1.955 0.054921 .
## isol3:tmp 1.0917 0.5455 2.001 0.049626 *
## isol4:tmp 0.1917 0.5455 0.351 0.726489
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.89 on 64 degrees of freedom
## Multiple R-squared: 0.9216, Adjusted R-squared: 0.9118
## F-statistic: 94.05 on 8 and 64 DF, p-value: < 2.2e-16