A = cutting speed, B = tool geometry, C = cutting angle (−1 = low, +1 = high). Response = tool life (hours). One replicate of a 2³ factorial design.
The three-factor interaction ABC would be confounded with the blocks. ABC is the highest-order interaction, so it is the effect least likely to matter, and all main effects (A, B, C) and two-factor interactions (AB, AC, BC) can still be estimated free of the block effect.
Corner points are assigned to blocks by the sign of the ABC column: ABC = −1 → Block 1, ABC = +1 → Block 2.
TC A B C ABC Block
1 (1) -1 -1 -1 -1 1
4 ab 1 1 -1 -1 1
6 ac 1 -1 1 -1 1
7 bc -1 1 1 -1 1
2 a 1 -1 -1 1 2
3 b -1 1 -1 1 2
5 c -1 -1 1 1 2
8 abc 1 1 1 1 2
Four blocks have 3 degrees of freedom, so three effects are confounded with blocks: two chosen block generators plus their generalized interaction. Choosing AB and AC as generators gives AB × AC = A²BC = BC, so the effects confounded with blocks are AB, AC, and BC.
This is the best choice for a 2³ design. Any pair of generators that includes ABC would confound a main effect (e.g., ABC × AB = C), while confounding AB, AC, and BC keeps all three main effects and ABC estimable.
Corner points are assigned to blocks by the sign combination of AB and AC (BC = AB × AC is then also constant within each block).
TC A B C AB AC BC Block
1 (1) -1 -1 -1 1 1 1 1
8 abc 1 1 1 1 1 1 1
4 ab 1 1 -1 1 -1 -1 2
5 c -1 -1 1 1 -1 -1 2
3 b -1 1 -1 -1 1 -1 3
6 ac 1 -1 1 -1 1 -1 3
2 a 1 -1 -1 -1 -1 1 4
7 bc -1 1 1 -1 -1 1 4
The data were collected using the two-block design from 1(b) (Block 1 = (1), ab, ac, bc; Block 2 = a, b, c, abc).
TC A B C Block Life
1 (1) -1 -1 -1 1 22
2 a 1 -1 -1 2 32
3 b -1 1 -1 2 35
4 ab 1 1 -1 1 55
5 c -1 -1 1 2 44
6 ac 1 -1 1 1 40
7 bc -1 1 1 1 60
8 abc 1 1 1 2 39
Because ABC is confounded with blocks, the ABC contrast estimates the block effect. The model therefore includes Block in place of ABC (coded −1 = Block 1, +1 = Block 2), giving 7 effects for the halfnormal plot.
Effect estimates
A:C B C Block B:C A:B A
-13.75 12.75 9.75 -6.75 -5.25 -1.75 1.25
From the halfnormal plot, AC, B, and C are the three largest effects and fall furthest to the right, apart from A and AB, which sit near the origin. These appear to be significant:
The main effect of A (effect = 1.25) is small, but it should be kept in the model because the AC interaction is significant (hierarchy principle). AB (−1.75) and BC (−5.25) appear to be noise.
With only 7 effects in an unreplicated 2³ design, Lenth’s method has very little power and does not flag any effect at α = 0.05, so this conclusion is based on the visual pattern in the plot.
Block Life
1 1 44.25
2 2 37.50
No, the block does not appear to be significant. The block effect is −6.75 (Block 2 mean 37.50 − Block 1 mean 44.25). On the halfnormal plot it falls between BC and C, grouped with the smaller effects rather than with AC, B, and C, so the difference between the two blocks looks like noise.
library(DoE.base)
# Design: 2^3 in standard order
A <- rep(c(-1, 1), 4)
B <- rep(c(-1, -1, 1, 1), 2)
C <- c(rep(-1, 4), rep(1, 4))
TC <- c("(1)", "a", "b", "ab", "c", "ac", "bc", "abc")
# 1b) Two blocks, ABC confounded with blocks
design2 <- data.frame(TC, A, B, C, ABC = A * B * C)
design2$Block <- ifelse(design2$ABC == -1, 1, 2)
design2[order(design2$Block), ]
# 2b) Four blocks, AB and AC (and BC) confounded with blocks
design4 <- data.frame(TC, A, B, C, AB = A * B, AC = A * C, BC = B * C)
design4$Block <- with(design4, ifelse(AB == 1 & AC == 1, 1,
ifelse(AB == 1 & AC == -1, 2,
ifelse(AB == -1 & AC == 1, 3, 4))))
design4[order(design4$Block), ]
# Data (collected with the design from 1b)
Life <- c(22, 32, 35, 55, 44, 40, 60, 39)
dat <- data.frame(TC, A, B, C, Block = design2$Block, Life)
dat
# 3) Halfnormal plot (Block takes the place of ABC)
dat_coded <- transform(dat, Block = ifelse(Block == 1, -1, 1))
model_block <- lm(Life ~ Block + A + B + C + A:B + A:C + B:C, data = dat_coded)
hn <- halfnormal(model_block)
hn$signif # effects flagged by Lenth's method (alpha = 0.05): none
# label every point on the plot
x <- sort(abs(hn$coef))
y <- qnorm(0.5 + 0.5 * ppoints(length(x), a = 1/2))
text(x, y, labels = names(x), pos = ifelse(x > median(x), 2, 4), cex = 0.9)
# Effect estimates
effects <- 2 * coef(model_block)[-1]
round(effects[order(abs(effects), decreasing = TRUE)], 3)
# 3b) Block means
aggregate(Life ~ Block, data = dat, FUN = mean)