Capítulo 6 Confundimento para blocagem em fatoriais 2k
6.1 Fundamentação
Existem certas situações em que é praticamente impossível fazer todas as corridas de um experimento em condições uniformes. Por exemplo, pode haver limitações da quantidade de matéria prima, ou matéria prima de diversas origens. As condições de contorno podem mudar ao longo do ensaio (temperatura, ventilação, luz). Pode existir um número elevado de tratamentos difícil de acomodar em um curto espaço de tempo/espaço ou reduzído número de instrumentos/operadores, além de ser desejável variar as condições de contorno para garantir eficiência/robustez aos resultados. A técnica experimental adotada nessas situações é a blocagem.
A blocagem é um recursos para garantir controle local. A idéia central da blocagem é fazer com que as unidades experimentais (UEs) sejam homogêneas dentro dos blocos. Os blocos são completos quando em cada bloco existe pelo menos uma UE de cada ponto experimental, e incompleto caso contrário.
Nos experimentos 2k existe uma série de opções de blocagem. A primeira é repetir o experimento de forma que cada repetição completa (que inclui todos os pontos experimentais) seja um bloco. É o caso comum quando tem-se poucos tratamentos (geralmente 22 ou 23), e nesses casos específicos temos um fatorial com blocos completos.
Como nos experimentos fatorias 2k (k≥3) o número de pontos experimentais geralmente é grande, devido ao caráter exploratório do experimento, os blocos dificilmente cumprirão seu papel se forem completos, por isso geralmente adota-se blocos incompletos. Nesse caso os tratamentos devem ser particionados e atribuídos aos blocos. Nada impede que essa partição dos tratamentos seja aleatória, porém quando feita estrategicamente leva-se algumas vantagens.
A estratégia adotada para se atribuir os tratamentos aos blocos é a de confundimento. A idéia central é tomar interações de alta ordem, pois tem menor contribuição pelo princípio da esparsidade, e propositalmente confundir o efeito dessa interação com o efeito dos blocos. Isso porque interações de ordem alta dificilmente são interpretáveis, e o efeito puro dos blocos não é do interesse do pesquisador. O bloco está presente para acomodar alterações das condições de contorno. Dessa forma, não é desconforto ter esses efeitos confundidos/misturados quando o foco do experimento são os efeitos principais e interações de ordem mais baixa.
Vamos considerar a construção e análise de fatoriais 2k em 2p blocos incompletos, onde p<k. Consequentemente, estes experimentos podem ser divididos em 2, 4, 8, … blocos.

Figura 6.1: Representação geométrica da blocagem feita em um fatorial 23 para alocação dos pontos experimentais em 2 blocos usando a interação ABC para o confundimento.

Figura 6.2: Ilustração da alocação dos pontos experimentais de um planejamento fatorial 23 em 2 blocos usando para o confundimento com os blocos a interação tripla, ou seja, com o contraste de definição I=ABC.

Figura 6.3: Ilustração da alocação dos pontos experimentais de um planejamento fatorial 23 em 4 blocos usando para o confundimento com os blocos duas interações duplas, no caso, com os contrastes de definição I1=AB e I2=AC.
TODO a análise do experimento com blocos completos…
TODO tabela de sinais …
O método mais geral para construir os blocos é através dos contrastes de definição. Esse método é usar para os experimentos fatoriais 3k também. Este método usa uma combinção linear L=α1x1+α2x2+⋯+αkxk,
em que xi é o nível do i-ésimo fator aparecendo em um ponto experimental dos 2k existentes. Nesse contraste, x está codificado como 0 e 1, para baixo e alto, respectivamente, diferente do tradicional -1 e 1. O coeficiente αi∈{0,1} é o expoente aparecendo no i-ésimo fator no efeito que deve ser confundido.
Por exemplo, se o efeito a ser confundido for ABCD, então os valores de αi serão todos iguais a 1, pois ABCD=A1B1C1D1. Se o efeito a ser confundido for ACD, então os valores serão α1=α3=α4=1, e α2=0, pois ACD=A1B0C1D1.
Dessa forma, para o sistema 2k, temos tanto αi=0 ou 1, e xi=0 (nível baixo) ou 1 (nível alto). Pontos experimentais que tenham o mesmo valor de Lmod2 pertencerão ao mesmo bloco. A função xmod2 retorna o resto da divisão de x por 2. Como os únicos valores possíveis de Lmod2 são 0 e 1, isso atribuirá os 2k pontos experimentais à exatamente dois blocos.
Como exemplo, considere um planejamento 23, com a interação ABC (a de ordem mais alta) confundida com bloco. Aqui, x1 corresponde a A, x2 a B, e x3 a C. Portanto, tem-se que α1=α2=α3=1, pois como o fator a ser confundido é ABC, então o expoente destes três fatores é 1. Portanto, o contraste de definição utilizado para confundir ABC com blocos é L=x1+x2+x3.
Com a finalidade de atribuir os pontos experimentais aos dois blocos, determina-se o valor de Lmod2 para cada ponto experimental: (1):L=1(0)+1(0)+1(0)=0mod2=0a:L=1(1)+1(0)+1(0)=1mod2=1b:L=1(0)+1(1)+1(0)=1mod2=1ab:L=1(1)+1(1)+1(0)=2mod2=0c:L=1(0)+1(0)+1(1)=1mod2=1ac:L=1(1)+1(0)+1(1)=2mod2=0bc:L=1(0)+1(1)+1(1)=2mod2=0abc:L=1(1)+1(1)+1(1)=3mod2=1
Dessa forma, as combinações (1)
, ab
, ac
, e bc
são corridas no bloco I, enquanto que a
, b
, c
, e abc
são corridas no bloco 2. Veja que esta atribuição é idêntica àquela realizada ao se utilizar a coluna ABC da tabela de sinais. O contraste de definição é apenas uma generalização daquele método.
6.2 Análise do fatorial 24 em 2 blocos
library(tidyverse)
Análise dos dados disponíveis no exemplo 7.2, página 310, em MONTGOMERY (2012).
# Criando um experimento 2^4 em dois blocos usando I = ABCD.
k <- 4
da <- do.call(expand.grid,
setNames(replicate(k, c(-1, 1), simplify = FALSE),
LETTERS[1:k]))
# Cria os blocos usando I = ABCD.
da$blc <- with(da,
factor(A * B * C * D,
labels = c("II", "I")))
# Ordena para ficar com a mesma disposição do livro.
da <- da[with(da, order(blc)), ]
da
## A B C D blc
## 2 1 -1 -1 -1 II
## 3 -1 1 -1 -1 II
## 5 -1 -1 1 -1 II
## 8 1 1 1 -1 II
## 9 -1 -1 -1 1 II
## 12 1 1 -1 1 II
## 14 1 -1 1 1 II
## 15 -1 1 1 1 II
## 1 -1 -1 -1 -1 I
## 4 1 1 -1 -1 I
## 6 1 -1 1 -1 I
## 7 -1 1 1 -1 I
## 10 1 -1 -1 1 I
## 11 -1 1 -1 1 I
## 13 -1 -1 1 1 I
## 16 1 1 1 1 I
# Adiciona o vetor da resposta.
da$y <- c(71, 48, 68, 65, 43, 104, 86, 70,
25, 45, 40, 60, 80, 25, 55, 76)
# Ajuste do modelo saturado.
# m0 <- lm(terms(y ~ A * B * C * D + blc, keep.order = TRUE), data = da)
m0 <- lm(y ~ blc + A * B * C * D,
data = da,
contrasts = list(blc = contr.sum))
# O efeito `A:B:C:D` não foi estimado pois tem um `NA` no lugar.
coef(m0)
## (Intercept) blc1 A B C
## 60.0625 9.3125 10.8125 1.5625 4.9375
## D A:B A:C B:C A:D
## 7.3125 0.0625 -9.0625 1.1875 8.3125
## B:D C:D A:B:C A:B:D A:C:D
## -0.1875 -0.5625 0.9375 2.0625 -0.8125
## B:C:D A:B:C:D
## -1.3125 NA
# A coluna 2 e a última são linearmente dependentes (= confundimento). E
# o confundimento acontece não importando o tipo de contraste usado.
X <- model.matrix(m0)
prmatrix(model.matrix(m0),
rowlab = rep("", nrow(X)),
collab = rep("", ncol(X)))
##
## 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1
## 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 1 -1
## 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1
## 1 1 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
## 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1 -1
## 1 1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
## 1 1 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1
## 1 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1
## 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1 1
## 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 1
## 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 1
## 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 1
## 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1
## 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1
## 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1
## 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# Cria um tabela com nomes e valores das estimativas.
cfs <- coef(m0)[-(1:2)] %>%
na.omit() %>%
enframe()
# Gráfico quantil-quantil normal das estimativas.
qq <- qqnorm(cfs$value, pch = 19, col = "orange")
text(x = qq$x,
y = qq$y,
labels = cfs$name,
pos = ifelse(qq$x < 0, 4, 2))
# Modelo reduzido.
m1 <- lm(y ~ blc + A * (C + D), data = da)
anova(m1)
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## blc 1 1387.56 1387.56 66.581 1.889e-05 ***
## A 1 1870.56 1870.56 89.757 5.600e-06 ***
## C 1 390.06 390.06 18.717 0.0019155 **
## D 1 855.56 855.56 41.053 0.0001242 ***
## A:C 1 1314.06 1314.06 63.054 2.349e-05 ***
## A:D 1 1105.56 1105.56 53.049 4.646e-05 ***
## Residuals 9 187.56 20.84
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Predição em cada bloco.
predict(m1, newdata = list(blc = "I", A = 1, C = 1, D = 1))
## 1
## 73.0625
predict(m1, newdata = list(blc = "II", A = 1, C = 1, D = 1))
## 1
## 91.6875
# Entenda o significado do efeito de bloco na codificação soma 0 com 2
# blocos.
coef(m0)["blc1"] * 2
## blc1
## 18.625
6.3 Análise do fatorial 25 em 4 blocos
Análise dos dados disponíveis no problema 6-26, página 310, em MONTGOMERY (2012).
An experiment was run in a semiconductor fabrication plant in an effort to increase yield. Five factors, each at two levels, were studied. The factors (and levels) were A aperture setting (small, large), B exposure time (20% below nominal, 20% above nominal), C development time (30 and 45 s), D mask dimension (small, large), and E etch time (14.5 and 15.5 min). The unreplicated 2 raised to 5 design shown below was run.
Um experimento foi realizado em uma planta de fabricação de semicondutores para aumentar o rendimento. Cinco fatores, cada um em dois níveis, foram estudados. Os fatores (e níveis) foram configuração da abertura (A: pequena, grande), tempo de exposição (B: 20% abaixo da nominal, 20% acima da nominal), tempo de desenvolvimento (C: 30 e 45 s), dimensão da máscara (D: pequena, grande), e tempo de gravação (E: 14,5 e 15,5 min). O planejamento fatorial 25 não replicado foi executado em 4 blocos, usando para o confundimento os efeitos ACDE e BCD.
# Criando um experimento 2^5 não replicado.
k <- 5
da <- do.call(expand.grid,
setNames(replicate(k, c(-1, 1), simplify = FALSE),
LETTERS[1:k]))
attr(da, "out.attrs") <- NULL
# Atribuindo os blocos às corridas.
blc <- factor(with(da, interaction(A * C * D * E, B * C * D)),
labels = as.character(as.roman(1:4)))
# Valores observados.
da$y <- c(7, 9, 34, 55, 16, 20, 40, 60, 8, 10, 32, 50, 18, 21, 44, 61,
8, 12, 35, 52, 15, 22, 45, 65, 6, 10, 30, 53, 15, 20, 41, 63)
m0 <- lm(y ~ blc + A * B * C * D * E, data = da)
# Efeitos não estimados estão com `NA` no lugar.
coef(m0)
## (Intercept) blcII blcIII blcIV A
## 30.37500 -0.12500 0.62500 0.12500 5.90625
## B C D E A:B
## 16.96875 4.84375 -0.40625 0.21875 3.96875
## A:C B:C A:D B:D C:D
## 0.21875 0.03125 -0.03125 -0.34375 0.40625
## A:E B:E C:E D:E A:B:C
## 0.46875 0.28125 0.15625 -0.59375 -0.21875
## A:B:D A:C:D B:C:D A:B:E A:C:E
## 0.15625 -0.21875 NA NA 0.15625
## B:C:E A:D:E B:D:E C:D:E A:B:C:D
## 0.46875 0.40625 0.09375 -0.40625 -0.03125
## A:B:C:E A:B:D:E A:C:D:E B:C:D:E A:B:C:D:E
## 0.09375 0.46875 NA -0.46875 -0.09375
# A coluna 2 e a última são linearmente dependentes (= confundimento). E
# o confundimento acontece não importando o tipo de contraste usado.
X <- model.matrix(m0)
# Colunas dos efeitos de blocos e interações com os quais foram
# confundidos. São mostradas apenas as linhas distintas.
conf <- c(which(m0$assign == 1),
which(is.na(coef(m0))))
prmatrix(unique(model.matrix(m0)[, conf]),
rowlab = rep("", nrow(X)))
## blcII blcIII blcIV B:C:D A:B:E A:C:D:E
## 1 0 0 -1 -1 1
## 0 0 0 -1 1 -1
## 0 0 1 1 1 1
## 0 1 0 1 -1 -1
# NOTE: Não é mais uma relação um para um. Ou seja, 3 efeitos se
# confundem com os outros 3 efeitos, mas não em uma relação em que
# existam pares correspondentes.
# Cria um tabela com nomes e valores das estimativas.
cfs <- coef(m0)[m0$assign > 1] %>%
na.omit() %>%
enframe()
# Gráfico quantil-quantil normal das estimativas.
qq <- qqnorm(cfs$value, pch = 19, col = "orange")
text(x = qq$x,
y = qq$y,
labels = cfs$name,
pos = ifelse(qq$x < 0, 4, 2))
m1 <- lm(y ~ blc + A + B + C + D + A:B + D:E + B:C, data = da)
anova(m1)
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## blc 3 2.6 0.9 0.3043 0.82192
## A 1 1116.3 1116.3 392.9497 4.480e-15 ***
## B 1 9214.0 9214.0 3243.4935 < 2.2e-16 ***
## C 1 750.8 750.8 264.2876 2.257e-13 ***
## D 1 5.3 5.3 1.8591 0.18717
## A:B 1 504.0 504.0 177.4274 1.038e-11 ***
## D:E 1 11.3 11.3 3.9712 0.05944 .
## B:C 1 0.0 0.0 0.0110 0.91746
## Residuals 21 59.7 2.8
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
6.4 Confundimento parcial
Análise dos dados disponíveis no exemplo 7.3, página 318, em MONTGOMERY (2012).
# Valores digitados conforme disposição na ilustração do livro.
dat <- c(0, 0, 0, 0, 0, 550,
1, 1, 0, 0, 0, 642,
1, 0, 1, 0, 0, 749,
0, 1, 1, 0, 0, 1075,
1, 0, 0, 1, 0, 669,
0, 1, 0, 1, 0, 633,
0, 0, 1, 1, 0, 1037,
1, 1, 1, 1, 0, 729,
0, 0, 0, 0, 1, 604,
0, 0, 1, 0, 1, 1052,
1, 1, 0, 0, 1, 635,
1, 1, 1, 0, 1, 860,
1, 0, 0, 1, 1, 650,
0, 1, 0, 1, 1, 601,
1, 0, 1, 1, 1, 868,
0, 1, 1, 1, 1, 1063)
da <- matrix(dat, ncol = 6, byrow = TRUE)
da <- as.data.frame(da)
names(da) <- c("A", "B", "C", "blc", "rpt", "y")
da <- transform(da,
A = 2 * (A - 0.5),
B = 2 * (B - 0.5),
C = 2 * (C - 0.5),
blc = factor(blc),
rpt = factor(rpt))
str(da)
## 'data.frame': 16 obs. of 6 variables:
## $ A : num -1 1 1 -1 1 -1 -1 1 -1 -1 ...
## $ B : num -1 1 -1 1 -1 1 -1 1 -1 -1 ...
## $ C : num -1 -1 1 1 -1 -1 1 1 -1 1 ...
## $ blc: Factor w/ 2 levels "0","1": 1 1 1 1 2 2 2 2 1 1 ...
## $ rpt: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 2 2 ...
## $ y : num 550 642 749 1075 669 ...
# Modelo com efeito de blocos dentro de repetições para um planejamento
# fatorial 2^3 usando em cada repetição I = ABC e I = AB,
# respectivamente.
# m0 <- lm(y ~ rpt/blc + A * B * C, data = da)
m0 <- lm(terms(y ~ rpt/blc+ A + B + C + A:B + A:C + B:C + A:B:C,
keep.order = TRUE),
data = da)
# Todos os efeitos foram estimados.
summary(m0)
##
## Call:
## lm(formula = terms(y ~ rpt/blc + A + B + C + A:B + A:C + B:C +
## A:B:C, keep.order = TRUE), data = da)
##
## Residuals:
## 1 2 3 4 5 6 7
## 0.8125 31.3125 -48.8125 16.6875 12.8125 19.3125 12.9375
## 8 9 10 11 12 13 14
## -45.0625 -0.8125 -12.9375 -31.3125 45.0625 -12.8125 -19.3125
## 15 16
## 48.8125 -16.6875
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 753.125 30.929 24.350 2.18e-06 ***
## rpt1 55.625 43.740 1.272 0.25942
## rpt0:blc1 14.750 50.507 0.292 0.78199
## rpt1:blc1 -34.250 50.507 -0.678 0.52780
## A -50.812 12.627 -4.024 0.01008 *
## B 3.688 12.627 0.292 0.78199
## C 153.062 12.627 12.122 6.75e-05 ***
## A:B -21.000 17.857 -1.176 0.29253
## A:C -76.812 12.627 -6.083 0.00174 **
## B:C -1.062 12.627 -0.084 0.93621
## A:B:C -0.875 17.857 -0.049 0.96282
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 50.51 on 5 degrees of freedom
## Multiple R-squared: 0.976, Adjusted R-squared: 0.928
## F-statistic: 20.33 on 10 and 5 DF, p-value: 0.001954
# NOTE: todos os efeitos foram estimados, porém, e existe diferença no
# erro padrão. Como essa informação poder ser aproveitada para o
# planejamento de experimentos?
# Quando de anova completo.
anova(m0)
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## rpt 1 3875 3875 1.5191 0.272551
## rpt:blc 2 458 229 0.0898 0.915560
## A 1 41311 41311 16.1941 0.010079 *
## B 1 218 218 0.0853 0.781987
## C 1 374850 374850 146.9446 6.749e-05 ***
## A:B 1 3528 3528 1.3830 0.292529
## A:C 1 94403 94403 37.0066 0.001736 **
## B:C 1 18 18 0.0071 0.936205
## A:B:C 1 6 6 0.0024 0.962816
## Residuals 5 12755 2551
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Determine os efeitos confundidos com bloco em cada repetição
# inspecionando a matriz do modelo.
X <- model.matrix(m0)
prmatrix(model.matrix(m0)[with(da, rpt == "0"), ],
rowlab = rep("", nrow(X)))
## (Intercept) rpt1 rpt0:blc1 rpt1:blc1 A B C A:B A:C B:C A:B:C
## 1 0 0 0 -1 -1 -1 1 1 1 -1
## 1 0 0 0 1 1 -1 1 -1 -1 -1
## 1 0 0 0 1 -1 1 -1 1 -1 -1
## 1 0 0 0 -1 1 1 -1 -1 1 -1
## 1 0 1 0 1 -1 -1 -1 -1 1 1
## 1 0 1 0 -1 1 -1 -1 1 -1 1
## 1 0 1 0 -1 -1 1 1 -1 -1 1
## 1 0 1 0 1 1 1 1 1 1 1
prmatrix(model.matrix(m0)[with(da, rpt == "1"), ],
rowlab = rep("", nrow(X)))
## (Intercept) rpt1 rpt0:blc1 rpt1:blc1 A B C A:B A:C B:C A:B:C
## 1 1 0 0 -1 -1 -1 1 1 1 -1
## 1 1 0 0 -1 -1 1 1 -1 -1 1
## 1 1 0 0 1 1 -1 1 -1 -1 -1
## 1 1 0 0 1 1 1 1 1 1 1
## 1 1 0 1 1 -1 -1 -1 -1 1 1
## 1 1 0 1 -1 1 -1 -1 1 -1 1
## 1 1 0 1 1 -1 1 -1 1 -1 -1
## 1 1 0 1 -1 1 1 -1 -1 1 -1
# Modelo final.
m1 <- lm(terms(y ~ rpt/blc + A * C, keep.order = TRUE), data = da)
anova(m1, m0)
## Analysis of Variance Table
##
## Model 1: y ~ rpt/blc + A * C
## Model 2: y ~ rpt/blc + A + B + C + A:B + A:C + B:C + A:B:C
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 9 16525
## 2 5 12755 4 3769.8 0.3694 0.822
anova(m1)
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## rpt 1 3875 3875 2.1105 0.180246
## rpt:blc 2 458 229 0.1248 0.884211
## A 1 41311 41311 22.4995 0.001054 **
## C 1 374850 374850 204.1598 1.719e-07 ***
## A:C 1 94403 94403 51.4158 5.248e-05 ***
## Residuals 9 16525 1836
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
6.5 Material complementar
Referências bibliográficas
MONTGOMERY, D. C. Design and analysis of experiments. 8th ed. New York: John Wiley & Sons, 2012.