Abstract
In previous chapters, we discussed situations where our factors, or independent variables (X’s), were categorical or continuous, and there were no constraints which limited our choice of combinations of levels which these variables can assume. In this chapter, we introduce a different type of design called a mixture design, where factors (X’s) are components of a blend or mixture. For instance, if we want to optimize a recipe for a given food product (say bread), our X’s might be flour, baking powder, salt, and eggs. However, the proportions of these ingredients must add up to 100% (or 1, if written as fractions), which complicates our design and analysis if we were to use only the techniques covered up to now.
Notes
- 1.
For detailed information about mixture designs , including multiple constraints on the proportions of the components, we refer to J. Cornell , Experiments with Mixtures: Designs, Models, and the Analysis of Mixture Data, 3rd edition, New York, Wiley, 2002.
- 2.
Excel and SPSS do not offer the tools to generate and analyze these types of designs.
- 3.
While it is quite common in the mixture-design literature to rank-order the importance of the X’s by the magnitude of the respective b’s, we must take the routine caution of realizing that, of course, the b’s are, indeed, estimates (ε has not gone away!!), in addition to any effect on the slope estimates due to multicollinearity .
Author information
Authors and Affiliations
1 Electronic Supplementary Material
Appendix
Appendix
Example 17.7 Vitamin Mixture using R
To analyze the same vitamin-mixture example in R, we can import the data as previously, or we can create our own data. The second option can be implemented in two ways: using the SLD() function (mixexp package) or the mixDesign() function (qualityTools package). The steps are as follows:
# Option 1: using the SLD() function
> vitamin <- SLD(3, 3)
# The first and second arguments of the SLD() function refer to the number of factors and levels, respectively
> score <- c(32, 38, 40, 43, 33, 37, 43, 31, 42, 36) > vitamin <- data.frame(vitamin, score) > vitamin
x1 | x2 | x3 | score | |
1 | 1.0000000 | 0.0000000 | 0.0000000 | 32 |
2 | 0.6666667 | 0.3333333 | 0.0000000 | 38 |
(…) | ||||
10 | 0.0000000 | 0.0000000 | 1.0000000 | 36 |
# Option 2: using the mixDesign() function
> vitamin <- mixDesign(p=3, n=3, type="lattice", axial=FALSE, +randomize=FALSE)
# p and n refer to the number of factors and levels, respectively
Warning messages: 1: In `[<-`(`*tmp*`, i, value = <S4 object of class +"doeFactor">) : implicit list embedding of S4 objects is deprecated 2: In `[<-`(`*tmp*`, i, value = <S4 object of class +"doeFactor">) : implicit list embedding of S4 objects is deprecated 3: In `[<-`(`*tmp*`, i, value = <S4 object of class +"doeFactor">) : implicit list embedding of S4 objects is deprecated > score <- c(32, 38, 33, 40, 31, 43, 43, 42, 36, 37) > response(vitamin) <- score [1] "score" > vitamin
StandOrder | RunOrder | Type | A | B | C | score | |
1 | 1 | 1 | 1-blend | 1.0000000 | 0.0000000 | 0.0000000 | 32 |
2 | 2 | 2 | 2-blend | 0.6666667 | 0.3333333 | 0.0000000 | 38 |
(…) | |||||||
10 | 10 | 10 | <NA> | 0.3333333 | 0.3333333 | 0.3333333 | 37 |
The analysis of this design can also be performed in two ways, with similar (fortunately!!) results:
# Option 1: using the lm() function
> vitamin_model <- lm(score~-1+x1+x2+x3+x1:x2+x1:x3+x2:x3, +data=vitamin) > summary(vitamin_model) Call: lm(formula = score ~ -1 + x1 + x2 + x3 + x1:x2 + x1:x3 + x2:x3, +data = vitamin) Residuals:
1 | 2 | 3 | 4 | 5 | 6 | 7 |
-0.8571 | 0.8571 | -0.4286 | 0.2857 | 1.7143 | -0.8571 | -0.4286 |
8 | 9 | 10 | ||||
-1.2857 | 0.8571 | 0.1429 |
Coefficients:
Estimate | Std. Error | t value | Pr(>|t|) | ||
x1 | 32.857 | 1.331 | 24.687 | 1.60e-05 | *** |
x2 | 42.714 | 1.331 | 32.093 | 5.62e-06 | *** |
x3 | 35.857 | 1.331 | 26.941 | 1.13e-05 | *** |
x1:x2 | 4.500 | 5.892 | 0.764 | 0.4876 | |
x1:x3 | -11.571 | 5.892 | -1.964 | 0.1210 | |
x2:x3 | 13.500 | 5.892 | 2.291 | 0.0837 | . |
--- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘’ 1 Residual standard error: 1.414 on 4 degrees of freedom Multiple R-squared: 0.9994, Adjusted R-squared: 0.9986 F-statistic: 1186 on 6 and 4 DF, p-value: 1.891e-06
# Option 2: using the MixModel() function
> MixModel(frame=vitamin, "score", mixcomps=c("A", "B", +"C"), model=2)
coefficient | Std. err. | t.value | Prob | ||
A | 32.85714 | 1.330950 | 24.6869805 | 1.597878e-05 | |
B | 42.71429 | 1.330950 | 32.0930746 | 5.619531e-06 | |
C | 35.85714 | 1.330950 | 26.9410091 | 1.128541e-05 | |
B:A | 4.50000 | 5.891883 | 0.7637626 | 4.875729e-01 | |
C:A | -11.57143 | 5.891883 | -1.9639610 | 1.210039e-01 | |
B:C | 13.50000 | 5.891883 | 2.2912878 | 8.373821e-02 |
Residual standard error: 1.414214 on 4 degrees of freedom Corrected Multiple R-squared: 0.9561644 Call: lm(formula = mixmodnI, data = frame) Coefficients:
A | B | C | A:B | A:C | B:C |
32.86 | 42.71 | 35.86 | 4.50 | -11.57 | 13.50 |
There are also two ways we can create a triangular surface in R (shown in Fig. 17.16) using the contourPlot3() function, which will result in the same (again, fortunately) graph.
# Option 1:
> contourPlot3 (A, B, C, score, data=vitamin, form="score~+-1+A+B+C+A:B+A:C+B:C")
# Option 2:
> contourPlot3 (A, B, C, score, data=vitamin, +form=vitamin_model)
Example 17.8 A New Alloy Mixture using R
We can use the same software packages to design and analyze a simplex-centroid design. The options are shown below:
# Option 1: using the SCD() function
> alloy <- SCD(4) > strength <- c(102, 110, 164, 140, 116, 113, 170, 156, +138, 153, 134, 141, 140, +143, 142) > alloy <- data.frame(alloy, strength) > alloy
x1 | x2 | x3 | x4 | strength | |
1 | 1.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 102 |
2 | 0.0000000 | 1.0000000 | 0.0000000 | 0.0000000 | 110 |
(…) | |||||
15 | 0.2500000 | 0.2500000 | 0.2500000 | 0.2500000 | 36 |
# Option 2: using the mixDesign() function
> alloy <- mixDesign(p=4, type="centroid", axial=FALSE, +randomize=FALSE) Warning messages: 1: In `[<-`(`*tmp*`, i, value = <S4 object of class +"doeFactor">) : implicit list embedding of S4 objects is deprecated 2: In `[<-`(`*tmp*`, i, value = <S4 object of class +"doeFactor">) : implicit list embedding of S4 objects is deprecated 3: In `[<-`(`*tmp*`, i, value = <S4 object of class +"doeFactor">) : implicit list embedding of S4 objects is deprecated 4: In `[<-`(`*tmp*`, i, value = <S4 object of class +"doeFactor">) : implicit list embedding of S4 objects is deprecated > strength <- c(140, 164, 110, 102, 153, 138, 156, 170, +113, 116, 143, 140, 134, +141, 142) > response(alloy) <- strength [1] "strength" > alloy
Stand Order | Run Order | Type | A | B | C | D | score | |
1 | 1 | 1 | 1-blend | 0.0000000 | 0.0000000 | 0.0000000 | 1.0000000 | 140 |
2 | 2 | 2 | 1-blend | 0.0000000 | 0.0000000 | 1.0000000 | 0.0000000 | 164 |
(⋮) | ||||||||
15 | 15 | 15 | center | 0.2500000 | 0.2500000 | 0.2500000 | 0.2500000 | 142 |
The analysis of this design can also be performed in two ways, with similar (‘nuff said) results:
# Option 1: using the lm() function
> alloy_model <- lm(strength~-1+x1+x2+x3+x4+x1:x2+x1:x3+x1:+x4+x2:x3+x2:x4+x3:x4, data=alloy) > summary(alloy_model) Call: lm(formula = strength ~ -1 + x1 + x2 + x3 + x4 + x1:x2 + x1:+x3 + x1:x4 +x2:x3 + x2:x4 + x3:x4, data = alloy) Residuals:
1 | 2 | 3 | 4 | 5 | 6 | 7 |
-0.55271 | -0.63166 | -0.65797 | -1.68429 | -0.06304 | 0.04222 | 4.14748 |
8 | 9 | 10 | 11 | 12 | 13 | 15 |
0.35801 | 4.46327 | 4.56854 | 5.02123 | -4.21561 | -4.45245 | -5.16298 |
15 | ||||||
-1.18005 |
Coefficients:
Estimate | Std. Error | t value | Pr(>|t|) | ||
x1 | 102.553 | 5.467 | 18.757 | 7.93e-06 | *** |
x2 | 110.632 | 5.467 | 20.235 | 5.45e-06 | *** |
x3 | 164.658 | 5.467 | 30.116 | 7.57e-07 | *** |
x4 | 141.684 | 5.467 | 25.914 | 1.60e-06 | *** |
x1:x2 | 37.883 | 23.559 | 1.608 | 0.168742 | |
x1:x3 | -82.590 | 23.559 | -3.506 | 0.017180 | * |
x1:x4 | 174.936 | 23.559 | 7.425 | 0.000698 | *** |
x2:x3 | 71.989 | 23.559 | 3.056 | 0.028241 | * |
x2:x4 | 29.515 | 23.559 | 1.253 | 0.265674 | |
x3:x4 | -18.959 | 23.559 | -0.805 | 0.457517 |
--- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘’ 1 Residual standard error: 5.531 on 5 degrees of freedom Multiple R-squared: 0.9995, Adjusted R-squared: 0.9984 F-statistic: 944.1 on 10 and 5 DF, p-value: 1.51e-07
# Option 2: using the MixModel() function
> MixModel(frame=alloy, "strength", mixcomps=c("A", "B", +"C", "D"), model=2)
coefficient | Std. err. | t.value | Prob | ||
A | 102.55271 | 8.292953 | 12.3662476 | 6.125730e-05 | |
B | 110.63166 | 8.292953 | 13.3404418 | 4.233074e-05 | |
C | 164.10534 | 8.292953 | 19.7885291 | 6.087322e-06 | |
D | 142.23692 | 8.292953 | 17.1515406 | 1.233387e-05 | |
B:A | 37.88344 | 35.734106 | 1.0601479 | 3.375799e-01 | |
C:A | -72.64288 | 35.734106 | -2.0328724 | 9.775260e-02 | |
D:A | 164.98870 | 35.734106 | 4.6171212 | 5.750377e-03 | |
B:C | 81.93607 | 35.734106 | 2.2929374 | 7.039056e-02 | |
B:D | 19.56765 | 35.734106 | 0.5475902 | 6.075199e-01 | |
C:D | -18.95867 | 35.734106 | -0.5305483 | 6.184412e-01 |
Residual standard error: 8.38936 on 5 degrees of freedom Corrected Multiple R-squared: 0.9361068 Call: lm(formula = mixmodnI, data = frame) Coefficients:
A | B | C | D | A:B | A:C | A:D |
102.55 | 110.63 | 164.11 | 142.24 | 37.88 | -72.64 | 164.99 |
B:C | B:D | C:D | ||||
81.94 | 19.57 | -18.96 |
Rights and permissions
Copyright information
© 2018 Springer International Publishing AG
About this chapter
Cite this chapter
Berger, P.D., Maurer, R.E., Celli, G.B. (2018). Introduction to Mixture Designs. In: Experimental Design. Springer, Cham. https://doi.org/10.1007/978-3-319-64583-4_17
Download citation
DOI: https://doi.org/10.1007/978-3-319-64583-4_17
Published:
Publisher Name: Springer, Cham
Print ISBN: 978-3-319-64582-7
Online ISBN: 978-3-319-64583-4
eBook Packages: Mathematics and StatisticsMathematics and Statistics (R0)