Summary
This experiment investigates pizza dough formulation. Full factorial of flour protein content, yeast amount, olive oil, and fermentation time for chewiness and bubble structure.
The design varies 4 factors: protein pct (%), ranging from 10 to 14, yeast g (g), ranging from 2 to 7, oil ml (mL), ranging from 10 to 30, and ferment hrs (hrs), ranging from 4 to 72. The goal is to optimize 2 responses: chewiness (pts) (maximize) and bubble score (pts) (maximize). Fixed conditions held constant across all runs include salt pct = 2.5, water temp = 20.
A full factorial design was used to explore all 16 possible combinations of the 4 factors at two levels. This guarantees that every main effect and interaction can be estimated independently, at the cost of a larger experiment (16 runs).
Quadratic response surface models were fitted to capture potential curvature and factor interactions. The RSM contour plots below visualize how pairs of factors jointly affect each response.
Key Findings
For chewiness, the most influential factors were oil ml (34.8%), ferment hrs (32.4%), yeast g (24.2%). The best observed value was 9.8 (at protein pct = 10, yeast g = 2, oil ml = 30).
For bubble score, the most influential factors were yeast g (70.1%), ferment hrs (26.6%), oil ml (2.0%). The best observed value was 9.8 (at protein pct = 14, yeast g = 2, oil ml = 30).
Recommended Next Steps
- Consider whether any fixed factors should be varied in a future study.
Experimental Setup
Factors
| Factor | Low | High | Unit |
protein_pct | 10 | 14 | % |
yeast_g | 2 | 7 | g |
oil_ml | 10 | 30 | mL |
ferment_hrs | 4 | 72 | hrs |
Fixed: salt_pct = 2.5, water_temp = 20
Responses
| Response | Direction | Unit |
chewiness | ↑ maximize | pts |
bubble_score | ↑ maximize | pts |
Configuration
{
"metadata": {
"name": "Pizza Dough Formulation",
"description": "Full factorial of flour protein content, yeast amount, olive oil, and fermentation time for chewiness and bubble structure"
},
"factors": [
{
"name": "protein_pct",
"levels": [
"10",
"14"
],
"type": "continuous",
"unit": "%"
},
{
"name": "yeast_g",
"levels": [
"2",
"7"
],
"type": "continuous",
"unit": "g"
},
{
"name": "oil_ml",
"levels": [
"10",
"30"
],
"type": "continuous",
"unit": "mL"
},
{
"name": "ferment_hrs",
"levels": [
"4",
"72"
],
"type": "continuous",
"unit": "hrs"
}
],
"fixed_factors": {
"salt_pct": "2.5",
"water_temp": "20"
},
"responses": [
{
"name": "chewiness",
"optimize": "maximize",
"unit": "pts"
},
{
"name": "bubble_score",
"optimize": "maximize",
"unit": "pts"
}
],
"settings": {
"operation": "full_factorial",
"test_script": "use_cases/89_pizza_dough/sim.sh"
}
}
Experimental Matrix
The Full Factorial Design produces 16 runs. Each row is one experiment with specific factor settings.
| Run | protein_pct | yeast_g | oil_ml | ferment_hrs |
| 1 | 10 | 7 | 30 | 72 |
| 2 | 14 | 2 | 10 | 72 |
| 3 | 10 | 7 | 10 | 72 |
| 4 | 10 | 7 | 30 | 4 |
| 5 | 14 | 7 | 30 | 4 |
| 6 | 14 | 2 | 30 | 4 |
| 7 | 14 | 7 | 10 | 4 |
| 8 | 14 | 2 | 10 | 4 |
| 9 | 10 | 2 | 10 | 72 |
| 10 | 10 | 2 | 30 | 4 |
| 11 | 14 | 7 | 10 | 72 |
| 12 | 14 | 7 | 30 | 72 |
| 13 | 10 | 7 | 10 | 4 |
| 14 | 14 | 2 | 30 | 72 |
| 15 | 10 | 2 | 10 | 4 |
| 16 | 10 | 2 | 30 | 72 |
Step-by-Step Workflow
1
Preview the design
$ doe info --config use_cases/89_pizza_dough/config.json
2
Generate the runner script
$ doe generate --config use_cases/89_pizza_dough/config.json \
--output use_cases/89_pizza_dough/results/run.sh --seed 42
3
Execute the experiments
$ bash use_cases/89_pizza_dough/results/run.sh
4
Analyze results
$ doe analyze --config use_cases/89_pizza_dough/config.json
5
Get optimization recommendations
$ doe optimize --config use_cases/89_pizza_dough/config.json
6
Multi-objective optimization
With 2 competing responses, use --multi to find the best compromise via Derringer–Suich desirability.
$ doe optimize --config use_cases/89_pizza_dough/config.json --multi
7
Generate the HTML report
$ doe report --config use_cases/89_pizza_dough/config.json \
--output use_cases/89_pizza_dough/results/report.html
Features Exercised
| Feature | Value |
| Design type | full_factorial |
| Factor types | continuous (all 4) |
| Arg style | double-dash |
| Responses | 2 (chewiness ↑, bubble_score ↑) |
| Total runs | 16 |
Analysis Results
Generated from actual experiment runs using the DOE Helper Tool.
Response: chewiness
Top factors: oil_ml (34.8%), ferment_hrs (32.4%), yeast_g (24.2%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| protein_pct | 1 | 0.2756 | 0.2756 | 0.053 | 0.8263 |
| yeast_g | 1 | 2.1756 | 2.1756 | 0.422 | 0.5447 |
| oil_ml | 1 | 4.5156 | 4.5156 | 0.876 | 0.3924 |
| ferment_hrs | 1 | 3.9006 | 3.9006 | 0.756 | 0.4243 |
| protein_pct*yeast_g | 1 | 4.3056 | 4.3056 | 0.835 | 0.4028 |
| protein_pct*oil_ml | 1 | 4.1006 | 4.1006 | 0.795 | 0.4134 |
| protein_pct*ferment_hrs | 1 | 3.7056 | 3.7056 | 0.718 | 0.4353 |
| yeast_g*oil_ml | 1 | 5.4056 | 5.4056 | 1.048 | 0.3529 |
| yeast_g*ferment_hrs | 1 | 0.7656 | 0.7656 | 0.148 | 0.7159 |
| oil_ml*ferment_hrs | 1 | 2.1756 | 2.1756 | 0.422 | 0.5447 |
| Error | 5 | 25.7881 | 5.1576 | | |
| Total | 15 | 57.1144 | 3.8076 | | |
Pareto Chart
Main Effects Plot
Normal Probability Plot of Effects
Half-Normal Plot of Effects
Model Diagnostics
Response: bubble_score
Top factors: yeast_g (70.1%), ferment_hrs (26.6%), oil_ml (2.0%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| protein_pct | 1 | 0.0056 | 0.0056 | 0.003 | 0.9588 |
| yeast_g | 1 | 18.2756 | 18.2756 | 9.575 | 0.0270 |
| oil_ml | 1 | 0.0156 | 0.0156 | 0.008 | 0.9314 |
| ferment_hrs | 1 | 2.6406 | 2.6406 | 1.384 | 0.2924 |
| protein_pct*yeast_g | 1 | 2.9756 | 2.9756 | 1.559 | 0.2671 |
| protein_pct*oil_ml | 1 | 2.9756 | 2.9756 | 1.559 | 0.2671 |
| protein_pct*ferment_hrs | 1 | 5.6406 | 5.6406 | 2.955 | 0.1462 |
| yeast_g*oil_ml | 1 | 10.0806 | 10.0806 | 5.282 | 0.0699 |
| yeast_g*ferment_hrs | 1 | 15.4056 | 15.4056 | 8.072 | 0.0362 |
| oil_ml*ferment_hrs | 1 | 8.5556 | 8.5556 | 4.483 | 0.0878 |
| Error | 5 | 9.5431 | 1.9086 | | |
| Total | 15 | 76.1144 | 5.0743 | | |
Pareto Chart
Main Effects Plot
Normal Probability Plot of Effects
Half-Normal Plot of Effects
Model Diagnostics
Response Surface Plots
3D surfaces fitted with quadratic RSM. Red dots are observed data points.
bubble score oil ml vs ferment hrs
bubble score protein pct vs ferment hrs
bubble score protein pct vs oil ml
bubble score protein pct vs yeast g
bubble score yeast g vs ferment hrs
bubble score yeast g vs oil ml
chewiness oil ml vs ferment hrs
chewiness protein pct vs ferment hrs
chewiness protein pct vs oil ml
chewiness protein pct vs yeast g
chewiness yeast g vs ferment hrs
chewiness yeast g vs oil ml
Multi-Objective Optimization
When responses compete, Derringer–Suich desirability finds the best compromise.
Each response is scaled to a 0–1 desirability, then combined via a weighted geometric mean.
Overall Desirability
D = 0.8687
Per-Response Desirability
| Response | Weight | Desirability | Predicted | Dir |
chewiness |
1.5 |
|
8.90 0.8247 8.90 pts |
↑ |
bubble_score |
1.5 |
|
9.50 0.9150 9.50 pts |
↑ |
Recommended Settings
| Factor | Value |
protein_pct | 10 % |
yeast_g | 2 g |
oil_ml | 10 mL |
ferment_hrs | 72 hrs |
Source: from observed run #12
Trade-off Summary
Sacrifice = how much worse than single-objective best.
| Response | Predicted | Best Observed | Sacrifice |
bubble_score | 9.50 | 9.80 | +0.30 |
Top 3 Runs by Desirability
| Run | D | Factor Settings |
| #11 | 0.8144 | protein_pct=14, yeast_g=7, oil_ml=30, ferment_hrs=72 |
| #14 | 0.5768 | protein_pct=14, yeast_g=7, oil_ml=10, ferment_hrs=72 |
Model Quality
| Response | R² | Type |
bubble_score | 0.1952 | linear |
Full Multi-Objective Output
============================================================
MULTI-OBJECTIVE OPTIMIZATION
Method: Derringer-Suich Desirability Function
============================================================
Overall desirability: D = 0.8687
Response Weight Desirability Predicted Direction
---------------------------------------------------------------------
chewiness 1.5 0.8247 8.90 pts ↑
bubble_score 1.5 0.9150 9.50 pts ↑
Recommended settings:
protein_pct = 10 %
yeast_g = 2 g
oil_ml = 10 mL
ferment_hrs = 72 hrs
(from observed run #12)
Trade-off summary:
chewiness: 8.90 (best observed: 9.80, sacrifice: +0.90)
bubble_score: 9.50 (best observed: 9.80, sacrifice: +0.30)
Model quality:
chewiness: R² = 0.2487 (linear)
bubble_score: R² = 0.1952 (linear)
Top 3 observed runs by overall desirability:
1. Run #12 (D=0.8687): protein_pct=10, yeast_g=2, oil_ml=10, ferment_hrs=72
2. Run #11 (D=0.8144): protein_pct=14, yeast_g=7, oil_ml=30, ferment_hrs=72
3. Run #14 (D=0.5768): protein_pct=14, yeast_g=7, oil_ml=10, ferment_hrs=72
Full Analysis Output
=== Main Effects: chewiness ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
oil_ml 1.0625 0.4878 34.8%
ferment_hrs -0.9875 0.4878 32.4%
yeast_g -0.7375 0.4878 24.2%
protein_pct -0.2625 0.4878 8.6%
=== ANOVA Table: chewiness ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
protein_pct 1 0.2756 0.2756 0.053 0.8263
yeast_g 1 2.1756 2.1756 0.422 0.5447
oil_ml 1 4.5156 4.5156 0.876 0.3924
ferment_hrs 1 3.9006 3.9006 0.756 0.4243
protein_pct*yeast_g 1 4.3056 4.3056 0.835 0.4028
protein_pct*oil_ml 1 4.1006 4.1006 0.795 0.4134
protein_pct*ferment_hrs 1 3.7056 3.7056 0.718 0.4353
yeast_g*oil_ml 1 5.4056 5.4056 1.048 0.3529
yeast_g*ferment_hrs 1 0.7656 0.7656 0.148 0.7159
oil_ml*ferment_hrs 1 2.1756 2.1756 0.422 0.5447
Error 5 25.7881 5.1576
Total 15 57.1144 3.8076
=== Interaction Effects: chewiness ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
yeast_g oil_ml -1.1625 21.7%
protein_pct yeast_g -1.0375 19.4%
protein_pct oil_ml 1.0125 18.9%
protein_pct ferment_hrs 0.9625 18.0%
oil_ml ferment_hrs 0.7375 13.8%
yeast_g ferment_hrs 0.4375 8.2%
=== Summary Statistics: chewiness ===
protein_pct:
Level N Mean Std Min Max
------------------------------------------------------------
10 8 6.1000 1.8754 3.6000 8.9000
14 8 5.8375 2.1454 3.5000 9.8000
yeast_g:
Level N Mean Std Min Max
------------------------------------------------------------
2 8 6.3375 2.0764 4.0000 9.8000
7 8 5.6000 1.8807 3.5000 8.9000
oil_ml:
Level N Mean Std Min Max
------------------------------------------------------------
10 8 5.4375 1.6707 3.6000 8.9000
30 8 6.5000 2.1732 3.5000 9.8000
ferment_hrs:
Level N Mean Std Min Max
------------------------------------------------------------
4 8 6.4625 2.2462 3.5000 9.8000
72 8 5.4750 1.5989 3.6000 8.0000
=== Main Effects: bubble_score ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
yeast_g -2.1375 0.5632 70.1%
ferment_hrs 0.8125 0.5632 26.6%
oil_ml -0.0625 0.5632 2.0%
protein_pct -0.0375 0.5632 1.2%
=== ANOVA Table: bubble_score ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
protein_pct 1 0.0056 0.0056 0.003 0.9588
yeast_g 1 18.2756 18.2756 9.575 0.0270
oil_ml 1 0.0156 0.0156 0.008 0.9314
ferment_hrs 1 2.6406 2.6406 1.384 0.2924
protein_pct*yeast_g 1 2.9756 2.9756 1.559 0.2671
protein_pct*oil_ml 1 2.9756 2.9756 1.559 0.2671
protein_pct*ferment_hrs 1 5.6406 5.6406 2.955 0.1462
yeast_g*oil_ml 1 10.0806 10.0806 5.282 0.0699
yeast_g*ferment_hrs 1 15.4056 15.4056 8.072 0.0362
oil_ml*ferment_hrs 1 8.5556 8.5556 4.483 0.0878
Error 5 9.5431 1.9086
Total 15 76.1144 5.0743
=== Interaction Effects: bubble_score ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
yeast_g ferment_hrs -1.9625 24.8%
yeast_g oil_ml -1.5875 20.0%
oil_ml ferment_hrs 1.4625 18.5%
protein_pct ferment_hrs 1.1875 15.0%
protein_pct yeast_g -0.8625 10.9%
protein_pct oil_ml 0.8625 10.9%
=== Summary Statistics: bubble_score ===
protein_pct:
Level N Mean Std Min Max
------------------------------------------------------------
10 8 5.4875 2.4416 2.9000 9.5000
14 8 5.4500 2.2162 3.4000 9.8000
yeast_g:
Level N Mean Std Min Max
------------------------------------------------------------
2 8 6.5375 1.8875 4.6000 9.8000
7 8 4.4000 2.1679 2.9000 9.5000
oil_ml:
Level N Mean Std Min Max
------------------------------------------------------------
10 8 5.5000 2.0791 3.4000 9.5000
30 8 5.4375 2.5590 2.9000 9.8000
ferment_hrs:
Level N Mean Std Min Max
------------------------------------------------------------
4 8 5.0625 2.0135 3.0000 9.5000
72 8 5.8750 2.5381 2.9000 9.8000
Optimization Recommendations
=== Optimization: chewiness ===
Direction: maximize
Best observed run: #14
protein_pct = 10
yeast_g = 2
oil_ml = 30
ferment_hrs = 4
Value: 9.8
RSM Model (linear, R² = 0.5357, Adj R² = 0.3669):
Coefficients:
intercept +5.9688
protein_pct +0.7438
yeast_g -0.6187
oil_ml +0.3937
ferment_hrs -0.9062
RSM Model (quadratic, R² = 0.6694, Adj R² = -3.9593):
Coefficients:
intercept +1.1938
protein_pct +0.7438
yeast_g -0.6188
oil_ml +0.3937
ferment_hrs -0.9062
protein_pct*yeast_g -0.0437
protein_pct*oil_ml -0.0063
protein_pct*ferment_hrs +0.0188
yeast_g*oil_ml -0.1687
yeast_g*ferment_hrs -0.2187
oil_ml*ferment_hrs -0.6312
protein_pct^2 +1.1938
yeast_g^2 +1.1938
oil_ml^2 +1.1938
ferment_hrs^2 +1.1938
Curvature analysis:
yeast_g coef=+1.1938 convex (has a minimum)
ferment_hrs coef=+1.1938 convex (has a minimum)
protein_pct coef=+1.1938 convex (has a minimum)
oil_ml coef=+1.1938 convex (has a minimum)
Notable interactions:
oil_ml*ferment_hrs coef=-0.6312 (antagonistic)
Predicted optimum (from linear model, at observed points):
protein_pct = 14
yeast_g = 2
oil_ml = 30
ferment_hrs = 4
Predicted value: 8.6313
Surface optimum (via L-BFGS-B, linear model):
protein_pct = 14
yeast_g = 2
oil_ml = 30
ferment_hrs = 4
Predicted value: 8.6313
Model quality: Moderate fit — use predictions directionally, not precisely.
Factor importance:
1. ferment_hrs (effect: -1.8, contribution: 34.0%)
2. protein_pct (effect: 1.5, contribution: 27.9%)
3. yeast_g (effect: -1.2, contribution: 23.2%)
4. oil_ml (effect: 0.8, contribution: 14.8%)
=== Optimization: bubble_score ===
Direction: maximize
Best observed run: #11
protein_pct = 14
yeast_g = 2
oil_ml = 30
ferment_hrs = 72
Value: 9.8
RSM Model (linear, R² = 0.1596, Adj R² = -0.1460):
Coefficients:
intercept +5.4688
protein_pct +0.8063
yeast_g -0.0437
oil_ml +0.2437
ferment_hrs -0.2187
RSM Model (quadratic, R² = 0.4196, Adj R² = -7.7053):
Coefficients:
intercept +1.0938
protein_pct +0.8063
yeast_g -0.0437
oil_ml +0.2438
ferment_hrs -0.2187
protein_pct*yeast_g +0.5938
protein_pct*oil_ml +0.3312
protein_pct*ferment_hrs +0.7438
yeast_g*oil_ml +0.4312
yeast_g*ferment_hrs -0.1563
oil_ml*ferment_hrs +0.1062
protein_pct^2 +1.0938
yeast_g^2 +1.0938
oil_ml^2 +1.0938
ferment_hrs^2 +1.0938
Curvature analysis:
protein_pct coef=+1.0938 convex (has a minimum)
yeast_g coef=+1.0938 convex (has a minimum)
oil_ml coef=+1.0938 convex (has a minimum)
ferment_hrs coef=+1.0938 convex (has a minimum)
Notable interactions:
protein_pct*ferment_hrs coef=+0.7438 (synergistic)
protein_pct*yeast_g coef=+0.5938 (synergistic)
yeast_g*oil_ml coef=+0.4312 (synergistic)
protein_pct*oil_ml coef=+0.3312 (synergistic)
Predicted optimum (from linear model, at observed points):
protein_pct = 14
yeast_g = 2
oil_ml = 30
ferment_hrs = 4
Predicted value: 6.7813
Surface optimum (via L-BFGS-B, linear model):
protein_pct = 14
yeast_g = 2
oil_ml = 30
ferment_hrs = 4
Predicted value: 6.7813
Model quality: Weak fit — consider adding center points or using a different design.
Factor importance:
1. protein_pct (effect: 1.6, contribution: 61.4%)
2. oil_ml (effect: 0.5, contribution: 18.6%)
3. ferment_hrs (effect: -0.4, contribution: 16.7%)
4. yeast_g (effect: -0.1, contribution: 3.3%)