Capítulo 19 Análise conjunta de experimentos
Atenção: as análises nesse capítulo estão considerando apenas modelos de efeitos fixos. Posteriormente serão incluídas análises com modelos de efeitos mistos.
rm(list = objects())
library(agricolae) # HSD.test().
library(emmeans) # emmeans().
library(multcomp) # glht() e métodos.
library(tidyverse) # Manipulação e visualização.
# Funções.
source("mpaer_functions.R")
19.1 Experimentos em delineamento inteiramente casualizado
Os dados em RamalhoEx8.1
são da produção de grãos (kg/ha) obtidos na avaliação de cultivares de arroz conduzidos em três locais no Estado de Minas Gerais. O experimento avaliou 10 cultivares em delineamento inteiramente casualizado com 3 repetições em cada local.
19.1.1 Análise exploratória
# github.com/pet-estatistica/labestData/blob/devel/data-raw/RamalhoEx8.1.txt
# help(RamalhoEx8.1, package = "labestData")
da <- labestData::RamalhoEx8.1
da$prod <- da$prod/1000
da$rept <- factor(da$rept)
str(da)
## 'data.frame': 90 obs. of 4 variables:
## $ cult : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ local: Factor w/ 3 levels "Felixlandia",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ rept : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ prod : num 4.89 4.17 5.62 4.58 4.31 ...
xtabs(~local + cult, data = da)
## cult
## local 1 2 3 4 5 6 7 8 9 10
## Felixlandia 3 3 3 3 3 3 3 3 3 3
## Lambari 3 3 3 3 3 3 3 3 3 3
## Lavras 3 3 3 3 3 3 3 3 3 3
ggplot(data = da,
mapping = aes(x = cult, y = prod)) +
facet_wrap(facets = ~local, ncol = 1) +
geom_point() +
stat_summary(mapping = aes(group = 1),
geom = "line",
fun.y = "mean")
19.1.2 Análises individuais
da_local <- split(da, f = da$local)
# Análise para cada local.
m0_local <- lapply(da_local,
FUN = function(data) {
lm(prod ~ cult, data = data)
})
# Gráficos de normalidade.
par(mfrow = c(1, 3))
sapply(m0_local, FUN = plot, which = 2)
## $Felixlandia
## NULL
##
## $Lambari
## NULL
##
## $Lavras
## NULL
layout(1)
# Quadrados médios.
sapply(m0_local, FUN = function(m0) deviance(m0)/df.residual(m0))
## Felixlandia Lambari Lavras
## 0.5831171 0.4785143 0.2096028
# Quadro de análise de variância.
lapply(m0_local, FUN = anova)
## $Felixlandia
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## cult 9 9.8681 1.09645 1.8803 0.1149
## Residuals 20 11.6623 0.58312
##
## $Lambari
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## cult 9 6.4959 0.72176 1.5083 0.2119
## Residuals 20 9.5703 0.47851
##
## $Lavras
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## cult 9 17.5645 1.9516 9.311 1.97e-05 ***
## Residuals 20 4.1921 0.2096
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Teste de Tukey.
tk <- lapply(m0_local,
FUN = function(m0) {
tb <- HSD.test(m0, trt = "cult")$groups
tb$groups <- trimws(as.character(tb$groups))
cbind(cult = rownames(tb), tb)
})
tk
## $Felixlandia
## cult prod groups
## 5 5 5.874000 a
## 7 7 5.096000 a
## 1 1 5.082667 a
## 9 9 4.804667 a
## 6 6 4.679667 a
## 8 8 4.346667 a
## 10 10 4.235333 a
## 4 4 4.055000 a
## 3 3 4.046667 a
## 2 2 4.013333 a
##
## $Lambari
## cult prod groups
## 3 3 4.742333 a
## 2 2 4.686667 a
## 1 1 4.507000 a
## 5 5 4.283667 a
## 9 9 3.929667 a
## 8 8 3.846000 a
## 7 7 3.783667 a
## 4 4 3.769667 a
## 10 10 3.610333 a
## 6 6 3.263333 a
##
## $Lavras
## cult prod groups
## 1 1 5.600667 a
## 9 9 5.583333 a
## 4 4 5.222333 ab
## 10 10 4.597333 ab
## 5 5 4.517667 ab
## 7 7 4.427333 ab
## 2 2 4.024333 bc
## 3 3 3.972333 bc
## 8 8 3.923667 bc
## 6 6 3.052000 c
19.1.3 Análise conjunta
A análise conjunta está considerando efeito fixo para local e cultivar.
# Modelo com apenas um estrato para verificar pressupostos.
m0 <- lm(terms(prod ~ local + local:rept + cult + local:cult,
keep.order = TRUE),
data = da)
par(mfrow = c(2, 2))
plot(m0)
layout(1)
# Modelo com dois estratos.
m1 <- aov(prod ~ local + Error(local:rept) + cult + local:cult,
data = da)
# Quadro de anova.
summary(m1)
##
## Error: local:rept
## Df Sum Sq Mean Sq F value Pr(>F)
## local 2 5.574 2.7869 2.991 0.126
## Residuals 6 5.590 0.9317
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## cult 9 14.43 1.6036 4.366 0.000261 ***
## local:cult 18 19.50 1.0831 2.949 0.001111 **
## Residuals 54 19.84 0.3673
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Médias marginais ajustadas por local.
emm <- emmeans(m1, specs = ~cult | local)
## Note: re-fitting model with sum-to-zero contrasts
emm
## local = Felixlandia:
## cult emmean SE df lower.CL upper.CL
## 1 5.08 0.376 51.7 4.33 5.84
## 2 4.01 0.376 51.7 3.26 4.77
## 3 4.05 0.376 51.7 3.29 4.80
## 4 4.05 0.376 51.7 3.30 4.81
## 5 5.87 0.376 51.7 5.12 6.63
## 6 4.68 0.376 51.7 3.93 5.43
## 7 5.10 0.376 51.7 4.34 5.85
## 8 4.35 0.376 51.7 3.59 5.10
## 9 4.80 0.376 51.7 4.05 5.56
## 10 4.24 0.376 51.7 3.48 4.99
##
## local = Lambari:
## cult emmean SE df lower.CL upper.CL
## 1 4.51 0.376 51.7 3.75 5.26
## 2 4.69 0.376 51.7 3.93 5.44
## 3 4.74 0.376 51.7 3.99 5.50
## 4 3.77 0.376 51.7 3.02 4.52
## 5 4.28 0.376 51.7 3.53 5.04
## 6 3.26 0.376 51.7 2.51 4.02
## 7 3.78 0.376 51.7 3.03 4.54
## 8 3.85 0.376 51.7 3.09 4.60
## 9 3.93 0.376 51.7 3.18 4.68
## 10 3.61 0.376 51.7 2.86 4.36
##
## local = Lavras:
## cult emmean SE df lower.CL upper.CL
## 1 5.60 0.376 51.7 4.85 6.35
## 2 4.02 0.376 51.7 3.27 4.78
## 3 3.97 0.376 51.7 3.22 4.73
## 4 5.22 0.376 51.7 4.47 5.98
## 5 4.52 0.376 51.7 3.76 5.27
## 6 3.05 0.376 51.7 2.30 3.81
## 7 4.43 0.376 51.7 3.67 5.18
## 8 3.92 0.376 51.7 3.17 4.68
## 9 5.58 0.376 51.7 4.83 6.34
## 10 4.60 0.376 51.7 3.84 5.35
##
## Warning: EMMs are biased unless design is perfectly balanced
## Confidence level used: 0.95
# Testes de Tukey por local da análise conjunta.
# ATTENTION: assume balanceamento.
tk <-
lapply(da_local,
FUN = function(data) {
rdf <- df.residual(m0)
rms <- deviance(m0)/rdf
tb <- HSD.test(y = data$prod,
trt = data$cult,
DFerror = rdf,
MSerror = rms)
tb <- tb$groups
tb$groups <- trimws(as.character(tb$groups))
names(tb)[1] <- "prod"
cbind(cult = rownames(tb), tb,
stringsAsFactors = FALSE)
})
# tk
# Junta para ter os intervalos de confiança.
tk <- bind_rows(tk, .id = "local")
tk <- inner_join(as.data.frame(emm), tk,
by = c("cult", "local"))
tk[, c(1, 2, 8, 6:7, 9)]
## cult local prod lower.CL upper.CL groups
## 1 1 Felixlandia 5.082667 4.328418 5.836915 ab
## 2 2 Felixlandia 4.013333 3.259085 4.767582 b
## 3 3 Felixlandia 4.046667 3.292418 4.800915 b
## 4 4 Felixlandia 4.055000 3.300752 4.809248 b
## 5 5 Felixlandia 5.874000 5.119752 6.628248 a
## 6 6 Felixlandia 4.679667 3.925418 5.433915 ab
## 7 7 Felixlandia 5.096000 4.341752 5.850248 ab
## 8 8 Felixlandia 4.346667 3.592418 5.100915 ab
## 9 9 Felixlandia 4.804667 4.050418 5.558915 ab
## 10 10 Felixlandia 4.235333 3.481085 4.989582 b
## 11 1 Lambari 4.507000 3.752752 5.261248 a
## 12 2 Lambari 4.686667 3.932418 5.440915 a
## 13 3 Lambari 4.742333 3.988085 5.496582 a
## 14 4 Lambari 3.769667 3.015418 4.523915 a
## 15 5 Lambari 4.283667 3.529418 5.037915 a
## 16 6 Lambari 3.263333 2.509085 4.017582 a
## 17 7 Lambari 3.783667 3.029418 4.537915 a
## 18 8 Lambari 3.846000 3.091752 4.600248 a
## 19 9 Lambari 3.929667 3.175418 4.683915 a
## 20 10 Lambari 3.610333 2.856085 4.364582 a
## 21 1 Lavras 5.600667 4.846418 6.354915 a
## 22 2 Lavras 4.024333 3.270085 4.778582 abc
## 23 3 Lavras 3.972333 3.218085 4.726582 abc
## 24 4 Lavras 5.222333 4.468085 5.976582 ab
## 25 5 Lavras 4.517667 3.763418 5.271915 abc
## 26 6 Lavras 3.052000 2.297752 3.806248 c
## 27 7 Lavras 4.427333 3.673085 5.181582 abc
## 28 8 Lavras 3.923667 3.169418 4.677915 bc
## 29 9 Lavras 5.583333 4.829085 6.337582 a
## 30 10 Lavras 4.597333 3.843085 5.351582 abc
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = tk,
mapping = aes(x = prod, y = cult)) +
facet_wrap(facets = ~local) +
geom_point() +
geom_errorbarh(mapping = aes(xmin = lower.CL, xmax = upper.CL),
height = 0) +
geom_label(mapping = aes(label = sprintf("%0.2f%s", prod, groups)),
label.padding = unit(0.15, "lines"),
size = 3,
vjust = -0.25) +
expand_limits(y = c(NA, nlevels(da$cult) + 1)) +
labs(x = "Produção",
y = "Cultivares")
19.2 Experimentos em delineamento de blocos completos
Os dados em BanzattoQd8.2.1
são referentes a um grupo de 4 ensaios de competição de 10 cultivares de batata que foram instalados no delineamento de blocos casualizados com 4 repetições. A variável resposta é a produção de tubérculos.
19.2.1 Análise exploratória
# github.com/pet-estatistica/labestData/blob/devel/data-raw/BanzattoQd8.2.1.txt
# help(BanzattoQd8.2.1, package = "labestData")
da <- labestData::BanzattoQd8.2.1
str(da)
## 'data.frame': 160 obs. of 4 variables:
## $ exper: Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ bloco: Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ cult : Factor w/ 10 levels "Achat","AN-3",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ prod : num 17.2 29.3 37.1 29 27.5 ...
xtabs(~exper + cult, data = da)
## cult
## exper Achat AN-3 Apuã Baronesa Bintje Carola Elipsa Matilda Ômega
## 1 4 4 4 4 4 4 4 4 4
## 2 4 4 4 4 4 4 4 4 4
## 3 4 4 4 4 4 4 4 4 4
## 4 4 4 4 4 4 4 4 4 4
## cult
## exper Radosa
## 1 4
## 2 4
## 3 4
## 4 4
ggplot(data = da,
mapping = aes(x = cult, y = prod, color = bloco)) +
facet_wrap(facets = ~exper, ncol = 1) +
geom_point() +
geom_line(mapping = aes(group = bloco),
color = "gray") +
stat_summary(mapping = aes(group = 1),
geom = "line",
fun.y = "mean")
19.2.2 Análises individuais
da_exper <- split(da, f = da$exper)
# Análise para cada exper.
m0_exper <- lapply(da_exper,
FUN = function(data) {
lm(prod ~ bloco + cult, data = data)
})
# Gráficos de normalidade.
par(mfrow = c(2, 2))
sapply(m0_exper, FUN = plot, which = 2)
## $`1`
## NULL
##
## $`2`
## NULL
##
## $`3`
## NULL
##
## $`4`
## NULL
layout(1)
# Quadrados médios.
sapply(m0_exper, FUN = function(m0) deviance(m0)/df.residual(m0))
## 1 2 3 4
## 8.696262 27.931909 21.219884 38.139726
# Quadro de análise de variância.
lapply(m0_exper, FUN = anova)
## $`1`
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 146.40 48.799 5.6115 0.004007 **
## cult 9 882.84 98.094 11.2800 4.405e-07 ***
## Residuals 27 234.80 8.696
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $`2`
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 533.99 177.996 6.3725 0.002086 **
## cult 9 628.63 69.848 2.5007 0.031637 *
## Residuals 27 754.16 27.932
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $`3`
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 442.18 147.39 6.9460 0.001299 **
## cult 9 1198.69 133.19 6.2765 9.132e-05 ***
## Residuals 27 572.94 21.22
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $`4`
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 587.29 195.76 5.1328 0.006136 **
## cult 9 1181.95 131.33 3.4433 0.006051 **
## Residuals 27 1029.77 38.14
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Teste de Tukey.
tk <- lapply(m0_exper,
FUN = function(m0) {
tb <- HSD.test(m0, trt = "cult")$groups
tb$groups <- trimws(as.character(tb$groups))
tb <- cbind(cult = rownames(tb), tb)
rownames(tb) <- NULL
return(tb)
})
tk
## $`1`
## cult prod groups
## 1 Apuã 35.1975 a
## 2 Ômega 30.6125 ab
## 3 Elipsa 29.8800 ab
## 4 Baronesa 29.5525 ab
## 5 Carola 27.2425 bc
## 6 Bintje 25.7525 bc
## 7 Radosa 24.6725 bcd
## 8 AN-3 24.2150 bcd
## 9 Matilda 21.4525 cd
## 10 Achat 17.9850 d
##
## $`2`
## cult prod groups
## 1 Baronesa 40.0025 a
## 2 Achat 39.8250 a
## 3 Ômega 38.8700 a
## 4 Elipsa 37.3175 a
## 5 Carola 36.4025 a
## 6 Apuã 36.1225 a
## 7 Matilda 33.7375 a
## 8 Bintje 30.7675 a
## 9 AN-3 30.4850 a
## 10 Radosa 28.2400 a
##
## $`3`
## cult prod groups
## 1 Achat 41.6250 a
## 2 Apuã 38.9250 ab
## 3 Ômega 36.9300 abc
## 4 Elipsa 36.6000 abc
## 5 Baronesa 33.1175 abcd
## 6 Matilda 30.7325 abcd
## 7 Carola 29.0800 bcd
## 8 Bintje 28.4050 bcd
## 9 AN-3 27.2275 cd
## 10 Radosa 23.6075 d
##
## $`4`
## cult prod groups
## 1 Apuã 48.0050 a
## 2 Achat 37.9600 ab
## 3 Baronesa 37.1400 ab
## 4 Ômega 35.9275 ab
## 5 Carola 34.6975 ab
## 6 AN-3 32.2825 b
## 7 Bintje 31.3750 b
## 8 Elipsa 30.7425 b
## 9 Matilda 29.5475 b
## 10 Radosa 28.2675 b
19.2.3 Análise conjunta
A análise conjunta está considerando efeito fixo para experimento, bloco e cultivar.
Atenção: esteja ciente de que a maior variância residual (experimento 4) é quase 5 vezes maior que a menor variância (experimento 1).
# Modelo com apenas um estrato para verificar pressupostos.
m0 <- lm(terms(prod ~ exper + exper/bloco + cult + exper:cult,
keep.order = TRUE),
data = da)
par(mfrow = c(2, 2))
plot(m0)
layout(1)
# Modelo com dois estratos.
m1 <- aov(prod ~ exper + Error(exper:bloco) + cult + exper:cult,
data = da)
# Quadro de anova.
summary(m1)
##
## Error: exper:bloco
## Df Sum Sq Mean Sq F value Pr(>F)
## exper 3 1820 606.6 4.257 0.0289 *
## Residuals 12 1710 142.5
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## cult 9 2403 267.04 11.128 3.89e-12 ***
## exper:cult 27 1489 55.14 2.298 0.00137 **
## Residuals 108 2592 24.00
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Médias marginais ajustadas por exper.
emm <- emmeans(m1, specs = ~cult | exper)
## Note: re-fitting model with sum-to-zero contrasts
emm
## exper = 1:
## cult emmean SE df lower.CL upper.CL
## Achat 18.0 2.99 60.5 12.0 24.0
## AN-3 24.2 2.99 60.5 18.2 30.2
## Apuã 35.2 2.99 60.5 29.2 41.2
## Baronesa 29.6 2.99 60.5 23.6 35.5
## Bintje 25.8 2.99 60.5 19.8 31.7
## Carola 27.2 2.99 60.5 21.3 33.2
## Elipsa 29.9 2.99 60.5 23.9 35.9
## Matilda 21.5 2.99 60.5 15.5 27.4
## Ômega 30.6 2.99 60.5 24.6 36.6
## Radosa 24.7 2.99 60.5 18.7 30.7
##
## exper = 2:
## cult emmean SE df lower.CL upper.CL
## Achat 39.8 2.99 60.5 33.8 45.8
## AN-3 30.5 2.99 60.5 24.5 36.5
## Apuã 36.1 2.99 60.5 30.1 42.1
## Baronesa 40.0 2.99 60.5 34.0 46.0
## Bintje 30.8 2.99 60.5 24.8 36.8
## Carola 36.4 2.99 60.5 30.4 42.4
## Elipsa 37.3 2.99 60.5 31.3 43.3
## Matilda 33.7 2.99 60.5 27.8 39.7
## Ômega 38.9 2.99 60.5 32.9 44.9
## Radosa 28.2 2.99 60.5 22.3 34.2
##
## exper = 3:
## cult emmean SE df lower.CL upper.CL
## Achat 41.6 2.99 60.5 35.6 47.6
## AN-3 27.2 2.99 60.5 21.2 33.2
## Apuã 38.9 2.99 60.5 32.9 44.9
## Baronesa 33.1 2.99 60.5 27.1 39.1
## Bintje 28.4 2.99 60.5 22.4 34.4
## Carola 29.1 2.99 60.5 23.1 35.1
## Elipsa 36.6 2.99 60.5 30.6 42.6
## Matilda 30.7 2.99 60.5 24.7 36.7
## Ômega 36.9 2.99 60.5 30.9 42.9
## Radosa 23.6 2.99 60.5 17.6 29.6
##
## exper = 4:
## cult emmean SE df lower.CL upper.CL
## Achat 38.0 2.99 60.5 32.0 43.9
## AN-3 32.3 2.99 60.5 26.3 38.3
## Apuã 48.0 2.99 60.5 42.0 54.0
## Baronesa 37.1 2.99 60.5 31.2 43.1
## Bintje 31.4 2.99 60.5 25.4 37.4
## Carola 34.7 2.99 60.5 28.7 40.7
## Elipsa 30.7 2.99 60.5 24.8 36.7
## Matilda 29.5 2.99 60.5 23.6 35.5
## Ômega 35.9 2.99 60.5 29.9 41.9
## Radosa 28.3 2.99 60.5 22.3 34.3
##
## Warning: EMMs are biased unless design is perfectly balanced
## Confidence level used: 0.95
# Testes de Tukey por exper da análise conjunta.
# ATTENTION: assume balanceamento.
tk <-
lapply(da_exper,
FUN = function(data) {
rdf <- df.residual(m0)
rms <- deviance(m0)/rdf
tb <- HSD.test(y = data$prod,
trt = data$cult,
DFerror = rdf,
MSerror = rms)
tb <- tb$groups
tb$groups <- trimws(as.character(tb$groups))
names(tb)[1] <- "prod"
cbind(cult = rownames(tb), tb,
stringsAsFactors = FALSE)
})
# tk
# Junta para ter os intervalos de confiança.
tk <- bind_rows(tk, .id = "exper")
tk <- inner_join(as.data.frame(emm), tk,
by = c("cult", "exper"))
tk[, c(1, 2, 8, 6:7, 9)] %>%
arrange(exper, desc(prod))
## cult exper prod lower.CL upper.CL groups
## 1 Apuã 1 35.1975 29.21047 41.18453 a
## 2 Ômega 1 30.6125 24.62547 36.59953 ab
## 3 Elipsa 1 29.8800 23.89297 35.86703 ab
## 4 Baronesa 1 29.5525 23.56547 35.53953 ab
## 5 Carola 1 27.2425 21.25547 33.22953 abc
## 6 Bintje 1 25.7525 19.76547 31.73953 abc
## 7 Radosa 1 24.6725 18.68547 30.65953 abc
## 8 AN-3 1 24.2150 18.22797 30.20203 abc
## 9 Matilda 1 21.4525 15.46547 27.43953 bc
## 10 Achat 1 17.9850 11.99797 23.97203 c
## 11 Baronesa 2 40.0025 34.01547 45.98953 a
## 12 Achat 2 39.8250 33.83797 45.81203 a
## 13 Ômega 2 38.8700 32.88297 44.85703 ab
## 14 Elipsa 2 37.3175 31.33047 43.30453 ab
## 15 Carola 2 36.4025 30.41547 42.38953 ab
## 16 Apuã 2 36.1225 30.13547 42.10953 ab
## 17 Matilda 2 33.7375 27.75047 39.72453 ab
## 18 Bintje 2 30.7675 24.78047 36.75453 ab
## 19 AN-3 2 30.4850 24.49797 36.47203 ab
## 20 Radosa 2 28.2400 22.25297 34.22703 b
## 21 Achat 3 41.6250 35.63797 47.61203 a
## 22 Apuã 3 38.9250 32.93797 44.91203 ab
## 23 Ômega 3 36.9300 30.94297 42.91703 abc
## 24 Elipsa 3 36.6000 30.61297 42.58703 abc
## 25 Baronesa 3 33.1175 27.13047 39.10453 abcd
## 26 Matilda 3 30.7325 24.74547 36.71953 abcd
## 27 Carola 3 29.0800 23.09297 35.06703 bcd
## 28 Bintje 3 28.4050 22.41797 34.39203 bcd
## 29 AN-3 3 27.2275 21.24047 33.21453 cd
## 30 Radosa 3 23.6075 17.62047 29.59453 d
## 31 Apuã 4 48.0050 42.01797 53.99203 a
## 32 Achat 4 37.9600 31.97297 43.94703 ab
## 33 Baronesa 4 37.1400 31.15297 43.12703 ab
## 34 Ômega 4 35.9275 29.94047 41.91453 b
## 35 Carola 4 34.6975 28.71047 40.68453 b
## 36 AN-3 4 32.2825 26.29547 38.26953 b
## 37 Bintje 4 31.3750 25.38797 37.36203 b
## 38 Elipsa 4 30.7425 24.75547 36.72953 b
## 39 Matilda 4 29.5475 23.56047 35.53453 b
## 40 Radosa 4 28.2675 22.28047 34.25453 b
# NOTE: para ordenar os níveis de cultivar dentro de cada experimento.
tk <- tk %>%
mutate(combo = {
f <- interaction(exper, cult, drop = TRUE)
reorder(f, prod)
})
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = tk,
mapping = aes(x = combo, y = prod)) +
facet_wrap(facets = ~exper,
nrow = 1,
scales = "free_x") +
geom_point() +
geom_errorbar(mapping = aes(ymin = lower.CL, ymax = upper.CL),
width = 0) +
scale_x_discrete(breaks = levels(tk$combo),
labels = gsub("^.*\\.", "", levels(tk$combo))) +
geom_text(mapping = aes(label = sprintf("%0.1f %s", prod, groups)),
size = 3,
angle = 90,
vjust = -0.5) +
labs(y = "Produção",
x = "Cultivares") +
expand_limits(x = c(-0.5, NA)) +
theme(axis.text.x = element_text(angle = 90,
vjust = 0.5,
hjust = 1))
19.3 Experimentos com tratamentos comuns
# github.com/pet-estatistica/labestData/blob/devel/data-raw/ZimmermannTb12.19.txt
# help(ZimmermannTb12.19, package = "labestData")
da <- rbind(cbind(labestData::ZimmermannTb12.19, exper = 1),
cbind(labestData::ZimmermannTb12.20, exper = 2))
da$exper <- factor(da$exper)
da$prod <- da$prod/1000
str(da)
## 'data.frame': 72 obs. of 4 variables:
## $ cult : Factor w/ 15 levels "CNFP 8015","CNFP 8016",..: 1 2 3 4 5 6 7 8 9 1 ...
## $ bloco: Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 2 ...
## $ prod : num 3.7 3.6 3.92 3.88 4.2 ...
## $ exper: Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...
xtabs(~cult + exper, data = da)
## exper
## cult 1 2
## CNFP 8015 4 0
## CNFP 8016 4 0
## CNFP 8017 4 0
## CNFP 8018 4 0
## CNFP 8019 4 0
## CNFP 8020 4 0
## Diamante Negro 4 4
## FT Nobre 4 4
## G. Brilhante 4 4
## CNFP 8021 0 4
## CNFP 8022 0 4
## CNFP 8023 0 4
## CNFP 8024 0 4
## CNFP 8025 0 4
## CNFP 8026 0 4
ggplot(data = da,
mapping = aes(x = cult, y = prod, color = bloco)) +
facet_wrap(facets = ~exper, ncol = 1) +
geom_point() +
geom_line(mapping = aes(group = bloco),
color = "gray") +
stat_summary(mapping = aes(group = 1),
geom = "line",
fun.y = "mean") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
19.3.1 Análises individuais
da_exper <- split(da, f = da$exper)
# Análise para cada exper.
m0_exper <- lapply(da_exper,
FUN = function(data) {
lm(prod ~ bloco + cult, data = data)
})
# Gráficos de normalidade.
par(mfrow = c(1, 2))
sapply(m0_exper, FUN = plot, which = 2)
## $`1`
## NULL
##
## $`2`
## NULL
layout(1)
# Quadrados médios.
sapply(m0_exper, FUN = function(m0) deviance(m0)/df.residual(m0))
## 1 2
## 0.2563194 0.1899621
# Quadro de análise de variância.
lapply(m0_exper, FUN = anova)
## $`1`
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 1.3096 0.43653 1.7031 0.19305
## cult 8 4.0035 0.50043 1.9524 0.09805 .
## Residuals 24 6.1517 0.25632
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $`2`
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 1.4150 0.47168 2.4830 0.08515 .
## cult 8 4.8013 0.60017 3.1594 0.01369 *
## Residuals 24 4.5591 0.18996
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Teste de Tukey.
tk <- lapply(m0_exper,
FUN = function(m0) {
tb <- HSD.test(m0, trt = "cult")$groups
tb$groups <- trimws(as.character(tb$groups))
tb <- cbind(cult = rownames(tb), tb)
rownames(tb) <- NULL
return(tb)
})
tk
## $`1`
## cult prod groups
## 1 FT Nobre 4.49375 a
## 2 CNFP 8020 3.92500 a
## 3 CNFP 8018 3.88125 a
## 4 CNFP 8019 3.69375 a
## 5 CNFP 8015 3.66250 a
## 6 G. Brilhante 3.63750 a
## 7 CNFP 8016 3.47500 a
## 8 Diamante Negro 3.44375 a
## 9 CNFP 8017 3.28750 a
##
## $`2`
## cult prod groups
## 1 FT Nobre 3.250000 a
## 2 CNFP 8021 3.095140 a
## 3 CNFP 8024 2.840275 ab
## 4 CNFP 8022 2.769443 ab
## 5 CNFP 8026 2.681253 ab
## 6 G. Brilhante 2.553473 ab
## 7 CNFP 8023 2.436808 ab
## 8 CNFP 8025 2.405558 ab
## 9 Diamante Negro 1.958335 b
19.3.2 Análise conjunta
A análise conjunta está considerando efeito fixo para experimento, bloco e cultivar.
# Modelo com apenas um estrato para verificar pressupostos.
m0 <- lm(terms(prod ~ exper + exper/bloco + cult + exper:cult,
keep.order = TRUE),
data = da)
par(mfrow = c(2, 2))
plot(m0)
layout(1)
# Modelo com dois estratos.
m1 <- aov(prod ~ exper + Error(exper:bloco) + cult + exper:cult,
data = da)
# Quadro de anova.
summary(m1)
##
## Error: exper:bloco
## Df Sum Sq Mean Sq F value Pr(>F)
## exper 1 20.097 20.097 44.26 0.000557 ***
## Residuals 6 2.725 0.454
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## cult 14 8.641 0.6172 2.766 0.00444 **
## exper:cult 2 0.163 0.0817 0.366 0.69540
## Residuals 48 10.711 0.2231
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Abandona a interação não significativa para ter todos os efeitos
# estimados.
m1 <- aov(prod ~ exper + Error(exper:bloco) + cult,
data = da)
# Médias marginais ajustadas do modelo de 2 estratos.
# emm <- emmeans(m1, specs = ~cult)
# as.data.frame(emm)
# Volta para o modelo de um estrato.
m0 <- lm(prod ~ exper + exper:bloco + cult,
data = da)
emm <- emmeans(m0, specs = ~cult)
## NOTE: A nesting structure was detected in the fitted model:
## bloco %in% exper
as.data.frame(emm)
## cult emmean SE df lower.CL upper.CL
## 1 CNFP 8015 3.026968 0.2518577 50 2.521097 3.532839
## 2 CNFP 8016 2.839468 0.2518577 50 2.333597 3.345339
## 3 CNFP 8017 2.651968 0.2518577 50 2.146097 3.157839
## 4 CNFP 8018 3.245718 0.2518577 50 2.739847 3.751589
## 5 CNFP 8019 3.058218 0.2518577 50 2.552347 3.564089
## 6 CNFP 8020 3.289468 0.2518577 50 2.783597 3.795339
## 7 Diamante Negro 2.701042 0.1648796 50 2.369872 3.032213
## 8 FT Nobre 3.871875 0.1648796 50 3.540705 4.203045
## 9 G. Brilhante 3.095486 0.1648796 50 2.764316 3.426657
## 10 CNFP 8021 3.730672 0.2518577 50 3.224801 4.236543
## 11 CNFP 8022 3.404975 0.2518577 50 2.899104 3.910846
## 12 CNFP 8023 3.072340 0.2518577 50 2.566469 3.578211
## 13 CNFP 8024 3.475807 0.2518577 50 2.969936 3.981678
## 14 CNFP 8025 3.041090 0.2518577 50 2.535219 3.546961
## 15 CNFP 8026 3.316785 0.2518577 50 2.810914 3.822656
grid <- attr(emm, "grid")
L <- attr(emm, "linfct")
rownames(L) <- grid[[1]]
# glht(m0, linfct = mcp(cult = "Tukey"))
results <- wzRfun::apmc(L,
model = m0,
focus = "cult",
test = "fdr") %>%
mutate(cld = wzRfun::ordered_cld(let = cld, means = fit))
results
## cult fit lwr upr cld
## 1 CNFP 8015 3.026968 2.521097 3.532839 ac
## 2 CNFP 8016 2.839468 2.333597 3.345339 bc
## 3 CNFP 8017 2.651968 2.146097 3.157839 bc
## 4 CNFP 8018 3.245718 2.739847 3.751589 ac
## 5 CNFP 8019 3.058218 2.552347 3.564089 ac
## 6 CNFP 8020 3.289468 2.783597 3.795339 ac
## 7 Diamante Negro 2.701042 2.369872 3.032213 c
## 8 FT Nobre 3.871875 3.540705 4.203045 a
## 9 G. Brilhante 3.095486 2.764316 3.426657 bc
## 10 CNFP 8021 3.730672 3.224801 4.236543 ab
## 11 CNFP 8022 3.404975 2.899104 3.910846 ac
## 12 CNFP 8023 3.072340 2.566469 3.578211 ac
## 13 CNFP 8024 3.475807 2.969936 3.981678 ac
## 14 CNFP 8025 3.041090 2.535219 3.546961 ac
## 15 CNFP 8026 3.316785 2.810914 3.822656 ac
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results,
mapping = aes(x = reorder(cult, fit), y = fit)) +
geom_point() +
geom_errorbar(mapping = aes(ymin = lwr, ymax = upr),
width = 0) +
geom_text(mapping = aes(label = sprintf("%0.2f %s", fit, cld)),
angle = 90,
vjust = -0.5) +
labs(y = "Produção",
x = "Cultivares") +
expand_limits(x = c(-0.5, NA)) +
theme(axis.text.x = element_text(angle = 90,
vjust = 0.5,
hjust = 1))
19.4 Experimentos ao longo do tempo
TODO as ser feito: experimento em várias safras. E em vários locais e safras.
ATTENTION: essa análise precisa ser refeita nos moldes de uma análise de experimento de medidas repetidas pois, visto que a cultura é perene, a mesma unidade experimental é medida ao longo do tempo. Se fosse uma cultura anual, cada safra seria um novo cultivo onde as unidades poderiam ser todas diferentes e o experimento ser em outras instalações/condições. Poderia ser considerado medida repetida apenas se as mesmas parcelas recebessem os mesmos tratamentos ao longo do tempo na mesma área experimental.
# github.com/pet-estatistica/labestData/blob/devel/data-raw/RamalhoTb8.12.txt
# help(RamalhoTb8.12, package = "labestData")
da <- labestData::RamalhoTb8.12
str(da)
## 'data.frame': 120 obs. of 4 variables:
## $ prog: Factor w/ 10 levels "1","2","3","4",..: 1 1 1 2 2 2 3 3 3 4 ...
## $ ano : Ord.factor w/ 3 levels "1"<"2"<"3": 1 2 3 1 2 3 1 2 3 1 ...
## $ bloc: Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ prod: num 4.3 7.62 3.11 13.2 7.7 ...
xtabs(~ano + prog, data = da)
## prog
## ano 1 2 3 4 5 6 7 8 9 10
## 1 4 4 4 4 4 4 4 4 4 4
## 2 4 4 4 4 4 4 4 4 4 4
## 3 4 4 4 4 4 4 4 4 4 4
ggplot(data = da,
mapping = aes(x = prog, y = prod, color = bloc)) +
facet_wrap(facets = ~ano, ncol = 1) +
geom_point() +
geom_line(mapping = aes(group = bloc),
color = "gray") +
stat_summary(mapping = aes(group = 1),
geom = "line",
fun.y = "mean")
# NOTE: o comportamento bianual de produção de café.
ggplot(data = da,
mapping = aes(x = ano, y = prod)) +
facet_wrap(facets = ~prog, nrow = 1) +
geom_point() +
stat_summary(mapping = aes(group = 1),
geom = "line",
fun.y = "mean")
Manual de Planejamento e Análise de Experimentos com R
Walmes Marques Zeviani