Capítulo 16 Delineamento em látice

https://pbgworks.org/sites/pbgworks.org/files/user/4/Lattice_seminar.pdf

  • RamalhoTb11.1: látice quadrado balanceado.
  • RamalhoEg11.4: látice quadrado parcialmente balanceado.
library(car)       # Anova().
library(emmeans)   # emmeans().
library(multcomp)  # glht().
library(lme4)      # lmer().
library(lmerTest)  # anova() e summary() para classe lmerMod.
library(tidyverse) # Manipulação e visualização.

# Funções.
source("mpaer_functions.R")

TODO: látice quadrado e látice retangular. Qual a diferença entre os BIB tipo 1 e 2?

16.1 RamalhoTb11.1

O dados em RamalhoTb11.1 são de um experimento para a avaliação de 16 cultivares de sorgo consudizo no delineamento de látice quadrado balanceado. A produção (kg/ha) das parcelas é a variável resposta.

Nesse ensaio foram avaliados \(t = 16\) cultivares usando \(b = 20\) blocos de tamanho \(k = 4\) agrupados em \(r = 5\) repetições, portanto são \(tr = bk = 80\) unidades experimentais. Este experimento é um látice quadrado pois \(t = k^2\) e \(r = k + 1\).

# Importação dos dados.
da <- as_tibble(labestData::RamalhoTb11.1)
da$rept <- gl(5, 16)
str(da)
## Classes 'tbl_df', 'tbl' and 'data.frame':    80 obs. of  4 variables:
##  $ bloc: Factor w/ 4 levels "1","2","3","4": 1 1 1 1 2 2 2 2 3 3 ...
##  $ cult: Factor w/ 16 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ prod: num  10.2 10.7 10.8 12.7 9.3 6.4 10.5 10.6 9.2 5.2 ...
##  $ rept: Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
# Os blocos são de tamanho 4, dispostos em 5 repetições de 4 blocos cada
# para acomodar 16 cultivares.
# with(da, table(bloc, cult, rept)) %>%
#     addmargins()

with(da, table(rept, bloc, cult)) %>%
    ftable()
##           cult 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
## rept bloc                                            
## 1    1         1 1 1 1 0 0 0 0 0  0  0  0  0  0  0  0
##      2         0 0 0 0 1 1 1 1 0  0  0  0  0  0  0  0
##      3         0 0 0 0 0 0 0 0 1  1  1  1  0  0  0  0
##      4         0 0 0 0 0 0 0 0 0  0  0  0  1  1  1  1
## 2    1         1 0 0 0 1 0 0 0 1  0  0  0  1  0  0  0
##      2         0 1 0 0 0 1 0 0 0  1  0  0  0  1  0  0
##      3         0 0 1 0 0 0 1 0 0  0  1  0  0  0  1  0
##      4         0 0 0 1 0 0 0 1 0  0  0  1  0  0  0  1
## 3    1         1 0 0 0 0 1 0 0 0  0  1  0  0  0  0  1
##      2         0 1 0 0 1 0 0 0 0  0  0  1  0  0  1  0
##      3         0 0 1 0 0 0 0 1 1  0  0  0  0  1  0  0
##      4         0 0 0 1 0 0 1 0 0  1  0  0  1  0  0  0
## 4    1         1 0 0 0 0 0 1 0 0  0  0  1  0  1  0  0
##      2         0 1 0 0 0 0 0 1 0  0  1  0  1  0  0  0
##      3         0 0 1 0 1 0 0 0 0  1  0  0  0  0  0  1
##      4         0 0 0 1 0 1 0 0 1  0  0  0  0  0  1  0
## 5    1         1 0 0 0 0 0 0 1 0  1  0  0  0  0  1  0
##      2         0 1 0 0 0 0 1 0 1  0  0  0  0  0  0  1
##      3         0 0 1 0 0 1 0 0 0  0  0  1  1  0  0  0
##      4         0 0 0 1 1 0 0 0 0  0  1  0  0  1  0  0
library(igraph)

# Cria bloco dentro de repetição (identificador único).
da$cond <- with(da, interaction(rept, bloc))

# Determina as conexões entre tratamentos.
edg <- by(data = as.integer(da$cult),
          INDICES = da$cond,
          FUN = combn,
          m = 2) %>%
    flatten_int()

# Exibe o grafo.
ghp <- graph(edg, directed = FALSE)
plot(ghp,
     layout = layout_in_circle,
     edge.curved = FALSE)

O modelo de efeitos fixos é \[ \begin{aligned} Y | i, j, k &\sim \text{Normal}(\mu_{ijk}, \sigma^2)\\ \mu_{ijk} &= R_i + B_{j(i)} + T_k\\ \sigma^2 &\propto 1 \end{aligned} \] em que:

  • \(Y\) é a variável aleatória observada na repetição \(i\), bloco \(j\) e tratamento \(k\) que assume-se ter distribuição normal com média condicionada a especificação dos efeitos das fontes de variação e com variância constante (\(\sigma^2\)).
  • \(\mu_{ijk}\) é a média composta pelos efeito da repetição (\(R_i\)), do bloco dentro da repetição (\(B_{j(i)}\)) e do tratamento (\(T_k\)) em um preditor linear de efeitos aditivos.

No modelo de efeitos fixos, todos os termos do preditor linear são parâmetros. Logo, serão estimados \(1 + (r - 1) + r(k - 1) + (t - 1)\) parâmetros para o preditor da média. O modelo é ajustado aos dados por mínimos quadrados (ordinários).

# Modelo de efeitos fixos.
m0 <- lm(terms(prod ~ rept/bloc + cult, keep.order = TRUE),
         data = da)

# Quado de anova com hipóteses marginais.
Anova(m0)
## Anova Table (Type II tests)
## 
## Response: prod
##            Sum Sq Df F value   Pr(>F)   
## rept       20.136  4  1.7708 0.151399   
## rept:bloc 123.942 15  2.9066 0.002877 **
## cult      105.224 15  2.4676 0.009903 **
## Residuals 127.926 45                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Médias marginais ajustadas.
emm <- emmeans(m0, specs = ~cult)
## NOTE: A nesting structure was detected in the fitted model:
##     bloc %in% rept
emm
##  cult emmean    SE df lower.CL upper.CL
##  1      8.12 0.838 45     6.43     9.81
##  2      7.69 0.838 45     6.00     9.38
##  3      8.44 0.838 45     6.75    10.13
##  4      9.06 0.838 45     7.37    10.75
##  5      9.77 0.838 45     8.08    11.45
##  6      6.88 0.838 45     5.19     8.56
##  7     10.59 0.838 45     8.90    12.28
##  8     10.70 0.838 45     9.02    12.39
##  9     10.43 0.838 45     8.75    12.12
##  10     7.87 0.838 45     6.18     9.55
##  11     7.32 0.838 45     5.63     9.01
##  12     8.04 0.838 45     6.35     9.73
##  13     7.51 0.838 45     5.83     9.20
##  14     9.85 0.838 45     8.17    11.54
##  15     7.66 0.838 45     5.97     9.35
##  16     6.91 0.838 45     5.22     8.60
## 
## Results are averaged over the levels of: bloc, rept 
## Confidence level used: 0.95
# Extração da matriz de funções lineares.
L <- attr(emm, "linfct")
grid <- attr(emm, "grid")
rownames(L) <- grid[[1]]

# Entenda como são obtidas as médias marginais.
MASS::fractions(t(L[1:4, ])) %>%
    unique()
##             1    2    3    4   
## (Intercept)    1    1    1    1
## rept2        1/5  1/5  1/5  1/5
## rept1:bloc2 1/20 1/20 1/20 1/20
## cult2          0    1    0    0
## cult3          0    0    1    0
## cult4          0    0    0    1
## cult5          0    0    0    0
# Comparações múltiplas a 10%.
results_m0 <- wzRfun::apmc(X = L,
                           model = m0,
                           focus = "cult",
                           test = "fdr",
                           level = 0.1) %>%
    mutate(cld = wzRfun::ordered_cld(let = cld, means = fit))
results_m0
##    cult      fit      lwr       upr cld
## 1     1  8.12125 6.714319  9.528181  ab
## 2     2  7.69000 6.283069  9.096931  ab
## 3     3  8.44000 7.033069  9.846931  ab
## 4     4  9.05875 7.651819 10.465681  ab
## 5     5  9.76500 8.358069 11.171931  ab
## 6     6  6.87750 5.470569  8.284431   b
## 7     7 10.59000 9.183069 11.996931   a
## 8     8 10.70250 9.295569 12.109431   a
## 9     9 10.43375 9.026819 11.840681   a
## 10   10  7.86500 6.458069  9.271931  ab
## 11   11  7.32125 5.914319  8.728181  ab
## 12   12  8.04000 6.633069  9.446931  ab
## 13   13  7.51500 6.108069  8.921931  ab
## 14   14  9.85250 8.445569 11.259431  ab
## 15   15  7.65875 6.251819  9.065681  ab
## 16   16  6.90875 5.501819  8.315681   b
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results_m0,
       mapping = aes(x = fit, y = reorder(cult, fit))) +
    geom_point() +
    geom_errorbarh(mapping = aes(xmin = lwr, xmax = upr),
                   height = 0) +
    geom_text(mapping = aes(label = sprintf("%0.2f %s", fit, cld)),
              vjust = 0,
              nudge_y = 0.1) +
    labs(x = "Produção",
         y = "Cultivares")

Atenção: as médias ajustadas da Tabela 3 na página 168 em RAMALHO et al. (2005) foram obtidas com o modelo de efeito aleatório para bloco dentro de repetição que será ajustado a seguir. Essas médias podem ser obtidas por meio da análise com recuperação da informação interbloco. Se houver diferença em relação ao modelo de efeitos aleatórios será por causa da diferença na estimativa do componente de variância de bloco. Considerar o modelo de efeitos aleatório é mais interessante por permitir, com facilidade, determinar o erro padrão das médias e realizar comparações múltiplas.

# Cria bloco dentro de repetição (identificador único).
da$cond <- with(da, interaction(rept, bloc))

# Médias ajustadas com a análise da recuperação interbloco.
u <- emmeans_interbloco(trt = "cult", blc = "cond", resp = "prod", data = da)
u
##    cult   emmeans
## 1     1  8.368436
## 2     2  8.042155
## 3     3  8.796025
## 4     4  8.927659
## 5     5  9.855941
## 6     6  7.002302
## 7     7 10.307502
## 8     8 10.647355
## 9     9 10.095623
## 10   10  7.816627
## 11   11  7.274328
## 12   12  8.016781
## 13   13  7.238307
## 14   14 10.180469
## 15   15  7.241291
## 16   16  7.029199
# Componentes de variância.
attr(u, "information") %>%
    as.data.frame()
##   n_trat n_block block_variance residual_variance df_residual
## 1     16      20       1.407264          2.842799          45

No modelo a seguir, o efeito de bloco dentro de repetições é aleatório. O efeito de repetições foi mantido como fixo, bem como o efeito de cultivares.

# Ajuste do modelo de efeito aleatório de bloc.
mm0 <- lmer(prod ~ rept + (1 | rept:bloc) + cult, data = da)

# Quadro de teste de Wald.
anova(mm0)
## Type III Analysis of Variance Table with Satterthwaite's method
##       Sum Sq Mean Sq NumDF  DenDF F value   Pr(>F)   
## rept   5.952  1.4879     4 12.986  0.5234 0.720445   
## cult 108.862  7.2574    15 51.484  2.5529 0.006463 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros dos termos de efeito.
summary(mm0)
## Linear mixed model fit by REML. t-tests use Satterthwaite's  method
##  [lmerModLmerTest]
## Formula: prod ~ rept + (1 | rept:bloc) + cult
##    Data: da
## 
## REML criterion at convergence: 284.2
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -1.71014 -0.46545 -0.04598  0.48518  2.00915 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  rept:bloc (Intercept) 1.694    1.301   
##  Residual              2.843    1.686   
## Number of obs: 80, groups:  rept:bloc, 20
## 
## Fixed effects:
##             Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   8.4510     1.1052 39.1512   7.646 2.75e-09 ***
## rept2        -0.2500     1.0965 12.9862  -0.228   0.8232    
## rept3         0.1938     1.0965 12.9862   0.177   0.8625    
## rept4         0.4938     1.0965 12.9862   0.450   0.6599    
## rept5        -0.9875     1.0965 12.9862  -0.901   0.3842    
## cult2        -0.3379     1.1505 51.4843  -0.294   0.7701    
## cult3         0.4155     1.1505 51.4843   0.361   0.7195    
## cult4         0.6012     1.1505 51.4843   0.523   0.6035    
## cult5         1.5048     1.1505 51.4843   1.308   0.1967    
## cult6        -1.3526     1.1505 51.4843  -1.176   0.2451    
## cult7         1.9978     1.1505 51.4843   1.737   0.0885 .  
## cult8         2.3125     1.1505 51.4843   2.010   0.0497 *  
## cult9         1.7921     1.1505 51.4843   1.558   0.1254    
## cult10       -0.5190     1.1505 51.4843  -0.451   0.6538    
## cult11       -1.0615     1.1505 51.4843  -0.923   0.3605    
## cult12       -0.3217     1.1505 51.4843  -0.280   0.7809    
## cult13       -1.0720     1.1505 51.4843  -0.932   0.3558    
## cult14        1.8031     1.1505 51.4843   1.567   0.1232    
## cult15       -1.0534     1.1505 51.4843  -0.916   0.3641    
## cult16       -1.3252     1.1505 51.4843  -1.152   0.2547    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation matrix not shown by default, as p = 20 > 12.
## Use print(x, correlation=TRUE)  or
##     vcov(x)        if you need it
# Médias marginais ajustadas.
emm <- emmeans(mm0, specs = ~cult)
emm
##  cult emmean   SE   df lower.CL upper.CL
##  1      8.34 0.87 59.9     6.60    10.08
##  2      8.00 0.87 59.9     6.26     9.74
##  3      8.76 0.87 59.9     7.02    10.50
##  4      8.94 0.87 59.9     7.20    10.68
##  5      9.85 0.87 59.9     8.11    11.59
##  6      6.99 0.87 59.9     5.25     8.73
##  7     10.34 0.87 59.9     8.60    12.08
##  8     10.65 0.87 59.9     8.91    12.39
##  9     10.13 0.87 59.9     8.39    11.87
##  10     7.82 0.87 59.9     6.08     9.56
##  11     7.28 0.87 59.9     5.54     9.02
##  12     8.02 0.87 59.9     6.28     9.76
##  13     7.27 0.87 59.9     5.53     9.01
##  14    10.14 0.87 59.9     8.40    11.88
##  15     7.29 0.87 59.9     5.55     9.03
##  16     7.02 0.87 59.9     5.28     8.76
## 
## Results are averaged over the levels of: rept 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95
# Extração da matriz de funções lineares.
grid <- attr(emm, "grid")
L <- attr(emm, "linfct")
rownames(L) <- grid[[1]]

# As mesmas comparações múltiplas.
results_mm0 <- wzRfun::apmc(L,
                            model = mm0,
                            focus = "cult",
                            test = "fdr",
                            level = 0.1)
results_mm0
##    cult       fit      lwr       upr cld
## 1     1  8.341010 6.925425  9.756595  ad
## 2     2  8.003083 6.587498  9.418667  ad
## 3     3  8.756523 7.340938 10.172108  ad
## 4     4  8.942204 7.526619 10.357789  ad
## 5     5  9.845851 8.430266 11.261436  ac
## 6     6  6.988455 5.572870  8.404040   d
## 7     7 10.338846 8.923261 11.754431  ab
## 8     8 10.653473 9.237888 12.069058   a
## 9     9 10.133139 8.717554 11.548724  ab
## 10   10  7.821994 6.406409  9.237579 bcd
## 11   11  7.279534 5.863949  8.695119  cd
## 12   12  8.019357 6.603772  9.434942  ad
## 13   13  7.269007 5.853422  8.684592  cd
## 14   14 10.144080 8.728495 11.559665  ab
## 15   15  7.287610 5.872025  8.703195  cd
## 16   16  7.015835 5.600250  8.431419   d
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results_mm0,
       mapping = aes(x = fit, y = reorder(cult, fit))) +
    geom_point() +
    geom_errorbarh(mapping = aes(xmin = lwr, xmax = upr),
                   height = 0) +
    geom_text(mapping = aes(label = sprintf("%0.2f %s", fit, cld)),
              vjust = 0,
              nudge_y = 0.1) +
    labs(x = "Produção",
         y = "Cultivares")

16.2 RamalhoEg11.4

O objeto RamalhoEg11.4 armazena dados de um experimento feito em delineamento de látice quadrado parcialmente balanceado para avaliar a produção (kg/parcela) de 36 cultivares de milho.

No delineamento de látice parcialmente balanceado apenas alguns pares de tratamentos ocorrem juntos nos blocos. Fazer com que todos os pares sejam observados simultaneamente exige um número grande de blocos, o que torna inivável a realização do experimento.

Com isso, vão existir 3 tipos de associação. O primeiro tipo corresponde ao conjunto de tratamentos que ocorrem juntos \(\lambda_1 > 0\) vezes. O segundo tipo corresponde ao conjunto de tratamentos que ocorre \(0 \leq \lambda_2 < \lambda_1\) vezes. O terceiro, caso \(\lambda_2 > 0\), é o grupo de tratamentos que não ocorre junto.

Dessa forma, os contrastes entre tratamentos terão erro padrão de tamanho correspondente a estrutura de associação. O erro padrão do contraste entre primeiros associados será o menor, seguido pelos segundos associados e, por fim, o maior erro padrão será para o contraste entre tratamentos que não ocorreram juntos.

# Dados do experimento.
da <- as_tibble(labestData::RamalhoEg11.4)
da$rept <- gl(2, 36)
str(da)
## Classes 'tbl_df', 'tbl' and 'data.frame':    72 obs. of  4 variables:
##  $ bloc: Factor w/ 6 levels "1","2","3","4",..: 1 1 1 1 1 1 2 2 2 2 ...
##  $ cult: Factor w/ 36 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ prod: num  4.39 3.66 2 1.92 4.69 ...
##  $ rept: Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...
# São 6 blocos de tamanho 6 em cada uma das 2 repetições para acomodar
# 36 cultivares de milho.
with(da, table(cult, bloc, rept)) %>%
    addmargins(1:2) %>%
    print.table(zero.print = ".")
## , , rept = 1
## 
##      bloc
## cult   1  2  3  4  5  6 Sum
##   1    1  .  .  .  .  .   1
##   2    1  .  .  .  .  .   1
##   3    1  .  .  .  .  .   1
##   4    1  .  .  .  .  .   1
##   5    1  .  .  .  .  .   1
##   6    1  .  .  .  .  .   1
##   7    .  1  .  .  .  .   1
##   8    .  1  .  .  .  .   1
##   9    .  1  .  .  .  .   1
##   10   .  1  .  .  .  .   1
##   11   .  1  .  .  .  .   1
##   12   .  1  .  .  .  .   1
##   13   .  .  1  .  .  .   1
##   14   .  .  1  .  .  .   1
##   15   .  .  1  .  .  .   1
##   16   .  .  1  .  .  .   1
##   17   .  .  1  .  .  .   1
##   18   .  .  1  .  .  .   1
##   19   .  .  .  1  .  .   1
##   20   .  .  .  1  .  .   1
##   21   .  .  .  1  .  .   1
##   22   .  .  .  1  .  .   1
##   23   .  .  .  1  .  .   1
##   24   .  .  .  1  .  .   1
##   25   .  .  .  .  1  .   1
##   26   .  .  .  .  1  .   1
##   27   .  .  .  .  1  .   1
##   28   .  .  .  .  1  .   1
##   29   .  .  .  .  1  .   1
##   30   .  .  .  .  1  .   1
##   31   .  .  .  .  .  1   1
##   32   .  .  .  .  .  1   1
##   33   .  .  .  .  .  1   1
##   34   .  .  .  .  .  1   1
##   35   .  .  .  .  .  1   1
##   36   .  .  .  .  .  1   1
##   Sum  6  6  6  6  6  6  36
## 
## , , rept = 2
## 
##      bloc
## cult   1  2  3  4  5  6 Sum
##   1    1  .  .  .  .  .   1
##   2    .  1  .  .  .  .   1
##   3    .  .  1  .  .  .   1
##   4    .  .  .  1  .  .   1
##   5    .  .  .  .  1  .   1
##   6    .  .  .  .  .  1   1
##   7    1  .  .  .  .  .   1
##   8    .  1  .  .  .  .   1
##   9    .  .  1  .  .  .   1
##   10   .  .  .  1  .  .   1
##   11   .  .  .  .  1  .   1
##   12   .  .  .  .  .  1   1
##   13   1  .  .  .  .  .   1
##   14   .  1  .  .  .  .   1
##   15   .  .  1  .  .  .   1
##   16   .  .  .  1  .  .   1
##   17   .  .  .  .  1  .   1
##   18   .  .  .  .  .  1   1
##   19   1  .  .  .  .  .   1
##   20   .  1  .  .  .  .   1
##   21   .  .  1  .  .  .   1
##   22   .  .  .  1  .  .   1
##   23   .  .  .  .  1  .   1
##   24   .  .  .  .  .  1   1
##   25   1  .  .  .  .  .   1
##   26   .  1  .  .  .  .   1
##   27   .  .  1  .  .  .   1
##   28   .  .  .  1  .  .   1
##   29   .  .  .  .  1  .   1
##   30   .  .  .  .  .  1   1
##   31   1  .  .  .  .  .   1
##   32   .  1  .  .  .  .   1
##   33   .  .  1  .  .  .   1
##   34   .  .  .  1  .  .   1
##   35   .  .  .  .  1  .   1
##   36   .  .  .  .  .  1   1
##   Sum  6  6  6  6  6  6  36
library(igraph)

da$cond <- with(da, interaction(rept, bloc))

edg <- by(data = as.integer(da$cult),
          INDICES = da$cond,
          FUN = combn,
          m = 2) %>%
    flatten_int()

ghp <- graph(edg, directed = FALSE)
plot(ghp,
     vertex.size = 5,
     vertex.label.dist = 1,
     # layout = layout_components,
     layout = layout_in_circle,
     edge.curved = FALSE)

# Quantidade de pares possíveis.
choose(nlevels(da$cult), k = 2)

# Quantas vezes cada par ocorre junto.
by(data = da$cult,
   INDICES = da$cond,
   FUN = function(x) {
       apply(combn(sort(x), m = 2),
             MARGIN = 2,
             FUN = paste0,
             collapse = "_")
   }) %>%
    flatten_chr() %>%
    table() %>%
    enframe(name = "par", value = "freq")
# CAUTION: quadro de anova não bate com o livro!
# Modelo de efeitos fixos.
m0 <- lm(terms(prod ~ rept/bloc + cult, keep.order = TRUE),
         data = da)

# Quado de anova com hipóteses marginais.
Anova(m0)
## Anova Table (Type II tests)
## 
## Response: prod
##           Sum Sq Df F value    Pr(>F)    
## rept      32.334  1 49.5050 2.247e-07 ***
## rept:bloc 16.611 10  2.5432   0.02841 *  
## cult      41.034 35  1.7950   0.06541 .  
## Residuals 16.329 25                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Médias marginais ajustadas.
emm <- emmeans(m0, specs = ~cult)
## NOTE: A nesting structure was detected in the fitted model:
##     bloc %in% rept
emm
##  cult emmean    SE df lower.CL upper.CL
##  1      4.98 0.646 25     3.64     6.31
##  2      3.80 0.646 25     2.47     5.13
##  3      3.34 0.646 25     2.01     4.67
##  4      3.04 0.646 25     1.71     4.37
##  5      4.78 0.646 25     3.45     6.12
##  6      6.14 0.646 25     4.81     7.47
##  7      3.84 0.646 25     2.51     5.17
##  8      3.38 0.646 25     2.05     4.71
##  9      4.76 0.646 25     3.43     6.09
##  10     5.08 0.646 25     3.74     6.41
##  11     4.36 0.646 25     3.03     5.70
##  12     4.03 0.646 25     2.70     5.36
##  13     4.89 0.646 25     3.56     6.22
##  14     3.25 0.646 25     1.92     4.58
##  15     5.29 0.646 25     3.96     6.62
##  16     4.80 0.646 25     3.47     6.13
##  17     4.68 0.646 25     3.35     6.01
##  18     3.18 0.646 25     1.85     4.51
##  19     5.19 0.646 25     3.86     6.52
##  20     3.68 0.646 25     2.35     5.01
##  21     5.40 0.646 25     4.07     6.73
##  22     4.53 0.646 25     3.20     5.86
##  23     5.18 0.646 25     3.85     6.51
##  24     2.63 0.646 25     1.30     3.96
##  25     5.35 0.646 25     4.02     6.68
##  26     4.21 0.646 25     2.88     5.54
##  27     4.77 0.646 25     3.44     6.10
##  28     4.69 0.646 25     3.36     6.02
##  29     5.08 0.646 25     3.74     6.41
##  30     5.61 0.646 25     4.28     6.94
##  31     4.65 0.646 25     3.32     5.98
##  32     3.70 0.646 25     2.36     5.03
##  33     4.63 0.646 25     3.30     5.96
##  34     5.24 0.646 25     3.91     6.57
##  35     5.17 0.646 25     3.84     6.50
##  36     5.58 0.646 25     4.24     6.91
## 
## Results are averaged over the levels of: bloc, rept 
## Confidence level used: 0.95
# Extração da matriz de funções lineares.
L <- attr(emm, "linfct")
grid <- attr(emm, "grid")
rownames(L) <- grid[[1]]

# Entenda como são obtidas as médias marginais.
MASS::fractions(t(L[1:4, ])) %>%
    unique()
##             1    2    3    4   
## (Intercept)    1    1    1    1
## rept2        1/2  1/2  1/2  1/2
## rept1:bloc2 1/12 1/12 1/12 1/12
## cult2          0    1    0    0
## cult3          0    0    1    0
## cult4          0    0    0    1
## cult5          0    0    0    0
# Contrastes par a par.
ctr <- summary(glht(m0, linfct = all_pairwise(L)),
               test = adjusted(type = "fdr"))

# Erros padrões de dois tamanhos conforme estrutura de associados.
v <- c("coefficients", "sigma", "tstat", "pvalues")
ctr$test[v] %>%
    as.data.frame() %>%
    split(., round(.$sigma, 4)) %>%
    map(head, n = 10)
## $`0.8729`
##       coefficients     sigma       tstat   pvalues
## 1vs2    1.17916667 0.8729308  1.35081343 0.5726127
## 1vs3    1.63625000 0.8729308  1.87443263 0.4317107
## 1vs4    1.93291667 0.8729308  2.21428393 0.3938518
## 1vs5    0.19083333 0.8729308  0.21861221 0.9668481
## 1vs6   -1.16083333 0.8729308 -1.32981139 0.5812251
## 1vs7    1.13250000 0.8729308  1.29735368 0.5970728
## 1vs13   0.08541667 0.8729308  0.09785044 0.9693983
## 1vs19  -0.21625000 0.8729308 -0.24772868 0.9605105
## 1vs25  -0.37083333 0.8729308 -0.42481412 0.9023365
## 1vs31   0.32583333 0.8729308  0.37326364 0.9241553
## 
## $`0.9332`
##       coefficients     sigma      tstat   pvalues
## 1vs8    1.59916667 0.9332023  1.7136335 0.4711698
## 1vs9    0.21625000 0.9332023  0.2317290 0.9644038
## 1vs10  -0.09958333 0.9332023 -0.1067114 0.9693983
## 1vs11   0.61083333 0.9332023  0.6545562 0.8688576
## 1vs12   0.94416667 0.9332023  1.0117492 0.7153741
## 1vs14   1.72708333 0.9332023  1.8507063 0.4317107
## 1vs15  -0.31583333 0.9332023 -0.3384404 0.9241553
## 1vs16   0.17333333 0.9332023  0.1857404 0.9693983
## 1vs17   0.29875000 0.9332023  0.3201342 0.9323001
## 1vs18   1.79458333 0.9332023  1.9230379 0.4238813
# Comparações múltiplas a 10%.
results_m0 <- wzRfun::apmc(X = L,
                           model = m0,
                           focus = "cult",
                           test = "fdr",
                           level = 0.1)
results_m0
##    cult      fit      lwr      upr cld
## 1     1 4.975417 3.871992 6.078841   a
## 2     2 3.796250 2.692825 4.899675   a
## 3     3 3.339167 2.235742 4.442591   a
## 4     4 3.042500 1.939075 4.145925   a
## 5     5 4.784583 3.681159 5.888008   a
## 6     6 6.136250 5.032825 7.239675   a
## 7     7 3.842917 2.739492 4.946341   a
## 8     8 3.376250 2.272825 4.479675   a
## 9     9 4.759167 3.655742 5.862591   a
## 10   10 5.075000 3.971575 6.178425   a
## 11   11 4.364583 3.261159 5.468008   a
## 12   12 4.031250 2.927825 5.134675   a
## 13   13 4.890000 3.786575 5.993425   a
## 14   14 3.248333 2.144909 4.351758   a
## 15   15 5.291250 4.187825 6.394675   a
## 16   16 4.802083 3.698659 5.905508   a
## 17   17 4.676667 3.573242 5.780091   a
## 18   18 3.180833 2.077409 4.284258   a
## 19   19 5.191667 4.088242 6.295091   a
## 20   20 3.680000 2.576575 4.783425   a
## 21   21 5.402917 4.299492 6.506341   a
## 22   22 4.533750 3.430325 5.637175   a
## 23   23 5.180833 4.077409 6.284258   a
## 24   24 2.630000 1.526575 3.733425   a
## 25   25 5.346250 4.242825 6.449675   a
## 26   26 4.209583 3.106159 5.313008   a
## 27   27 4.770000 3.666575 5.873425   a
## 28   28 4.690833 3.587409 5.794258   a
## 29   29 5.075417 3.971992 6.178841   a
## 30   30 5.612083 4.508659 6.715508   a
## 31   31 4.649583 3.546159 5.753008   a
## 32   32 3.695417 2.591992 4.798841   a
## 33   33 4.628333 3.524909 5.731758   a
## 34   34 5.236667 4.133242 6.340091   a
## 35   35 5.173750 4.070325 6.277175   a
## 36   36 5.575417 4.471992 6.678841   a
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results_m0,
       mapping = aes(x = fit, y = reorder(cult, fit))) +
    geom_point() +
    geom_errorbarh(mapping = aes(xmin = lwr, xmax = upr),
                   height = 0) +
    geom_label(mapping = aes(label = sprintf("%0.2f%s", fit, cld)),
               label.padding = unit(0.15, "lines"),
               fill = "black",
               colour = "white",
               size = 3,
               nudge_x = 0.25,
               vjust = 0.5) +
    labs(x = "Produção",
         y = "Cultivares")

ATTENTION: pode ocorrer de duas médias consecutivas diferirem entre si e elas podem estar dentro do intervalo formado por duas médias que não diferem! As primeiras médias podem ser de tratamentos em primeiro associados e as outras de tratamentos como segundo associados. Acredito que seja um evento bem raro, mas é possível ter algo como exemplificado a seguir.

10.7 abc – 11.2 b – 13.9 c – 14.1 abc

TODO

# Ajuste do modelo de efeito aleatório de bloc.
mm0 <- lmer(prod ~ rept + (1 | rept:bloc) + cult, data = da)

# Quadro de teste de Wald.
anova(mm0)
## Type III Analysis of Variance Table with Satterthwaite's method
##      Sum Sq Mean Sq NumDF   DenDF F value  Pr(>F)  
## rept  7.913  7.9127     1  6.3562 12.1147 0.01197 *
## cult 39.280  1.1223    35 27.2185  1.7183 0.07414 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros dos termos de efeito.
summary(mm0)
## Linear mixed model fit by REML. t-tests use Satterthwaite's  method
##  [lmerModLmerTest]
## Formula: prod ~ rept + (1 | rept:bloc) + cult
##    Data: da
## 
## REML criterion at convergence: 121.6
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.5841 -0.3997  0.0000  0.3997  1.5841 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  rept:bloc (Intercept) 0.3360   0.5796  
##  Residual              0.6531   0.8082  
## Number of obs: 72, groups:  rept:bloc, 12
## 
## Fixed effects:
##             Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)  4.27071    0.66835 34.99991   6.390 2.37e-07 ***
## rept2        1.34028    0.38507  6.35616   3.481   0.0120 *  
## cult2       -0.94652    0.84806 27.98407  -1.116   0.2739    
## cult3       -1.54630    0.84806 27.98407  -1.823   0.0790 .  
## cult4       -1.92391    0.84806 27.98407  -2.269   0.0312 *  
## cult5       -0.27210    0.84806 27.98407  -0.321   0.7507    
## cult6        1.27355    0.84806 27.98407   1.502   0.1444    
## cult7       -0.82776    0.84806 27.98407  -0.976   0.3374    
## cult8       -1.06178    0.88615 30.35602  -1.198   0.2401    
## cult9        0.17843    0.88615 30.35602   0.201   0.8418    
## cult10       0.41333    0.88615 30.35602   0.466   0.6442    
## cult11      -0.38736    0.88615 30.35602  -0.437   0.6651    
## cult12      -0.52671    0.88615 30.35602  -0.594   0.5567    
## cult13      -0.14128    0.84806 27.98407  -0.167   0.8689    
## cult14      -1.55030    0.88615 30.35602  -1.749   0.0903 .  
## cult15       0.34991    0.88615 30.35602   0.395   0.6957    
## cult16      -0.22019    0.88615 30.35602  -0.248   0.8054    
## cult17      -0.43588    0.88615 30.35602  -0.492   0.6263    
## cult18      -1.73773    0.88615 30.35602  -1.961   0.0591 .  
## cult19       0.03980    0.84806 27.98407   0.047   0.9629    
## cult20      -1.23922    0.88615 30.35602  -1.398   0.1721    
## cult21       0.34099    0.88615 30.35602   0.385   0.7031    
## cult22      -0.60911    0.88615 30.35602  -0.687   0.4971    
## cult23      -0.05230    0.88615 30.35602  -0.059   0.9533    
## cult24      -2.40915    0.88615 30.35602  -2.719   0.0107 *  
## cult25       0.20536    0.84806 27.98407   0.242   0.8104    
## cult26      -0.69866    0.88615 30.35602  -0.788   0.4366    
## cult27      -0.28095    0.88615 30.35602  -0.317   0.7534    
## cult28      -0.44105    0.88615 30.35602  -0.498   0.6223    
## cult29      -0.14674    0.88615 30.35602  -0.166   0.8696    
## cult30       0.58391    0.88615 30.35602   0.659   0.5149    
## cult31      -0.38842    0.84806 27.98407  -0.458   0.6505    
## cult32      -1.10994    0.88615 30.35602  -1.253   0.2199    
## cult33      -0.31972    0.88615 30.35602  -0.361   0.7207    
## cult34       0.20768    0.88615 30.35602   0.234   0.8163    
## cult35       0.05448    0.88615 30.35602   0.061   0.9514    
## cult36       0.65013    0.88615 30.35602   0.734   0.4688    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation matrix not shown by default, as p = 37 > 12.
## Use print(x, correlation=TRUE)  or
##     vcov(x)        if you need it
# Médias marginais ajustadas.
emm <- emmeans(mm0, specs = ~cult)
emm
##  cult emmean    SE   df lower.CL upper.CL
##  1      4.94 0.655 33.8     3.61     6.27
##  2      3.99 0.655 33.8     2.66     5.33
##  3      3.39 0.655 33.8     2.06     4.73
##  4      3.02 0.655 33.8     1.68     4.35
##  5      4.67 0.655 33.8     3.34     6.00
##  6      6.21 0.655 33.8     4.88     7.55
##  7      4.11 0.655 33.8     2.78     5.45
##  8      3.88 0.655 33.8     2.55     5.21
##  9      5.12 0.655 33.8     3.79     6.45
##  10     5.35 0.655 33.8     4.02     6.69
##  11     4.55 0.655 33.8     3.22     5.89
##  12     4.41 0.655 33.8     3.08     5.75
##  13     4.80 0.655 33.8     3.47     6.13
##  14     3.39 0.655 33.8     2.06     4.72
##  15     5.29 0.655 33.8     3.96     6.62
##  16     4.72 0.655 33.8     3.39     6.05
##  17     4.50 0.655 33.8     3.17     5.84
##  18     3.20 0.655 33.8     1.87     4.54
##  19     4.98 0.655 33.8     3.65     6.31
##  20     3.70 0.655 33.8     2.37     5.03
##  21     5.28 0.655 33.8     3.95     6.61
##  22     4.33 0.655 33.8     3.00     5.66
##  23     4.89 0.655 33.8     3.56     6.22
##  24     2.53 0.655 33.8     1.20     3.86
##  25     5.15 0.655 33.8     3.81     6.48
##  26     4.24 0.655 33.8     2.91     5.57
##  27     4.66 0.655 33.8     3.33     5.99
##  28     4.50 0.655 33.8     3.17     5.83
##  29     4.79 0.655 33.8     3.46     6.13
##  30     5.52 0.655 33.8     4.19     6.86
##  31     4.55 0.655 33.8     3.22     5.88
##  32     3.83 0.655 33.8     2.50     5.16
##  33     4.62 0.655 33.8     3.29     5.95
##  34     5.15 0.655 33.8     3.82     6.48
##  35     5.00 0.655 33.8     3.66     6.33
##  36     5.59 0.655 33.8     4.26     6.92
## 
## Results are averaged over the levels of: rept 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95
# Extração da matriz de funções lineares.
grid <- attr(emm, "grid")
L <- attr(emm, "linfct")
rownames(L) <- grid[[1]]

# Contrastes par a par.
ctr <- summary(glht(mm0, linfct = all_pairwise(L)),
               test = adjusted(type = "fdr"))

# Erros padrões de dois tamanhos conforme estrutura de associados.
v <- c("coefficients", "sigma", "tstat", "pvalues")
ctr$test[v] %>%
    as.data.frame() %>%
    split(., round(.$sigma, 4)) %>%
    map(head, n = 10)
## $`0.8481`
##       coefficients     sigma       tstat   pvalues
## 1vs2    0.94651874 0.8480587  1.11610050 0.7148448
## 1vs3    1.54630373 0.8480587  1.82334516 0.4290162
## 1vs4    1.92390566 0.8480587  2.26859963 0.2883864
## 1vs5    0.27209627 0.8480587  0.32084603 0.9353039
## 1vs6   -1.27355289 0.8480587 -1.50172729 0.5435869
## 1vs7    0.82776399 0.8480587  0.97606921 0.7705449
## 1vs13   0.14128494 0.8480587  0.16659806 0.9554397
## 1vs19  -0.03979802 0.8480587 -0.04692838 0.9790704
## 1vs25  -0.20535840 0.8480587 -0.24215116 0.9481991
## 1vs31   0.38841890 0.8480587  0.45800945 0.9102064
## 
## $`0.8861`
##       coefficients     sigma      tstat   pvalues
## 1vs8     1.0617827 0.8861478  1.1982005 0.6732803
## 1vs9    -0.1784323 0.8861478 -0.2013573 0.9481991
## 1vs10   -0.4133304 0.8861478 -0.4664350 0.9100631
## 1vs11    0.3873603 0.8861478  0.4371283 0.9108261
## 1vs12    0.5267111 0.8861478  0.5943829 0.8850169
## 1vs14    1.5503037 0.8861478  1.7494866 0.4520915
## 1vs15   -0.3499113 0.8861478 -0.3948679 0.9239990
## 1vs16    0.2201906 0.8861478  0.2484807 0.9481991
## 1vs17    0.4358812 0.8861478  0.4918832 0.8978609
## 1vs18    1.7377320 0.8861478  1.9609958 0.3879518
# As mesmas comparações múltiplas.
results_mm0 <- wzRfun::apmc(L,
                            model = mm0,
                            focus = "cult",
                            test = "fdr",
                            level = 0.1)
results_mm0
##    cult      fit      lwr      upr cld
## 1     1 4.940847 3.888118 5.993577  ac
## 2     2 3.994328 2.941599 5.047058  ac
## 3     3 3.394543 2.341814 4.447273  bc
## 4     4 3.016941 1.964212 4.069671  bc
## 5     5 4.668751 3.616022 5.721480  ac
## 6     6 6.214400 5.161671 7.267129   a
## 7     7 4.113083 3.060354 5.165813  ac
## 8     8 3.879064 2.826335 4.931794  ac
## 9     9 5.119279 4.066550 6.172009  ac
## 10   10 5.354178 4.301448 6.406907  ac
## 11   11 4.553487 3.500758 5.606216  ac
## 12   12 4.414136 3.361407 5.466865  ac
## 13   13 4.799562 3.746833 5.852292  ac
## 14   14 3.390543 2.337814 4.443273  ac
## 15   15 5.290758 4.238029 6.343488  ac
## 16   16 4.720657 3.667927 5.773386  ac
## 17   17 4.504966 3.452237 5.557695  ac
## 18   18 3.203115 2.150386 4.255844  bc
## 19   19 4.980645 3.927916 6.033375  ac
## 20   20 3.701626 2.648897 4.754356  ac
## 21   21 5.281841 4.229112 6.334571  ac
## 22   22 4.331740 3.279010 5.384469  ac
## 23   23 4.888549 3.835820 5.941278  ac
## 24   24 2.531698 1.478969 3.584427   c
## 25   25 5.146206 4.093476 6.198935  ac
## 26   26 4.242187 3.189457 5.294916  ac
## 27   27 4.659902 3.607172 5.712631  ac
## 28   28 4.499800 3.447071 5.552529  ac
## 29   29 4.794109 3.741380 5.846839  ac
## 30   30 5.524758 4.472029 6.577488  ab
## 31   31 4.552428 3.499699 5.605158  ac
## 32   32 3.830910 2.778180 4.883639  ac
## 33   33 4.621125 3.568395 5.673854  ac
## 34   34 5.148523 4.095793 6.201252  ac
## 35   35 4.995332 3.942603 6.048061  ac
## 36   36 5.590981 4.538252 6.643711  ab
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results_mm0,
       mapping = aes(x = fit, y = reorder(cult, fit))) +
    geom_point() +
    geom_errorbarh(mapping = aes(xmin = lwr, xmax = upr),
                   height = 0) +
    geom_label(mapping = aes(label = sprintf("%0.2f%s", fit, cld)),
               label.padding = unit(0.15, "lines"),
               fill = "black",
               colour = "white",
               size = 3,
               nudge_x = 0.25,
               vjust = 0.5) +
    labs(x = "Produção",
         y = "Cultivares")

ATTENTION: A tabela 7 da página 175 não foi incluída na obra.

16.3 ZimmermannTb7.1

Os dados em ZimmermannTb7.1 correspondem a produção de arroz em terras altas (kg/ha) de um experimento em delineamento látice reticulado quadrado \(5^2\) com 3 repetições. No experimento foram estudados \(t = 5^2 = 25\) tratamentos em \(b = 15\) blocos de tamanho \(k = 5\) agrupados em \(r = 3\) repetições, perfazendo assim o total de \(tr = bk = 75\) unidades experimentais.

da <- labestData::ZimmermannTb7.1
str(da)
## 'data.frame':    75 obs. of  4 variables:
##  $ rept: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
##  $ bloc: Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 2 2 2 2 2 ...
##  $ cult: Factor w/ 25 levels "1","2","3","4",..: 17 20 16 19 18 10 9 7 8 6 ...
##  $ prod: num  1875 2125 2250 1562 844 ...
# TODO FIXME: arrumar dado no labestData.
aggregate(prod ~ bloc + rept, data = da, FUN = sum)
##    bloc rept     prod
## 1     1    1  8656.25
## 2     2    1 11500.00
## 3     3    1  8500.00
## 4     4    1 11375.00
## 5     5    1  9250.00
## 6     1    2  9906.25
## 7     2    2 11843.75
## 8     3    2 13375.00
## 9     4    2 15843.75
## 10    5    2 11937.50
## 11    1    3 10718.75
## 12    2    3 14375.00
## 13    3    3 13311.25
## 14    4    3 14031.25
## 15    5    3  8562.50
i <- which(with(da, rept == "3" & bloc == "3" & cult == "4"))
da$prod[i] <- 1906.25

# São 6 blocos de tamanho 6 em cada uma das 2 repetições para acomodar
# 36 cultivares de milho.
with(da, table(cult, bloc, rept)) %>%
    addmargins(1:2) %>%
    print.table(zero.print = ".")
## , , rept = 1
## 
##      bloc
## cult   1  2  3  4  5 Sum
##   1    .  .  1  .  .   1
##   2    .  .  1  .  .   1
##   3    .  .  1  .  .   1
##   4    .  .  1  .  .   1
##   5    .  .  1  .  .   1
##   6    .  1  .  .  .   1
##   7    .  1  .  .  .   1
##   8    .  1  .  .  .   1
##   9    .  1  .  .  .   1
##   10   .  1  .  .  .   1
##   11   .  .  .  1  .   1
##   12   .  .  .  1  .   1
##   13   .  .  .  1  .   1
##   14   .  .  .  1  .   1
##   15   .  .  .  1  .   1
##   16   1  .  .  .  .   1
##   17   1  .  .  .  .   1
##   18   1  .  .  .  .   1
##   19   1  .  .  .  .   1
##   20   1  .  .  .  .   1
##   21   .  .  .  .  1   1
##   22   .  .  .  .  1   1
##   23   .  .  .  .  1   1
##   24   .  .  .  .  1   1
##   25   .  .  .  .  1   1
##   Sum  5  5  5  5  5  25
## 
## , , rept = 2
## 
##      bloc
## cult   1  2  3  4  5 Sum
##   1    .  .  1  .  .   1
##   2    .  .  .  1  .   1
##   3    .  .  .  .  1   1
##   4    1  .  .  .  .   1
##   5    .  1  .  .  .   1
##   6    .  .  1  .  .   1
##   7    .  .  .  1  .   1
##   8    .  .  .  .  1   1
##   9    1  .  .  .  .   1
##   10   .  1  .  .  .   1
##   11   .  .  1  .  .   1
##   12   .  .  .  1  .   1
##   13   .  .  .  .  1   1
##   14   1  .  .  .  .   1
##   15   .  1  .  .  .   1
##   16   .  .  1  .  .   1
##   17   .  .  .  1  .   1
##   18   .  .  .  .  1   1
##   19   1  .  .  .  .   1
##   20   .  1  .  .  .   1
##   21   .  .  1  .  .   1
##   22   .  .  .  1  .   1
##   23   .  .  .  .  1   1
##   24   1  .  .  .  .   1
##   25   .  1  .  .  .   1
##   Sum  5  5  5  5  5  25
## 
## , , rept = 3
## 
##      bloc
## cult   1  2  3  4  5 Sum
##   1    .  .  .  1  .   1
##   2    .  .  .  .  1   1
##   3    1  .  .  .  .   1
##   4    .  .  1  .  .   1
##   5    .  1  .  .  .   1
##   6    .  1  .  .  .   1
##   7    .  .  .  1  .   1
##   8    .  .  .  .  1   1
##   9    1  .  .  .  .   1
##   10   .  .  1  .  .   1
##   11   .  .  1  .  .   1
##   12   .  1  .  .  .   1
##   13   .  .  .  1  .   1
##   14   .  .  .  .  1   1
##   15   1  .  .  .  .   1
##   16   1  .  .  .  .   1
##   17   .  .  1  .  .   1
##   18   .  1  .  .  .   1
##   19   .  .  .  1  .   1
##   20   .  .  .  .  1   1
##   21   .  .  .  .  1   1
##   22   1  .  .  .  .   1
##   23   .  .  1  .  .   1
##   24   .  1  .  .  .   1
##   25   .  .  .  1  .   1
##   Sum  5  5  5  5  5  25
library(igraph)

da$cond <- with(da, interaction(rept, bloc))

edg <- by(data = as.integer(da$cult),
          INDICES = da$cond,
          FUN = combn,
          m = 2) %>%
    flatten_int()

ghp <- graph(edg, directed = FALSE)
plot(ghp,
     vertex.size = 5,
     vertex.label.dist = 1,
     # layout = layout_components,
     layout = layout_in_circle,
     edge.curved = FALSE)

# Quantidade de pares possíveis.
choose(nlevels(da$cult), k = 2)

# Todos os possíveis pares.
pares <- apply(combn(sort(as.character(levels(da$cult))), m = 2),
               MARGIN = 2,
               FUN = paste0,
               collapse = "_") %>%
    tibble(name = ., value = 0)

# Quantas vezes cada par ocorre junto.
by(data = da$cult,
   INDICES = da$cond,
   FUN = function(x) {
       apply(combn(sort(x), m = 2),
             MARGIN = 2,
             FUN = paste0,
             collapse = "_")
   }) %>%
    flatten_chr() %>%
    table() %>%
    enframe() %>%
    bind_rows(pares) %>%
    distinct(name, .keep_all = TRUE) %>%
    split(x = .$name, f = .$value)
# Modelo de efeitos fixos.
m0 <- lm(terms(prod ~ rept/bloc + cult, keep.order = TRUE),
         data = da)

# Quado de anova com hipóteses marginais.
Anova(m0)
## Anova Table (Type II tests)
## 
## Response: prod
##             Sum Sq Df F value    Pr(>F)    
## rept       4346563  2 14.8998 1.929e-05 ***
## rept:bloc  6003398 12  3.4299 0.0020356 ** 
## cult      12026003 24  3.4354 0.0004157 ***
## Residuals  5250951 36                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Médias marginais ajustadas.
emm <- emmeans(m0, specs = ~cult)
## NOTE: A nesting structure was detected in the fitted model:
##     bloc %in% rept
emm
##  cult emmean  SE df lower.CL upper.CL
##  1      2539 246 36     2041     3037
##  2      2075 246 36     1577     2573
##  3      1849 246 36     1351     2347
##  4      1794 246 36     1296     2292
##  5      2462 246 36     1965     2960
##  6      2415 246 36     1917     2913
##  7      3307 246 36     2809     3805
##  8      2786 246 36     2288     3284
##  9      2178 246 36     1680     2676
##  10     1767 246 36     1269     2265
##  11     2225 246 36     1727     2723
##  12     2138 246 36     1640     2635
##  13     2410 246 36     1912     2908
##  14     2434 246 36     1936     2932
##  15     2886 246 36     2388     3384
##  16     3042 246 36     2544     3540
##  17     2551 246 36     2053     3049
##  18     1562 246 36     1065     2060
##  19     2130 246 36     1632     2628
##  20     2496 246 36     1998     2994
##  21     1596 246 36     1098     2094
##  22     2167 246 36     1669     2665
##  23     2129 246 36     1631     2627
##  24     2623 246 36     2125     3121
##  25     2157 246 36     1659     2655
## 
## Results are averaged over the levels of: bloc, rept 
## Confidence level used: 0.95
# Extração da matriz de funções lineares.
L <- attr(emm, "linfct")
grid <- attr(emm, "grid")
rownames(L) <- grid[[1]]

# Entenda como são obtidas as médias marginais.
MASS::fractions(t(L[1:4, ])) %>%
    unique()
##             1    2    3    4   
## (Intercept)    1    1    1    1
## rept2        1/3  1/3  1/3  1/3
## rept1:bloc2 1/15 1/15 1/15 1/15
## cult2          0    1    0    0
## cult3          0    0    1    0
## cult4          0    0    0    1
## cult5          0    0    0    0
# Contrastes par a par.
ctr <- summary(glht(m0, linfct = all_pairwise(L)),
               test = adjusted(type = "fdr"))

# Erros padrões de dois tamanhos conforme estrutura de associados.
v <- c("coefficients", "sigma", "tstat", "pvalues")
ctr$test[v] %>%
    as.data.frame() %>%
    split(., round(.$sigma, 4)) %>%
    map(head, n = 10)
## $`341.5959`
##       coefficients    sigma      tstat   pvalues
## 1vs2     463.54167 341.5959  1.3569882 0.4164385
## 1vs3     689.58333 341.5959  2.0187105 0.1987545
## 1vs4     744.79167 341.5959  2.1803294 0.1614960
## 1vs5      76.04167 341.5959  0.2226071 0.9376131
## 1vs6     123.95833 341.5959  0.3628800 0.8695361
## 1vs7    -768.75000 341.5959 -2.2504658 0.1481772
## 1vs11    313.54167 341.5959  0.9178729 0.5759909
## 1vs13    128.12500 341.5959  0.3750776 0.8621095
## 1vs16   -503.12500 341.5959 -1.4728658 0.3675671
## 1vs19    408.33333 341.5959  1.1953694 0.4960509
## 
## $`355.5443`
##       coefficients    sigma       tstat    pvalues
## 1vs8    -247.91667 355.5443 -0.69728764 0.65638622
## 1vs9     360.41667 355.5443  1.01370387 0.55055898
## 1vs10    771.87500 355.5443  2.17096697 0.16149598
## 1vs12    401.04167 355.5443  1.12796529 0.51874673
## 1vs14    104.16667 355.5443  0.29297800 0.92076611
## 1vs15   -347.91667 355.5443 -0.97854651 0.56348526
## 1vs17    -12.50000 355.5443 -0.03515736 0.98992520
## 1vs18    976.04167 355.5443  2.74520385 0.08539424
## 1vs20     42.70833 355.5443  0.12012098 0.97306706
## 1vs22    371.87500 355.5443  1.04593145 0.54268083
# Comparações múltiplas a 10%.
results_m0 <- wzRfun::apmc(X = L,
                           model = m0,
                           focus = "cult",
                           test = "bonferroni",
                           level = 0.05)
results_m0
##    cult      fit      lwr      upr cld
## 1     1 2538.542 2040.568 3036.515  bc
## 2     2 2075.000 1577.027 2572.973  bc
## 3     3 1848.958 1350.985 2346.932  bc
## 4     4 1793.750 1295.777 2291.723  ac
## 5     5 2462.500 1964.527 2960.473  bc
## 6     6 2414.583 1916.610 2912.557  bc
## 7     7 3307.292 2809.318 3805.265   b
## 8     8 2786.458 2288.485 3284.432  bc
## 9     9 2178.125 1680.152 2676.098  bc
## 10   10 1766.667 1268.693 2264.640  ac
## 11   11 2225.000 1727.027 2722.973  bc
## 12   12 2137.500 1639.527 2635.473  bc
## 13   13 2410.417 1912.443 2908.390  bc
## 14   14 2434.375 1936.402 2932.348  bc
## 15   15 2886.458 2388.485 3384.432  bc
## 16   16 3041.667 2543.693 3539.640  ab
## 17   17 2551.042 2053.068 3049.015  bc
## 18   18 1562.500 1064.527 2060.473   c
## 19   19 2130.208 1632.235 2628.182  bc
## 20   20 2495.833 1997.860 2993.807  bc
## 21   21 1595.833 1097.860 2093.807   c
## 22   22 2166.667 1668.693 2664.640  bc
## 23   23 2129.167 1631.193 2627.140  bc
## 24   24 2622.917 2124.943 3120.890  bc
## 25   25 2157.292 1659.318 2655.265  bc
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results_m0,
       mapping = aes(x = fit, y = reorder(cult, fit))) +
    geom_point() +
    geom_errorbarh(mapping = aes(xmin = lwr, xmax = upr),
                   height = 0) +
    geom_label(mapping = aes(label = sprintf("%0.0f%s", fit, cld)),
               label.padding = unit(0.15, "lines"),
               fill = "black",
               colour = "white",
               size = 3,
               nudge_x = 75,
               vjust = 0.5) +
    labs(x = "Produção",
         y = "Cultivares")

# Ajuste do modelo de efeito aleatório de bloc.
mm0 <- lmer(prod ~ rept + (1 | rept:bloc) + cult, data = da)

# Quadro de teste de Wald.
anova(mm0)
## Type III Analysis of Variance Table with Satterthwaite's method
##        Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
## rept   935780  467890     2  9.750  3.2078 0.0850170 .  
## cult 12545810  522742    24 39.345  3.5839 0.0001915 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros dos termos de efeito.
summary(mm0)
## Linear mixed model fit by REML. t-tests use Satterthwaite's  method
##  [lmerModLmerTest]
## Formula: prod ~ rept + (1 | rept:bloc) + cult
##    Data: da
## 
## REML criterion at convergence: 754.6
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.08640 -0.51285  0.04899  0.45165  1.78751 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  rept:bloc (Intercept) 106327   326.1   
##  Residual              145860   381.9   
## Number of obs: 75, groups:  rept:bloc, 15
## 
## Fixed effects:
##             Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)  2217.14     286.43    42.40   7.741 1.21e-09 ***
## rept2         545.00     232.81     9.75   2.341  0.04189 *  
## rept3         467.50     232.81     9.75   2.008  0.07313 .  
## cult2        -507.58     333.19    39.63  -1.523  0.13560    
## cult3        -752.75     333.19    39.63  -2.259  0.02944 *  
## cult4        -773.64     333.19    39.63  -2.322  0.02546 *  
## cult5         -72.09     333.19    39.63  -0.216  0.82981    
## cult6         -66.56     333.19    39.63  -0.200  0.84269    
## cult7         833.13     333.19    39.63   2.500  0.01664 *  
## cult8         181.71     343.38    41.07   0.529  0.59952    
## cult9        -446.67     343.38    41.07  -1.301  0.20057    
## cult10       -750.31     343.38    41.07  -2.185  0.03464 *  
## cult11       -258.57     333.19    39.63  -0.776  0.44233    
## cult12       -299.30     343.38    41.07  -0.872  0.38847    
## cult13       -105.95     333.19    39.63  -0.318  0.75216    
## cult14       -213.50     343.38    41.07  -0.622  0.53753    
## cult15        292.04     343.38    41.07   0.850  0.39999    
## cult16        429.33     333.19    39.63   1.289  0.20504    
## cult17         60.48     343.38    41.07   0.176  0.86104    
## cult18       -967.84     343.38    41.07  -2.819  0.00739 ** 
## cult19       -480.61     333.19    39.63  -1.442  0.15703    
## cult20       -173.00     343.38    41.07  -0.504  0.61709    
## cult21      -1011.04     333.19    39.63  -3.034  0.00424 ** 
## cult22       -372.79     343.38    41.07  -1.086  0.28396    
## cult23       -375.06     343.38    41.07  -1.092  0.28108    
## cult24         78.00     343.38    41.07   0.227  0.82143    
## cult25       -394.61     333.19    39.63  -1.184  0.24333    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation matrix not shown by default, as p = 27 > 12.
## Use print(x, correlation=TRUE)  or
##     vcov(x)        if you need it
# Médias marginais ajustadas.
emm <- emmeans(mm0, specs = ~cult)
emm
##  cult emmean  SE   df lower.CL upper.CL
##  1      2555 256 47.6     2040     3069
##  2      2047 256 47.6     1532     2562
##  3      1802 256 47.6     1287     2317
##  4      1781 256 47.6     1266     2296
##  5      2483 256 47.6     1968     2997
##  6      2488 256 47.6     1973     3003
##  7      3388 256 47.6     2873     3902
##  8      2736 256 47.6     2222     3251
##  9      2108 256 47.6     1593     2623
##  10     1804 256 47.6     1290     2319
##  11     2296 256 47.6     1781     2811
##  12     2255 256 47.6     1741     2770
##  13     2449 256 47.6     1934     2963
##  14     2341 256 47.6     1826     2856
##  15     2847 256 47.6     2332     3361
##  16     2984 256 47.6     2469     3499
##  17     2615 256 47.6     2100     3130
##  18     1587 256 47.6     1072     2101
##  19     2074 256 47.6     1559     2589
##  20     2382 256 47.6     1867     2896
##  21     1544 256 47.6     1029     2058
##  22     2182 256 47.6     1667     2696
##  23     2180 256 47.6     1665     2694
##  24     2633 256 47.6     2118     3147
##  25     2160 256 47.6     1645     2675
## 
## Results are averaged over the levels of: rept 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95
# Extração da matriz de funções lineares.
grid <- attr(emm, "grid")
L <- attr(emm, "linfct")
rownames(L) <- grid[[1]]

# Contrastes par a par.
ctr <- summary(glht(mm0, linfct = all_pairwise(L)),
               test = adjusted(type = "fdr"))

# Erros padrões de dois tamanhos conforme estrutura de associados.
v <- c("coefficients", "sigma", "tstat", "pvalues")
ctr$test[v] %>%
    as.data.frame() %>%
    split(., round(.$sigma, 4)) %>%
    map(head, n = 10)
## $`333.193`
##       coefficients   sigma      tstat    pvalues
## 1vs2     507.57836 333.193  1.5233765 0.31259352
## 1vs3     752.75321 333.193  2.2592108 0.10874220
## 1vs4     773.64329 333.193  2.3219075 0.09562056
## 1vs5      72.09355 333.193  0.2163717 0.89427841
## 1vs6      66.55878 333.193  0.1997605 0.90178707
## 1vs7    -833.13468 333.193 -2.5004568 0.07155765
## 1vs11    258.57173 333.193  0.7760419 0.63438296
## 1vs13    105.95480 333.193  0.3179983 0.85050862
## 1vs16   -429.32558 333.193 -1.2885192 0.40221438
## 1vs19    480.61425 333.193  1.4424501 0.34112996
## 
## $`343.3751`
##       coefficients    sigma      tstat    pvalues
## 1vs8    -181.70978 343.3751 -0.5291873 0.74735016
## 1vs9     446.66784 343.3751  1.3008159 0.39755658
## 1vs10    750.31221 343.3751  2.1851093 0.12203170
## 1vs12    299.30172 343.3751  0.8716464 0.58984813
## 1vs14    213.49914 343.3751  0.6217665 0.69968836
## 1vs15   -292.03562 343.3751 -0.8504856 0.59856841
## 1vs17    -60.48481 343.3751 -0.1761479 0.91184921
## 1vs18    967.84173 343.3751  2.8186133 0.04136174
## 1vs20    172.99620 343.3751  0.5038111 0.76480598
## 1vs22    372.78610 343.3751  1.0856526 0.48707497
# As mesmas comparações múltiplas.
results_mm0 <- wzRfun::apmc(L,
                            model = mm0,
                            focus = "cult",
                            test = "bonferroni",
                            level = 0.05)
results_mm0
##    cult      fit      lwr      upr cld
## 1     1 2554.638 2058.898 3050.377  ad
## 2     2 2047.059 1551.320 2542.799 bcd
## 3     3 1801.885 1306.145 2297.624 bcd
## 4     4 1780.995 1285.255 2276.734 bcd
## 5     5 2482.544 1986.805 2978.284  ad
## 6     6 2488.079 1992.340 2983.818  ad
## 7     7 3387.773 2892.033 3883.512   a
## 8     8 2736.348 2240.608 3232.087  ad
## 9     9 2107.970 1612.231 2603.709 bcd
## 10   10 1804.326 1308.586 2300.065 bcd
## 11   11 2296.066 1800.327 2791.806  ad
## 12   12 2255.336 1759.597 2751.076  ad
## 13   13 2448.683 1952.944 2944.422  ad
## 14   14 2341.139 1845.399 2836.878  ad
## 15   15 2846.673 2350.934 3342.413  ac
## 16   16 2983.963 2488.224 3479.703  ab
## 17   17 2615.123 2119.383 3110.862  ad
## 18   18 1586.796 1091.057 2082.536  cd
## 19   19 2074.024 1578.284 2569.763 bcd
## 20   20 2381.642 1885.902 2877.381  ad
## 21   21 1543.597 1047.857 2039.336   d
## 22   22 2181.852 1686.112 2677.591  ad
## 23   23 2179.581 1683.842 2675.321  ad
## 24   24 2632.635 2136.896 3128.375  ad
## 25   25 2160.025 1664.286 2655.764  ad
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results_mm0,
       mapping = aes(x = fit, y = reorder(cult, fit))) +
    geom_point() +
    geom_errorbarh(mapping = aes(xmin = lwr, xmax = upr),
                   height = 0) +
    geom_label(mapping = aes(label = sprintf("%0.0f%s", fit, cld)),
               label.padding = unit(0.15, "lines"),
               fill = "black",
               colour = "white",
               size = 3,
               nudge_x = 75,
               vjust = 0.5) +
    labs(x = "Produção",
         y = "Cultivares")

16.4 ZimmermannTb7.4

Os dados em ZimmermannTb7.4 são registros da produção de grãos (kg/ha) de um experimento em látice reticulado retangular de competição de cultivares e linhagens de arroz irrigado. Foram avaliadas \(t = 30\) tratamentos com \(r = 3\) repetições usando-se \(b = 18\) blocos de tamanho \(k = 5\), o que soma \(tr = bk = 90\) unidades experimentais.

da <- labestData::ZimmermannTb7.4
str(da)
## 'data.frame':    90 obs. of  4 variables:
##  $ rept: Factor w/ 3 levels "X","Y","Z": 1 1 1 1 1 1 1 1 1 1 ...
##  $ bloc: Factor w/ 18 levels "X1","X2","X3",..: 1 1 1 1 1 2 2 2 2 2 ...
##  $ cult: Factor w/ 30 levels "1","2","3","4",..: 5 1 4 3 2 10 9 6 8 7 ...
##  $ prod: num  4256 4628 4890 3713 4602 ...
# NOTE: Codificar bloco dentro de repetição.
da <- da %>%
    group_by(rept) %>%
    mutate(bloc = factor(as.numeric(bloc), labels = 1:6)) %>%
    ungroup()

# São 6 blocos de tamanho 5 em cada uma das 3 repetições para acomodar
# 30 tratamentos.
with(da, table(cult, rept:bloc)) %>%
    addmargins(1:2) %>%
    print.table(zero.print = ".")
##      
## cult  X:1 X:2 X:3 X:4 X:5 X:6 Y:1 Y:2 Y:3 Y:4 Y:5 Y:6 Z:1 Z:2 Z:3
##   1     1   .   .   .   .   .   .   1   .   .   .   .   .   .   1
##   2     1   .   .   .   .   .   .   .   1   .   .   .   .   .   .
##   3     1   .   .   .   .   .   .   .   .   1   .   .   .   .   .
##   4     1   .   .   .   .   .   .   .   .   .   1   .   .   .   .
##   5     1   .   .   .   .   .   .   .   .   .   .   1   .   1   .
##   6     .   1   .   .   .   .   1   .   .   .   .   .   .   .   .
##   7     .   1   .   .   .   .   .   .   1   .   .   .   1   .   .
##   8     .   1   .   .   .   .   .   .   .   1   .   .   .   .   1
##   9     .   1   .   .   .   .   .   .   .   .   1   .   .   .   .
##   10    .   1   .   .   .   .   .   .   .   .   .   1   .   .   .
##   11    .   .   1   .   .   .   1   .   .   .   .   .   .   .   .
##   12    .   .   1   .   .   .   .   1   .   .   .   .   .   .   .
##   13    .   .   1   .   .   .   .   .   .   1   .   .   1   .   .
##   14    .   .   1   .   .   .   .   .   .   .   1   .   .   1   .
##   15    .   .   1   .   .   .   .   .   .   .   .   1   .   .   .
##   16    .   .   .   1   .   .   1   .   .   .   .   .   .   1   .
##   17    .   .   .   1   .   .   .   1   .   .   .   .   .   .   .
##   18    .   .   .   1   .   .   .   .   1   .   .   .   .   .   .
##   19    .   .   .   1   .   .   .   .   .   .   1   .   1   .   .
##   20    .   .   .   1   .   .   .   .   .   .   .   1   .   .   1
##   21    .   .   .   .   1   .   1   .   .   .   .   .   .   .   1
##   22    .   .   .   .   1   .   .   1   .   .   .   .   .   .   .
##   23    .   .   .   .   1   .   .   .   1   .   .   .   .   1   .
##   24    .   .   .   .   1   .   .   .   .   1   .   .   .   .   .
##   25    .   .   .   .   1   .   .   .   .   .   .   1   1   .   .
##   26    .   .   .   .   .   1   1   .   .   .   .   .   .   .   .
##   27    .   .   .   .   .   1   .   1   .   .   .   .   1   .   .
##   28    .   .   .   .   .   1   .   .   1   .   .   .   .   .   .
##   29    .   .   .   .   .   1   .   .   .   1   .   .   .   1   .
##   30    .   .   .   .   .   1   .   .   .   .   1   .   .   .   1
##   Sum   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5
##      
## cult  Z:4 Z:5 Z:6 Sum
##   1     .   .   .   3
##   2     1   .   .   3
##   3     .   1   .   3
##   4     .   .   1   3
##   5     .   .   .   3
##   6     .   .   1   3
##   7     .   .   .   3
##   8     .   .   .   3
##   9     1   .   .   3
##   10    .   1   .   3
##   11    .   1   .   3
##   12    .   .   1   3
##   13    .   .   .   3
##   14    .   .   .   3
##   15    1   .   .   3
##   16    .   .   .   3
##   17    .   1   .   3
##   18    .   .   1   3
##   19    .   .   .   3
##   20    .   .   .   3
##   21    .   .   .   3
##   22    1   .   .   3
##   23    .   .   .   3
##   24    .   .   1   3
##   25    .   .   .   3
##   26    1   .   .   3
##   27    .   .   .   3
##   28    .   1   .   3
##   29    .   .   .   3
##   30    .   .   .   3
##   Sum   5   5   5  90
library(igraph)

da$cond <- with(da, interaction(rept, bloc))

edg <- by(data = as.integer(da$cult),
          INDICES = da$cond,
          FUN = combn,
          m = 2) %>%
    flatten_int()

ghp <- graph(edg, directed = FALSE)
plot(ghp,
     vertex.size = 5,
     vertex.label.dist = 1,
     # layout = layout_components,
     layout = layout_in_circle,
     edge.curved = FALSE)

# Quantidade de pares possíveis.
choose(nlevels(da$cult), k = 2)

# Todos os possíveis pares.
pares <- apply(combn(sort(as.character(levels(da$cult))), m = 2),
               MARGIN = 2,
               FUN = paste0,
               collapse = "_") %>%
    tibble(name = ., value = 0)

# Quantas vezes cada par ocorre junto.
by(data = da$cult,
   INDICES = da$cond,
   FUN = function(x) {
       apply(combn(sort(x), m = 2),
             MARGIN = 2,
             FUN = paste0,
             collapse = "_")
   }) %>%
    flatten_chr() %>%
    table() %>%
    enframe() %>%
    bind_rows(pares) %>%
    distinct(name, .keep_all = TRUE) %>%
    split(x = .$name, f = .$value)
# Modelo de efeitos fixos.
m0 <- lm(terms(prod ~ rept/bloc + cult, keep.order = TRUE),
         data = da)

# Quado de anova com hipóteses marginais.
Anova(m0)
## Anova Table (Type II tests)
## 
## Response: prod
##             Sum Sq Df F value    Pr(>F)    
## rept       1439299  2  2.4512   0.09815 .  
## rept:bloc  8493032 15  1.9285   0.04698 *  
## cult      51348862 29  6.0309 7.942e-08 ***
## Residuals 12624615 43                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Médias marginais ajustadas.
emm <- emmeans(m0, specs = ~cult)
## NOTE: A nesting structure was detected in the fitted model:
##     bloc %in% rept
emm
##  cult emmean  SE df lower.CL upper.CL
##  1      5011 352 43     4302     5721
##  2      5150 352 43     4441     5860
##  3      4203 352 43     3494     4913
##  4      4389 352 43     3680     5099
##  5      4249 352 43     3540     4958
##  6      4997 352 43     4287     5706
##  7      5561 352 43     4851     6270
##  8      5339 352 43     4629     6048
##  9      5741 352 43     5032     6451
##  10     5555 352 43     4845     6264
##  11     5253 352 43     4544     5962
##  12     5232 352 43     4522     5941
##  13     4603 352 43     3894     5312
##  14     5325 352 43     4616     6035
##  15     6742 352 43     6033     7452
##  16     6064 352 43     5355     6773
##  17     6428 352 43     5719     7137
##  18     5657 352 43     4947     6366
##  19     6134 352 43     5425     6843
##  20     5635 352 43     4926     6345
##  21     5251 352 43     4542     5961
##  22     4902 352 43     4193     5611
##  23     4498 352 43     3789     5207
##  24     5360 352 43     4651     6070
##  25     5502 352 43     4793     6212
##  26     3939 352 43     3230     4649
##  27     4837 352 43     4127     5546
##  28     7800 352 43     7091     8509
##  29     5135 352 43     4426     5845
##  30     6961 352 43     6251     7670
## 
## Results are averaged over the levels of: bloc, rept 
## Confidence level used: 0.95
# Extração da matriz de funções lineares.
L <- attr(emm, "linfct")
grid <- attr(emm, "grid")
rownames(L) <- grid[[1]]

# Entenda como são obtidas as médias marginais.
MASS::fractions(t(L[1:4, ])) %>%
    unique()
##             1    2    3    4   
## (Intercept)    1    1    1    1
## reptY        1/3  1/3  1/3  1/3
## reptX:bloc2 1/18 1/18 1/18 1/18
## cult2          0    1    0    0
## cult3          0    0    1    0
## cult4          0    0    0    1
## cult5          0    0    0    0
# Contrastes par a par.
ctr <- summary(glht(m0, linfct = all_pairwise(L)),
               test = adjusted(type = "fdr"))

# Erros padrões de vários tamanhos conforme estrutura de associados.
v <- c("coefficients", "sigma", "tstat", "pvalues")
ctr$test[v] %>%
    as.data.frame() %>%
    split(., round(.$sigma, 4)) %>%
    map(head, n = 4)
## $`485.388`
##       coefficients   sigma     tstat    pvalues
## 1vs3      807.9878 485.388  1.664623 0.21911133
## 1vs4      622.0736 485.388  1.281601 0.36136548
## 1vs17   -1416.6785 485.388 -2.918652 0.02754887
## 1vs20    -623.9886 485.388 -1.285546 0.36136548
## 
## $`487.2513`
##       coefficients    sigma      tstat   pvalues
## 1vs2     -138.9827 487.2513 -0.2852383 0.8620446
## 1vs5      762.5234 487.2513  1.5649490 0.2533732
## 1vs8     -327.2198 487.2513 -0.6715627 0.6703432
## 1vs12    -220.0973 487.2513 -0.4517122 0.7695007
## 
## $`489.1075`
##        coefficients    sigma       tstat    pvalues
## 9vs22    839.268889 489.1075 1.715919173 0.20727666
## 11vs21     1.598889 489.1075 0.003268993 0.99740684
## 14vs23   827.227037 489.1075 1.691299120 0.21212478
## 15vs20  1106.852963 489.1075 2.263005630 0.08994443
## 
## $`505.5067`
##       coefficients    sigma      tstat   pvalues
## 1vs24    -348.9206 505.5067 -0.6902394 0.6588416
## 2vs10    -404.2844 505.5067 -0.7997607 0.5994884
## 3vs12   -1028.0852 505.5067 -2.0337718 0.1270049
## 4vs8     -949.2934 505.5067 -1.8779048 0.1623681
## 
## $`507.2961`
##       coefficients    sigma     tstat     pvalues
## 1vs9     -729.8814 507.2961 -1.438768 0.297796903
## 1vs10    -543.2671 507.2961 -1.070907 0.469258810
## 1vs15   -1730.8416 507.2961 -3.411896 0.009931507
## 1vs18    -645.2338 507.2961 -1.271908 0.364363491
## 
## $`509.0792`
##       coefficients    sigma       tstat   pvalues
## 1vs6      14.75448 509.0792  0.02898267 0.9837062
## 1vs11   -241.43049 509.0792 -0.47424938 0.7642118
## 1vs13    408.44096 509.0792  0.80231319 0.5994884
## 1vs14   -313.85901 509.0792 -0.61652296 0.6888182
## 
## $`510.8561`
##       coefficients    sigma     tstat     pvalues
## 1vs7     -549.1352 510.8561 -1.074931 0.469258810
## 2vs13     547.4237 510.8561  1.071581 0.469258810
## 3vs19   -1930.7022 510.8561 -3.779347 0.004256734
## 4vs25   -1112.8578 510.8561 -2.178417 0.101900890
# Comparações múltiplas.
results_m0 <- wzRfun::apmc(X = L,
                           model = m0,
                           focus = "cult",
                           test = "bonferroni",
                           level = 0.05)
results_m0
##    cult      fit      lwr      upr cld
## 1     1 5011.481 4302.217 5720.746 bdf
## 2     2 5150.464 4441.199 5859.729 bdf
## 3     3 4203.493 3494.229 4912.758  ef
## 4     4 4389.408 3680.143 5098.672  df
## 5     5 4248.958 3539.693 4958.222  ef
## 6     6 4996.727 4287.462 5705.991 bdf
## 7     7 5560.616 4851.352 6269.881 bdf
## 8     8 5338.701 4629.436 6047.966 bdf
## 9     9 5741.363 5032.098 6450.627 adf
## 10   10 5554.748 4845.484 6264.013 bdf
## 11   11 5252.912 4543.647 5962.176 bdf
## 12   12 5231.579 4522.314 5940.843 bdf
## 13   13 4603.040 3893.776 5312.305  df
## 14   14 5325.340 4616.076 6034.605 bdf
## 15   15 6742.323 6033.058 7451.587 abc
## 16   16 6063.854 5354.589 6773.119 ade
## 17   17 6428.160 5718.895 7137.424  ad
## 18   18 5656.715 4947.450 6365.980 bdf
## 19   19 6134.196 5424.931 6843.460 ade
## 20   20 5635.470 4926.205 6344.734 bdf
## 21   21 5251.313 4542.048 5960.577 bdf
## 22   22 4902.094 4192.829 5611.358 bdf
## 23   23 4498.113 3788.849 5207.378  df
## 24   24 5360.402 4651.137 6069.666 bdf
## 25   25 5502.265 4793.001 6211.530 bdf
## 26   26 3939.261 3229.996 4648.526   f
## 27   27 4836.762 4127.497 5546.026 cdf
## 28   28 7799.973 7090.708 8509.237   a
## 29   29 5135.264 4426.000 5844.529 bdf
## 30   30 6960.754 6251.490 7670.019  ab
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results_m0,
       mapping = aes(x = fit, y = reorder(cult, fit))) +
    geom_point() +
    geom_errorbarh(mapping = aes(xmin = lwr, xmax = upr),
                   height = 0) +
    geom_label(mapping = aes(label = sprintf("%0.0f%s", fit, cld)),
               label.padding = unit(0.15, "lines"),
               fill = "black",
               colour = "white",
               size = 3,
               nudge_x = 120,
               vjust = 0.5) +
    labs(x = "Produção",
         y = "Cultivares")

FIXME: por que são 6 tamanhos de erro padrão no reticulado retangular?

# Ajuste do modelo de efeito aleatório de bloc.
mm0 <- lmer(prod ~ rept + (1 | rept:bloc) + cult, data = da)

# Quadro de teste de Wald.
anova(mm0)
## Type III Analysis of Variance Table with Satterthwaite's method
##        Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
## rept   611521  305761     2  9.274  1.0295    0.3947    
## cult 51726584 1783675    29 48.360  6.0056 2.562e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros dos termos de efeito.
summary(mm0)
## Linear mixed model fit by REML. t-tests use Satterthwaite's  method
##  [lmerModLmerTest]
## Formula: prod ~ rept + (1 | rept:bloc) + cult
##    Data: da
## 
## REML criterion at convergence: 943.8
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -1.94004 -0.52107 -0.04114  0.47160  1.87929 
## 
## Random effects:
##  Groups    Name        Variance Std.Dev.
##  rept:bloc (Intercept)  80407   283.6   
##  Residual              297003   545.0   
## Number of obs: 90, groups:  rept:bloc, 18
## 
## Fixed effects:
##              Estimate Std. Error        df t value Pr(>|t|)    
## (Intercept)  4906.836    361.949    56.728  13.557  < 2e-16 ***
## reptY         303.314    215.876     9.274   1.405  0.19261    
## reptZ         206.111    215.876     9.274   0.955  0.36392    
## cult2         -27.959    466.149    50.862  -0.060  0.95241    
## cult3        -880.042    465.690    50.532  -1.890  0.06453 .  
## cult4        -620.446    465.690    50.532  -1.332  0.18873    
## cult5        -891.870    466.149    50.862  -1.913  0.06135 .  
## cult6          16.176    476.608    54.222   0.034  0.97305    
## cult7         511.132    477.056    54.463   1.071  0.28870    
## cult8         519.040    466.149    50.862   1.113  0.27074    
## cult9         596.159    476.159    53.973   1.252  0.21596    
## cult10        245.437    476.159    53.973   0.515  0.60834    
## cult11         28.563    476.608    54.222   0.060  0.95243    
## cult12        240.731    466.149    50.862   0.516  0.60779    
## cult13       -271.559    476.608    54.222  -0.570  0.57118    
## cult14        286.280    476.608    54.222   0.601  0.55057    
## cult15       1513.008    476.159    53.973   3.178  0.00246 ** 
## cult16        960.478    476.608    54.222   2.015  0.04885 *  
## cult17       1125.649    465.690    50.532   2.417  0.01929 *  
## cult18        586.485    476.159    53.973   1.232  0.22340    
## cult19       1021.613    476.159    53.973   2.146  0.03643 *  
## cult20        493.714    465.690    50.532   1.060  0.29411    
## cult21        316.072    466.149    50.862   0.678  0.50081    
## cult22       -198.869    465.690    50.532  -0.427  0.67116    
## cult23       -502.825    476.608    54.222  -1.055  0.29610    
## cult24        586.609    475.710    53.717   1.233  0.22290    
## cult25        427.123    476.159    53.973   0.897  0.37369    
## cult26      -1264.213    476.159    53.973  -2.655  0.01040 *  
## cult27       -268.424    466.149    50.862  -0.576  0.56727    
## cult28       2497.388    476.159    53.973   5.245 2.68e-06 ***
## cult29        201.801    476.159    53.973   0.424  0.67339    
## cult30       1909.155    465.690    50.532   4.100  0.00015 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation matrix not shown by default, as p = 32 > 12.
## Use print(x, correlation=TRUE)  or
##     vcov(x)        if you need it
# Médias marginais ajustadas.
emm <- emmeans(mm0, specs = ~cult)
emm
##  cult emmean  SE df lower.CL upper.CL
##  1      5077 347 57     4382     5771
##  2      5049 347 57     4354     5743
##  3      4197 347 57     3502     4891
##  4      4456 347 57     3762     5151
##  5      4185 347 57     3490     4879
##  6      5093 347 57     4398     5787
##  7      5588 347 57     4893     6282
##  8      5596 347 57     4901     6290
##  9      5673 347 57     4978     6367
##  10     5322 347 57     4628     6016
##  11     5105 347 57     4411     5800
##  12     5317 347 57     4623     6012
##  13     4805 347 57     4111     5499
##  14     5363 347 57     4669     6057
##  15     6590 347 57     5895     7284
##  16     6037 347 57     5343     6731
##  17     6202 347 57     5508     6897
##  18     5663 347 57     4969     6357
##  19     6098 347 57     5404     6793
##  20     5570 347 57     4876     6265
##  21     5393 347 57     4698     6087
##  22     4878 347 57     4183     5572
##  23     4574 347 57     3879     5268
##  24     5663 347 57     4969     6358
##  25     5504 347 57     4809     6198
##  26     3812 347 57     3118     4507
##  27     4808 347 57     4114     5503
##  28     7574 347 57     6880     8268
##  29     5278 347 57     4584     5973
##  30     6986 347 57     6291     7680
## 
## Results are averaged over the levels of: rept 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95
# Extração da matriz de funções lineares.
grid <- attr(emm, "grid")
L <- attr(emm, "linfct")
rownames(L) <- grid[[1]]

# Contrastes par a par.
ctr <- summary(glht(mm0, linfct = all_pairwise(L)),
               test = adjusted(type = "fdr"))

# Erros padrões de dois tamanhos conforme estrutura de associados.
v <- c("coefficients", "sigma", "tstat", "pvalues")
ctr$test[v] %>%
    as.data.frame() %>%
    split(., round(.$sigma, 4)) %>%
    map(head, n = 4)
## $`465.6904`
##       coefficients    sigma     tstat    pvalues
## 1vs3      880.0416 465.6904  1.889757 0.14177285
## 1vs4      620.4462 465.6904  1.332315 0.33686104
## 1vs17   -1125.6486 465.6904 -2.417161 0.05121174
## 1vs20    -493.7140 465.6904 -1.060176 0.44589718
## 
## $`466.1488`
##       coefficients    sigma       tstat   pvalues
## 1vs2      27.95906 466.1488  0.05997882 0.9769152
## 1vs5     891.87026 466.1488  1.91327355 0.1376998
## 1vs8    -519.03956 466.1488 -1.11346314 0.4293556
## 1vs12   -240.73145 466.1488 -0.51642613 0.7264838
## 
## $`466.6068`
##        coefficients    sigma     tstat    pvalues
## 9vs22      795.0282 466.6068  1.703850 0.19521798
## 11vs21    -287.5087 466.6068 -0.616169 0.68804584
## 14vs23     789.1052 466.6068  1.691157 0.19750502
## 15vs20    1019.2939 466.6068  2.184481 0.08388801
## 
## $`475.7104`
##       coefficients    sigma      tstat    pvalues
## 1vs24    -586.6085 475.7104 -1.2331210 0.37641531
## 2vs10    -273.3956 475.7104 -0.5747102 0.69714866
## 3vs12   -1120.7730 475.7104 -2.3559985 0.05825712
## 4vs8    -1139.4857 475.7104 -2.3953348 0.05390492
## 
## $`476.1592`
##       coefficients    sigma      tstat     pvalues
## 1vs9     -596.1593 476.1592 -1.2520168 0.369335609
## 1vs10    -245.4366 476.1592 -0.5154506 0.726483752
## 1vs15   -1513.0079 476.1592 -3.1775252 0.008501835
## 1vs18    -586.4852 476.1592 -1.2316997 0.376415309
## 
## $`476.6076`
##       coefficients    sigma       tstat   pvalues
## 1vs6     -16.17564 476.6076 -0.03393911 0.9911538
## 1vs11    -28.56294 476.6076 -0.05992968 0.9769152
## 1vs13    271.55915 476.6076  0.56977514 0.6971487
## 1vs14   -286.27995 476.6076 -0.60066178 0.6950682
## 
## $`477.0555`
##       coefficients    sigma      tstat      pvalues
## 1vs7     -511.1321 477.0555 -1.0714310 0.4411764685
## 2vs13     243.6001 477.0555  0.5106326 0.7285154857
## 3vs19   -1901.6550 477.0555 -3.9862341 0.0006213121
## 4vs25   -1047.5694 477.0555 -2.1959067 0.0820328981
# As mesmas comparações múltiplas.
results_mm0 <- wzRfun::apmc(L,
                            model = mm0,
                            focus = "cult",
                            test = "bonferroni",
                            level = 0.05)
results_mm0
##    cult      fit      lwr      upr  cld
## 1     1 5076.645 4410.624 5742.665  cdf
## 2     2 5048.686 4382.665 5714.706  cdf
## 3     3 4196.603 3530.583 4862.624   ef
## 4     4 4456.199 3790.178 5122.219   df
## 5     5 4184.775 3518.754 4850.795   ef
## 6     6 5092.820 4426.800 5758.841  cdf
## 7     7 5587.777 4921.756 6253.797 bcdf
## 8     8 5595.684 4929.664 6261.705 bcdf
## 9     9 5672.804 5006.784 6338.825 bcde
## 10   10 5322.081 4656.061 5988.102 bcdf
## 11   11 5105.208 4439.187 5771.228  cdf
## 12   12 5317.376 4651.356 5983.397 bcdf
## 13   13 4805.086 4139.065 5471.106  cdf
## 14   14 5362.925 4696.904 6028.945 bcdf
## 15   15 6589.653 5923.632 7255.673   ac
## 16   16 6037.122 5371.102 6703.143   ad
## 17   17 6202.293 5536.273 6868.314   ad
## 18   18 5663.130 4997.109 6329.150 bcde
## 19   19 6098.258 5432.238 6764.279   ad
## 20   20 5570.359 4904.338 6236.379 bcdf
## 21   21 5392.716 4726.696 6058.737 bcdf
## 22   22 4877.776 4211.755 5543.796  cdf
## 23   23 4573.820 3907.799 5239.840   df
## 24   24 5663.253 4997.233 6329.274 bcde
## 25   25 5503.768 4837.747 6169.789 bcdf
## 26   26 3812.432 3146.411 4478.452    f
## 27   27 4808.220 4142.200 5474.241  cdf
## 28   28 7574.033 6908.012 8240.053    a
## 29   29 5278.446 4612.425 5944.466 bcdf
## 30   30 6985.800 6319.780 7651.821   ab
# Gráfico de segmentos para as estimativas intervalares.
ggplot(data = results_mm0,
       mapping = aes(x = fit, y = reorder(cult, fit))) +
    geom_point() +
    geom_errorbarh(mapping = aes(xmin = lwr, xmax = upr),
                   height = 0) +
    geom_label(mapping = aes(label = sprintf("%0.0f%s", fit, cld)),
               label.padding = unit(0.15, "lines"),
               fill = "black",
               colour = "white",
               size = 3,
               nudge_x = 120,
               vjust = 0.5) +
    labs(x = "Produção",
         y = "Cultivares")

Referências Bibliográficas

RAMALHO, M. A. P.; FERREIRA, D. F.; OLIVEIRA, A. C. Experimentação em genética e melhoramento de plantas. 2nd ed. Lavras, MG: Editora UFLA, 2005.


Manual de Planejamento e Análise de Experimentos com R
Walmes Marques Zeviani