Capítulo 3 Delineamento de Blocos Casualizados
3.1 Motivação
3.2 Ensaio de batatinha em Pimentel
# ATTENTION: Limpa espaço de trabalho.
rm(list = objects())
# Carrega pacotes.
library(agricolae) # HSD.test(), SNK.test().
library(ScottKnott) # SK().
library(car) # linearHypothesis().
library(multcomp) # glht().
library(emmeans) # emmeans().
library(tidyverse)
# Carrega funções.
source("mpaer_functions.R")
# Url de um arquivo com dados.
da <- labestData::PimentelEg5.2
str(da)
## 'data.frame': 32 obs. of 3 variables:
## $ bloco : Factor w/ 4 levels "I","II","III",..: 1 1 1 1 1 1 1 1 2 2 ...
## $ variedade: Factor w/ 8 levels "B 116-51","B 1-52",..: 1 2 3 4 5 6 7 8 1 2 ...
## $ producao : num 23.1 20 12.7 18 15.4 21.1 9.2 22.6 24.2 21.1 ...
# Tabela de frequência.
xtabs(~variedade + bloco, data = da)
## bloco
## variedade I II III IV
## B 116-51 1 1 1 1
## B 1-52 1 1 1 1
## B 25-50 E 1 1 1 1
## B 72-53 A 1 1 1 1
## Buena Vista 1 1 1 1
## Huinkul 1 1 1 1
## Kennebec 1 1 1 1
## S. Rafalela 1 1 1 1
ggplot(data = da,
mapping = aes(x = reorder(variedade, producao),
y = producao,
color = bloco,
group = bloco)) +
geom_point() +
geom_line() +
stat_summary(mapping = aes(group = 1),
geom = "line",
fun.y = "mean")
O modelo estatístico correspondente ao experimento é \[ \begin{aligned} Y | i, j &\sim \text{Normal}(\mu_{ij}, \sigma^2) \\ \mu_{ij} &= \mu + \alpha_i + \tau_j \end{aligned} \] em que \(\alpha_i\) é o efeito do bloco \(i\) e \(\tau_j\) o efeito da variedade \(j\) sobre a variável resposta \(Y\), \(\mu\) é a média de \(Y\) na ausência do efeito de bloco e variedade, \(\mu_{ij}\) é a média para as observações em cada combinação de níveis de bloco e variedade e \(\sigma^2\) é a variância das observações ao redor desse valor médio.
m0 <- lm(producao ~ bloco + variedade, data = da)
# As inferências acima só passam ser valiadas após confirmação de não
# haver afastamento dos pressupostos.
par(mfrow = c(2, 2))
plot(m0)
layout(1)
MASS::boxcox(m0)
# Existe efeito das fontes de variação? Ou seja, todos os \alpha_i podem
# ser considerados iguais à zero? Todos os \tau_j podem ser considerados
# à zero?
# anova(m0)
Anova(m0)
## Anova Table (Type II tests)
##
## Response: producao
## Sum Sq Df F value Pr(>F)
## bloco 50.53 3 1.9709 0.1493
## variedade 919.72 7 15.3744 5.723e-07 ***
## Residuals 179.47 21
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(m0)
##
## Call:
## lm(formula = producao ~ bloco + variedade, data = da)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.2750 -1.6437 0.0625 1.0563 5.6500
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 20.550 1.714 11.990 7.40e-11 ***
## blocoII 3.500 1.462 2.395 0.02605 *
## blocoIII 2.275 1.462 1.556 0.13455
## blocoIV 2.025 1.462 1.385 0.18047
## variedadeB 1-52 -0.225 2.067 -0.109 0.91436
## variedadeB 25-50 E -6.000 2.067 -2.903 0.00851 **
## variedadeB 72-53 A 0.300 2.067 0.145 0.88599
## variedadeBuena Vista -10.075 2.067 -4.874 8.08e-05 ***
## variedadeHuinkul 2.550 2.067 1.234 0.23098
## variedadeKennebec -11.800 2.067 -5.708 1.15e-05 ***
## variedadeS. Rafalela 2.950 2.067 1.427 0.16825
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.923 on 21 degrees of freedom
## Multiple R-squared: 0.8439, Adjusted R-squared: 0.7696
## F-statistic: 11.35 on 10 and 21 DF, p-value: 2.153e-06
# Interpretações sob a restrição paramétrica de zerar o primeiro nível.
contrasts(da$bloc)
## II III IV
## I 0 0 0
## II 1 0 0
## III 0 1 0
## IV 0 0 1
contrasts(da$vari)
## B 1-52 B 25-50 E B 72-53 A Buena Vista Huinkul Kennebec
## B 116-51 0 0 0 0 0 0
## B 1-52 1 0 0 0 0 0
## B 25-50 E 0 1 0 0 0 0
## B 72-53 A 0 0 1 0 0 0
## Buena Vista 0 0 0 1 0 0
## Huinkul 0 0 0 0 1 0
## Kennebec 0 0 0 0 0 1
## S. Rafalela 0 0 0 0 0 0
## S. Rafalela
## B 116-51 0
## B 1-52 0
## B 25-50 E 0
## B 72-53 A 0
## Buena Vista 0
## Huinkul 0
## Kennebec 0
## S. Rafalela 1
# Comparações múltiplas.
# Médias marginais ajustdas.
emm <- emmeans(m0, specs = ~variedade)
emm
## variedade emmean SE df lower.CL upper.CL
## B 116-51 22.5 1.46 21 19.46 25.5
## B 1-52 22.3 1.46 21 19.24 25.3
## B 25-50 E 16.5 1.46 21 13.46 19.5
## B 72-53 A 22.8 1.46 21 19.76 25.8
## Buena Vista 12.4 1.46 21 9.39 15.5
## Huinkul 25.1 1.46 21 22.01 28.1
## Kennebec 10.7 1.46 21 7.66 13.7
## S. Rafalela 25.4 1.46 21 22.41 28.5
##
## Results are averaged over the levels of: bloco
## Confidence level used: 0.95
# Comparações múltiplas, contrastes de Tukey.
# Método de correção de p-valor: false discovey rate.
tk_fdr <- summary(glht(m0, linfct = mcp(variedade = "Tukey")),
test = adjusted(type = "fdr"))
# Resumo compacto com letras.
cld(tk_fdr, decreasing = TRUE)
## B 116-51 B 1-52 B 25-50 E B 72-53 A Buena Vista
## "a" "a" "b" "a" "bc"
## Huinkul Kennebec S. Rafalela
## "a" "c" "a"
# Teste HSD de Tukey.
tk_hsd <- HSD.test(m0, trt = "variedade")
tk_hsd$statistics
## MSerror Df Mean CV MSD
## 8.545952 21 19.7125 14.82991 6.933413
tk_hsd$parameters
## test name.t ntr StudentizedRange alpha
## Tukey variedade 8 4.743477 0.05
results <- tk_hsd$groups %>%
rownames_to_column(var = "variedade") %>%
mutate(groups = str_trim(as.character(groups)))
results <- inner_join(results, as.data.frame(emm))
## Joining, by = "variedade"
results
## variedade producao groups emmean SE df lower.CL upper.CL
## 1 S. Rafalela 25.450 a 25.450 1.461673 21 22.410284 28.48972
## 2 Huinkul 25.050 a 25.050 1.461673 21 22.010284 28.08972
## 3 B 72-53 A 22.800 ab 22.800 1.461673 21 19.760284 25.83972
## 4 B 116-51 22.500 ab 22.500 1.461673 21 19.460284 25.53972
## 5 B 1-52 22.275 ab 22.275 1.461673 21 19.235284 25.31472
## 6 B 25-50 E 16.500 bc 16.500 1.461673 21 13.460284 19.53972
## 7 Buena Vista 12.425 c 12.425 1.461673 21 9.385284 15.46472
## 8 Kennebec 10.700 c 10.700 1.461673 21 7.660284 13.73972
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results,
mapping = aes(x = producao, y = reorder(variedade, producao))) +
geom_point() +
geom_errorbarh(mapping = aes(xmin = lower.CL, xmax = upper.CL),
height = 0) +
geom_text(mapping = aes(label = sprintf("%0.2f %s", producao, groups)),
vjust = 0,
nudge_y = 0.1) +
labs(x = "Produção",
y = "Variedade")
# Teste de ScottKnott.
sk <- SK(x = da,
model = "producao ~ bloco + variedade",
which = "variedade")
# summary(sk)
sk_cls <- data.frame(variedade = rownames(sk$m.inf),
mean = sk$m.inf[, "mean"],
cluster = letters[sk$groups])
inner_join(results, sk_cls) %>%
select(variedade, producao)
## Joining, by = "variedade"
## variedade producao
## 1 S. Rafalela 25.450
## 2 Huinkul 25.050
## 3 B 72-53 A 22.800
## 4 B 116-51 22.500
## 5 B 1-52 22.275
## 6 B 25-50 E 16.500
## 7 Buena Vista 12.425
## 8 Kennebec 10.700
3.3 Peso de frutos
Dados disponíveis em BANZATTO; KRONKA (2013) que são resultados de um experimento instalado na Fazenda Chapadão, no município de Angatuba - SP. O delineamento experimental foi o de blocos casualizados completos, sendo as parcelas constituídas de 4 plantas espaçadas de 6 x 7 metros, com 12 anos de idade na época da instalação do experimento.
O experimento avaliou o efeito do promalim sobre frutos de macieiras. Os tratamentos foram: {0, 12,5; 25,0; 50,0, 12,5 + 12,5} ppm de promalim em plena floração. O último nível teve o complemento de 12,5 no início da frutificação e o primeiro é a testemunha.
# https://github.com/pet-estatistica/labestData/blob/devel/data-raw/BanzattoQd4.5.2.txt
da <- labestData::BanzattoQd4.5.2
summary(da)
## promalin bloco peso
## 12.5 :4 I :5 Min. :130.6
## 25.0 :4 II :5 1st Qu.:136.8
## 50.0 :4 III:5 Median :141.6
## 12.5+12.5 :4 IV :5 Mean :143.0
## Testemunha:4 3rd Qu.:146.4
## Max. :165.0
# Passa testemunha para primeiro nível para ordem mais lógica.
da <- da %>%
mutate(promalin = fct_relevel(promalin, "Testemunha", after = 0))
# Tabela de frequência.
xtabs(~promalin + bloco, data = da)
## bloco
## promalin I II III IV
## Testemunha 1 1 1 1
## 12.5 1 1 1 1
## 25.0 1 1 1 1
## 50.0 1 1 1 1
## 12.5+12.5 1 1 1 1
# reshape2::dcast(da, promalin ~ bloco)
da$peso[2] <- 139.3 # Corrige valor registrado errado no pacote.
ggplot(data = da,
mapping = aes(x = promalin,
y = peso,
color = bloco,
group = bloco)) +
geom_point() +
geom_line() +
stat_summary(mapping = aes(group = 1),
geom = "line",
fun.y = "mean")
m0 <- lm(peso ~ bloco + promalin, data = da)
# As inferências acima só passam ser valiadas após confirmação de não
# haver afastamento dos pressupostos.
par(mfrow = c(2, 2))
plot(m0)
layout(1)
# anova(m0)
Anova(m0)
## Anova Table (Type II tests)
##
## Response: peso
## Sum Sq Df F value Pr(>F)
## bloco 72.91 3 0.7207 0.558616
## promalin 794.79 4 5.8929 0.007334 **
## Residuals 404.61 12
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(m0)
##
## Call:
## lm(formula = peso ~ bloco + promalin, data = da)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.200 -3.050 -1.075 1.675 9.325
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 157.535 3.672 42.896 1.67e-14 ***
## blocoII -1.860 3.672 -0.506 0.62170
## blocoIII -2.460 3.672 -0.670 0.51564
## blocoIV -5.320 3.672 -1.449 0.17307
## promalin12.5 -12.300 4.106 -2.996 0.01116 *
## promalin25.0 -17.100 4.106 -4.165 0.00131 **
## promalin50.0 -16.375 4.106 -3.988 0.00180 **
## promalin12.5+12.5 -15.100 4.106 -3.678 0.00316 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.807 on 12 degrees of freedom
## Multiple R-squared: 0.682, Adjusted R-squared: 0.4965
## F-statistic: 3.676 on 7 and 12 DF, p-value: 0.0234
# Comparações múltiplas.
# Médias marginais ajustdas.
emm <- emmeans(m0, specs = ~promalin)
emm
## promalin emmean SE df lower.CL upper.CL
## Testemunha 155 2.9 12 149 161
## 12.5 143 2.9 12 136 149
## 25.0 138 2.9 12 132 144
## 50.0 139 2.9 12 132 145
## 12.5+12.5 140 2.9 12 134 146
##
## Results are averaged over the levels of: bloco
## Confidence level used: 0.95
# Comparações múltiplas, contrastes de Tukey.
# Método de correção de p-valor: false discovey rate.
tk_fdr <- summary(glht(m0, linfct = mcp(promalin = "Tukey")),
test = adjusted(type = "fdr"))
# Resumo compacto com letras.
cld(tk_fdr, decreasing = TRUE)
## Testemunha 12.5 25.0 50.0 12.5+12.5
## "a" "b" "b" "b" "b"
# Teste HSD de Tukey.
tk_hsd <- HSD.test(m0, trt = "promalin")
tk_hsd$statistics
## MSerror Df Mean CV MSD
## 33.71783 12 142.95 4.062054 13.08747
tk_hsd$parameters
## test name.t ntr StudentizedRange alpha
## Tukey promalin 5 4.50771 0.05
results <- tk_hsd$groups %>%
rownames_to_column(var = "promalin") %>%
mutate(groups = str_trim(as.character(groups)))
results <- inner_join(results, as.data.frame(emm)) %>%
wzRfun::equallevels(da)
## Joining, by = "promalin"
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results,
mapping = aes(x = promalin, y = peso)) +
geom_point() +
geom_errorbar(mapping = aes(ymin = lower.CL, ymax = upper.CL),
width = 0) +
geom_label(mapping = aes(label = sprintf("%0.2f %s",
peso, groups)),
nudge_y = 1.25)+
labs(y = "Peso de frutos de macieira (g)",
x = "Promalin")
3.4 Repetições dentro da parcela
Essas duas formas não só tem implicações experimentais práticas diferentes como também definem modelos estatísticos próprios.
# https://github.com/pet-estatistica/labestData/blob/devel/data-raw/RamalhoTb7.1.txt
# help(RamalhoTb7.1, help_type = "html")
da <- labestData::RamalhoTb7.1
summary(da)
## prog rept plant vol
## 1 :18 Min. :1 Min. :1.0 Min. : 20.0
## 2 :18 1st Qu.:1 1st Qu.:2.0 1st Qu.: 91.0
## 3 :18 Median :2 Median :3.5 Median :133.5
## 4 :18 Mean :2 Mean :3.5 Mean :147.6
## 5 :18 3rd Qu.:3 3rd Qu.:5.0 3rd Qu.:196.5
## 6 :18 Max. :3 Max. :6.0 Max. :388.0
## (Other):72
# Renomeia para bloco para caracterizar corretamente o delineamento.
da <- da %>%
rename("bloco" = "rept") %>%
mutate_at(c("bloco", "plant"), "factor") %>%
mutate(parcela = interaction(bloco, prog))
xtabs(~bloco + prog, data = da)
## prog
## bloco 1 2 3 4 5 6 7 8 9 10
## 1 6 6 6 6 6 6 6 6 6 6
## 2 6 6 6 6 6 6 6 6 6 6
## 3 6 6 6 6 6 6 6 6 6 6
ggplot(data = da,
mapping = aes(x = prog,
y = vol,
color = bloco,
group = bloco)) +
geom_point() +
stat_summary(mapping = aes(group = 1),
geom = "line",
fun.y = "mean")
# Para fazer a análise com médias das repetições e passar o número de
# plantas como peso.
db <- da %>%
group_by(bloco, prog) %>%
summarise(n_plantas = sum(is.finite(vol)),
vol_medio = mean(vol, na.rm = TRUE))
head(db)
## # A tibble: 6 x 4
## # Groups: bloco [1]
## bloco prog n_plantas vol_medio
## <fct> <fct> <int> <dbl>
## 1 1 1 6 156.
## 2 1 2 6 122.
## 3 1 3 6 165.
## 4 1 4 6 118.
## 5 1 5 6 178.
## 6 1 6 6 137.
# Modelo de dois extratos: parcela e planta dentro de parcela.
# O termo `bloco:prog` representa cada parcela.
m0 <- aov(vol ~ bloco + prog + Error(parcela/plant), data = da)
summary(m0)
##
## Error: parcela
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 2 12988 6494 0.653 0.5323
## prog 9 199609 22179 2.231 0.0705 .
## Residuals 18 178970 9943
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Error: parcela:plant
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 150 764157 5094
# Modelo de extrato de parcela mas com totais e tamanho de amostra.
m1 <- aov(vol_medio ~ bloco + prog, data = db, weights = n_plantas)
summary(m1)
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 2 12988 6494 0.653 0.5323
## prog 9 199609 22179 2.231 0.0705 .
## Residuals 18 178970 9943
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ATTENTION: o modelo com 2 extratos é interessante para entender os
# componentes de variância. Essa informação é útil para planejar o
# experimento: definir tamanho de unidade experimental, número de
# observações por parcela, etc.
# As inferências acima só passam ser valiadas após confirmação de não
# haver afastamento dos pressupostos.
par(mfrow = c(2, 2))
plot(m1)
layout(1)
# anova(m0)
Anova(m1)
## Anova Table (Type II tests)
##
## Response: vol_medio
## Sum Sq Df F value Pr(>F)
## bloco 12988 2 0.6531 0.53231
## prog 199609 9 2.2306 0.07046 .
## Residuals 178970 18
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary.lm(m1)
##
## Call:
## aov(formula = vol_medio ~ bloco + prog, data = db, weights = n_plantas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -206.125 -50.817 9.703 45.224 145.377
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 117.1500 25.7459 4.550 0.000248 ***
## bloco2 15.7167 18.2051 0.863 0.399324
## bloco3 19.6667 18.2051 1.080 0.294278
## prog2 27.2778 33.2378 0.821 0.422561
## prog3 47.7778 33.2378 1.437 0.167746
## prog4 85.5000 33.2378 2.572 0.019180 *
## prog5 60.6667 33.2378 1.825 0.084606 .
## prog6 0.3889 33.2378 0.012 0.990794
## prog7 -19.1111 33.2378 -0.575 0.572421
## prog8 -6.3889 33.2378 -0.192 0.849724
## prog9 2.8889 33.2378 0.087 0.931698
## prog10 -12.1667 33.2378 -0.366 0.718595
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 99.71 on 18 degrees of freedom
## Multiple R-squared: 0.5429, Adjusted R-squared: 0.2636
## F-statistic: 1.944 on 11 and 18 DF, p-value: 0.1016
# Médias marginais ajustdas.
emm <- emmeans(m1, specs = ~prog)
emm
## prog emmean SE df lower.CL upper.CL
## 1 129 23.5 18 79.6 178
## 2 156 23.5 18 106.8 206
## 3 177 23.5 18 127.3 226
## 4 214 23.5 18 165.1 264
## 5 190 23.5 18 140.2 239
## 6 129 23.5 18 80.0 179
## 7 110 23.5 18 60.5 159
## 8 123 23.5 18 73.2 172
## 9 132 23.5 18 82.5 181
## 10 117 23.5 18 67.4 166
##
## Results are averaged over the levels of: bloco
## Confidence level used: 0.95
# Comparações múltiplas, contrastes de Tukey.
# Método de correção de p-valor: false discovey rate.
tk_fdr <- summary(glht(m1, linfct = mcp(prog = "Tukey")),
test = adjusted(type = "fdr"))
# Resumo compacto com letras.
cld(tk_fdr, level = 0.1, decreasing = TRUE)
## 1 2 3 4 5 6 7 8 9 10
## "a" "a" "a" "a" "a" "a" "a" "a" "a" "a"
# Teste HSD de Tukey.
tk_hsd <- HSD.test(m1, trt = "prog", alpha = 0.1)
tk_hsd$statistics
## MSerror Df Mean CV MSD
## 9942.754 18 147.6278 67.54376 262.1242
tk_hsd$parameters
## test name.t ntr StudentizedRange alpha
## Tukey prog 10 4.553176 0.1
results <- tk_hsd$groups %>%
rownames_to_column(var = "prog") %>%
mutate(groups = str_trim(as.character(groups)))
results <- inner_join(results, as.data.frame(emm))
## Joining, by = "prog"
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results,
mapping = aes(x = reorder(prog, vol_medio), y = vol_medio)) +
geom_point() +
geom_errorbar(mapping = aes(ymin = lower.CL, ymax = upper.CL),
width = 0) +
geom_text(mapping = aes(label = sprintf("%0.2f %s",
vol_medio, groups)),
angle = 90,
vjust = 0,
nudge_x = -0.1)+
labs(y = expression("Volume de madeira por árvore" ~ (m^3 ~ 10^4)),
x = "Progênie")
Referências Bibliográficas
BANZATTO, D. A.; KRONKA, S. D. Experimentação agrícola. 4th ed. Jaboticabal, SP: Funep, 2013.
Manual de Planejamento e Análise de Experimentos com R
Walmes Marques Zeviani