Skip to main content

Introduction to Mixture Designs

  • Chapter
  • First Online:
Book cover Experimental Design

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.

This is a preview of subscription content, log in via an institution to check access.

Access this chapter

Institutional subscriptions

Notes

  1. 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. 2.

    Excel and SPSS do not offer the tools to generate and analyze these types of designs.

  3. 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

Authors

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.

Fig. 17.16
figure 16

Triangular surface in R

# 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

Reprints and permissions

Copyright information

© 2018 Springer International Publishing AG

About this chapter

Check for updates. Verify currency and authenticity via CrossMark

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

Publish with us

Policies and ethics