An engineer is interested in the effects of cutting speed A, tool geometry B, and cutting angle C on the life (in hours) of a machine tool. Two levels of each factor are chosen, and one replicate of a 23 factorial design is run.
Assuming the design is run in 2 blocks I would confound the three-factor interaction with the blocks.Since the main effects and the two-factor interactions are more important and the three-factor interaction is typically considered insignificant.
My proposed design is as follows:
# Create data table for 1(b)
table1<-data.frame(
Run = c("(1)", "a", "b", "ab", "c", "ac", "bc", "abc"),
A = c("'-'", "'+'", "'-'", "'+'", "'-'", "'+'", "'-'", "'+'"),
B = c("'-'", "'-'", "'+'", "'+'", "'-'", "'-'", "'+'", "'+'"),
C = c("'-'", "'-'", "'-'", "'-'", "'+'", "'+'", "'+'", "'+'"),
ABC = c("'-'", "'+'", "'+'", "'-'", "'+'", "'-'", "'-'", "'+'"),
Block = c(1, 2, 2, 1, 2, 1, 1, 2)
)
#Display Table 1
knitr::kable(table1,format="html",align="c", caption="Proposed Design For 2 Block Design")
| Run | A | B | C | ABC | Block |
|---|---|---|---|---|---|
|
|
‘-’ | ‘-’ | ‘-’ | ‘-’ | 1 |
| a | ‘+’ | ‘-’ | ‘-’ | ‘+’ | 2 |
| b | ‘-’ | ‘+’ | ‘-’ | ‘+’ | 2 |
| ab | ‘+’ | ‘+’ | ‘-’ | ‘-’ | 1 |
| c | ‘-’ | ‘-’ | ‘+’ | ‘+’ | 2 |
| ac | ‘+’ | ‘-’ | ‘+’ | ‘-’ | 1 |
| bc | ‘-’ | ‘+’ | ‘+’ | ‘-’ | 1 |
| abc | ‘+’ | ‘+’ | ‘+’ | ‘+’ | 2 |
Corner points assigned:
Block 1 - (1) - ab - ac - bc
Block 2 - a - b - c - abc
If running the design with four blocks, you will have three degrees of freedom and therefore will need to confound a total of three effects with the blocks. To keep the main effects from being confounded with the blocks, we must choose the three two-factor effects (AB, AC, BC) to be confounded with the blocks.
My proposed design is as follows:
# Create data tables for 2(b)
table2<-data.frame(
Block = c(1,2,3,4),
AB_Sign = c("'+'","'-'","'+'","'-'"),
AC_Sign = c("'+'","'+'","'-'","'-'")
)
#Display Table 2
knitr::kable(table2,format="html",align="c", caption="Proposed Design For 4 Block Design")
| Block | AB_Sign | AC_Sign |
|---|---|---|
| 1 | ‘+’ | ‘+’ |
| 2 | ‘-’ | ‘+’ |
| 3 | ‘+’ | ‘-’ |
| 4 | ‘-’ | ‘-’ |
table3<-data.frame(
Run = c("(1)", "a", "b", "ab", "c", "ac", "bc", "abc"),
A = c("'-'", "'+'", "'-'", "'+'", "'-'", "'+'", "'-'", "'+'"),
B = c("'-'", "'-'", "'+'", "'+'", "'-'", "'-'", "'+'", "'+'"),
C = c("'-'", "'-'", "'-'", "'-'", "'+'", "'+'", "'+'", "'+'"),
AB = c("'+'", "'-'", "'-'", "'+'", "'+'", "'-'", "'-'", "'+'"),
AC = c("'+'", "'-'", "'+'", "'-'", "'-'", "'+'", "'-'", "'+'"),
Block = c(1,4,2,3,3,2,4,1)
)
#Display Table 3
knitr::kable(table3,format="html",align="c", caption="Proposed Design For 4 Block Design")
| Run | A | B | C | AB | AC | Block |
|---|---|---|---|---|---|---|
|
|
‘-’ | ‘-’ | ‘-’ | ‘+’ | ‘+’ | 1 |
| a | ‘+’ | ‘-’ | ‘-’ | ‘-’ | ‘-’ | 4 |
| b | ‘-’ | ‘+’ | ‘-’ | ‘-’ | ‘+’ | 2 |
| ab | ‘+’ | ‘+’ | ‘-’ | ‘+’ | ‘-’ | 3 |
| c | ‘-’ | ‘-’ | ‘+’ | ‘+’ | ‘-’ | 3 |
| ac | ‘+’ | ‘-’ | ‘+’ | ‘-’ | ‘+’ | 2 |
| bc | ‘-’ | ‘+’ | ‘+’ | ‘-’ | ‘-’ | 4 |
| abc | ‘+’ | ‘+’ | ‘+’ | ‘+’ | ‘+’ | 1 |
Corner points assigned:
Block 1 (AB+, AC+) - (1) - abc
Block 2 (AB-, AC+) - b - ac
Block 3 (AB+, AC-) - ab - c Block 4 (AB-, AC-) - a - bc
Using the provided data, we generate a half-normal plot.
library(DoE.base)
# Input the dataset
tool_life <- data.frame(
A = c(-1, 1, -1, 1, -1, 1, -1, 1),
B = c(-1, -1, 1, 1, -1, -1, 1, 1),
C = c(-1, -1, -1, -1, 1, 1, 1, 1),
Life = c(22, 32, 35, 55, 44, 40, 60, 39)
)
# Fit a linear model
model <- lm(Life ~ A * B * C, data = tool_life)
coef(model)
## (Intercept) A B C A:B A:C
## 40.875 0.625 6.375 4.875 -0.875 -6.875
## B:C A:B:C
## -2.625 -3.375
#Create half-normal plot
halfnormal(model)
The effect “B” (Tool Geometry) appears to be significant due to it deviating from the straight line of other effects. The ABC effect deviates far from the normal line and appears significant. The block effect seems significant.
summary(model)
##
## Call:
## lm.default(formula = Life ~ A * B * C, data = tool_life)
##
## Residuals:
## ALL 8 residuals are 0: no residual degrees of freedom!
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 40.875 NaN NaN NaN
## A 0.625 NaN NaN NaN
## B 6.375 NaN NaN NaN
## C 4.875 NaN NaN NaN
## A:B -0.875 NaN NaN NaN
## A:C -6.875 NaN NaN NaN
## B:C -2.625 NaN NaN NaN
## A:B:C -3.375 NaN NaN NaN
##
## Residual standard error: NaN on 0 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: NaN
## F-statistic: NaN on 7 and 0 DF, p-value: NA
knitr::opts_chunk$set(echo=TRUE, warning=FALSE, message=FALSE)
# Create data table for 1(b)
table1<-data.frame(
Run = c("(1)", "a", "b", "ab", "c", "ac", "bc", "abc"),
A = c("'-'", "'+'", "'-'", "'+'", "'-'", "'+'", "'-'", "'+'"),
B = c("'-'", "'-'", "'+'", "'+'", "'-'", "'-'", "'+'", "'+'"),
C = c("'-'", "'-'", "'-'", "'-'", "'+'", "'+'", "'+'", "'+'"),
ABC = c("'-'", "'+'", "'+'", "'-'", "'+'", "'-'", "'-'", "'+'"),
Block = c(1, 2, 2, 1, 2, 1, 1, 2)
)
#Display Table 1
knitr::kable(table1,format="html",align="c", caption="Proposed Design For 2 Block Design")
# Create data tables for 2(b)
table2<-data.frame(
Block = c(1,2,3,4),
AB_Sign = c("'+'","'-'","'+'","'-'"),
AC_Sign = c("'+'","'+'","'-'","'-'")
)
#Display Table 2
knitr::kable(table2,format="html",align="c", caption="Proposed Design For 4 Block Design")
table3<-data.frame(
Run = c("(1)", "a", "b", "ab", "c", "ac", "bc", "abc"),
A = c("'-'", "'+'", "'-'", "'+'", "'-'", "'+'", "'-'", "'+'"),
B = c("'-'", "'-'", "'+'", "'+'", "'-'", "'-'", "'+'", "'+'"),
C = c("'-'", "'-'", "'-'", "'-'", "'+'", "'+'", "'+'", "'+'"),
AB = c("'+'", "'-'", "'-'", "'+'", "'+'", "'-'", "'-'", "'+'"),
AC = c("'+'", "'-'", "'+'", "'-'", "'-'", "'+'", "'-'", "'+'"),
Block = c(1,4,2,3,3,2,4,1)
)
#Display Table 3
knitr::kable(table3,format="html",align="c", caption="Proposed Design For 4 Block Design")
library(DoE.base)
# Input the dataset
tool_life <- data.frame(
A = c(-1, 1, -1, 1, -1, 1, -1, 1),
B = c(-1, -1, 1, 1, -1, -1, 1, 1),
C = c(-1, -1, -1, -1, 1, 1, 1, 1),
Life = c(22, 32, 35, 55, 44, 40, 60, 39)
)
# Fit a linear model
model <- lm(Life ~ A * B * C, data = tool_life)
coef(model)
#Create half-normal plot
halfnormal(model)
summary(model)