← All Use Cases
🍳
Central Composite Design

Yogurt Fermentation Optimization

Central composite design to maximize probiotic count and minimize sourness by tuning temperature, starter culture, and fermentation time

Summary

This experiment investigates yogurt fermentation optimization. Central composite design to maximize probiotic count and minimize sourness by tuning temperature, starter culture, and fermentation time.

The design varies 3 factors: ferm temp (C), ranging from 37 to 46, starter pct (%), ranging from 1 to 5, and ferm time (hrs), ranging from 4 to 12. The goal is to optimize 2 responses: probiotic cfu (log_CFU/mL) (maximize) and sourness (pts) (minimize). Fixed conditions held constant across all runs include milk fat pct = 3.5, pasteurization = 72C_15s.

A Central Composite Design (CCD) was selected to fit a full quadratic response surface model, including curvature and interaction effects. With 3 factors this produces 22 runs including center points and axial (star) points that extend beyond the factorial range.

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 probiotic cfu, the most influential factors were ferm time (51.6%), starter pct (38.5%), ferm temp (9.9%). The best observed value was 10.5 (at ferm temp = 41.5, starter pct = -0.651484, ferm time = 8).

For sourness, the most influential factors were starter pct (51.3%), ferm time (39.7%), ferm temp (9.0%). The best observed value was 2.4 (at ferm temp = 41.5, starter pct = 3, ferm time = 0.697033).

Recommended Next Steps

Experimental Setup

Factors

FactorLowHighUnit
ferm_temp3746C
starter_pct15%
ferm_time412hrs

Fixed: milk_fat_pct = 3.5, pasteurization = 72C_15s

Responses

ResponseDirectionUnit
probiotic_cfu↑ maximizelog_CFU/mL
sourness↓ minimizepts

Configuration

use_cases/91_yogurt_fermentation/config.json
{ "metadata": { "name": "Yogurt Fermentation Optimization", "description": "Central composite design to maximize probiotic count and minimize sourness by tuning temperature, starter culture, and fermentation time" }, "factors": [ { "name": "ferm_temp", "levels": [ "37", "46" ], "type": "continuous", "unit": "C" }, { "name": "starter_pct", "levels": [ "1", "5" ], "type": "continuous", "unit": "%" }, { "name": "ferm_time", "levels": [ "4", "12" ], "type": "continuous", "unit": "hrs" } ], "fixed_factors": { "milk_fat_pct": "3.5", "pasteurization": "72C_15s" }, "responses": [ { "name": "probiotic_cfu", "optimize": "maximize", "unit": "log_CFU/mL" }, { "name": "sourness", "optimize": "minimize", "unit": "pts" } ], "settings": { "operation": "central_composite", "test_script": "use_cases/91_yogurt_fermentation/sim.sh" } }

Experimental Matrix

The Central Composite Design produces 22 runs. Each row is one experiment with specific factor settings.

Runferm_tempstarter_pctferm_time
141.538
246112
33754
441.56.651488
541.538
633.284238
741.530.697033
841.538
94654
1049.715838
1141.538
1241.5-0.6514848
1341.538
1437112
1541.538
164614
1741.5315.303
1846512
1941.538
203714
2137512
2241.538

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/91_yogurt_fermentation/config.json
2

Generate the runner script

Terminal
$ doe generate --config use_cases/91_yogurt_fermentation/config.json \ --output use_cases/91_yogurt_fermentation/results/run.sh --seed 42
3

Execute the experiments

Terminal
$ bash use_cases/91_yogurt_fermentation/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/91_yogurt_fermentation/config.json
5

Get optimization recommendations

Terminal
$ doe optimize --config use_cases/91_yogurt_fermentation/config.json
6

Multi-objective optimization

With 2 competing responses, use --multi to find the best compromise via Derringer–Suich desirability.

Terminal
$ doe optimize --config use_cases/91_yogurt_fermentation/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/91_yogurt_fermentation/config.json \ --output use_cases/91_yogurt_fermentation/results/report.html

Features Exercised

FeatureValue
Design typecentral_composite
Factor typescontinuous (all 3)
Arg styledouble-dash
Responses2 (probiotic_cfu ↑, sourness ↓)
Total runs22

Analysis Results

Generated from actual experiment runs using the DOE Helper Tool.

Response: probiotic_cfu

Top factors: ferm_time (51.6%), starter_pct (38.5%), ferm_temp (9.9%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
ferm_temp40.57340.14340.1520.9572
starter_pct45.78671.44671.5370.2715
ferm_time415.85843.96464.2120.0341
LackofFit25.28362.6418
PureError76.5887
Error911.87230.9412
Total2134.09091.6234

Pareto Chart

Pareto chart for probiotic_cfu

Main Effects Plot

Main effects plot for probiotic_cfu

Normal Probability Plot of Effects

Normal probability plot for probiotic_cfu

Half-Normal Plot of Effects

Half-normal plot for probiotic_cfu

Model Diagnostics

Model diagnostics for probiotic_cfu

Response: sourness

Top factors: starter_pct (51.3%), ferm_time (39.7%), ferm_temp (9.0%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
ferm_temp41.78080.44520.2030.9303
starter_pct411.23082.80771.2810.3464
ferm_time414.51753.62941.6560.2430
LackofFit27.12583.5629
PureError715.3400
Error922.46582.1914
Total2149.99502.3807

Pareto Chart

Pareto chart for sourness

Main Effects Plot

Main effects plot for sourness

Normal Probability Plot of Effects

Normal probability plot for sourness

Half-Normal Plot of Effects

Half-normal plot for sourness

Model Diagnostics

Model diagnostics for sourness

Response Surface Plots

3D surfaces fitted with quadratic RSM. Red dots are observed data points.

probiotic cfu ferm temp vs ferm time

RSM surface: probiotic cfu ferm temp vs ferm time

probiotic cfu ferm temp vs starter pct

RSM surface: probiotic cfu ferm temp vs starter pct

probiotic cfu starter pct vs ferm time

RSM surface: probiotic cfu starter pct vs ferm time

sourness ferm temp vs ferm time

RSM surface: sourness ferm temp vs ferm time

sourness ferm temp vs starter pct

RSM surface: sourness ferm temp vs starter pct

sourness starter pct vs ferm time

RSM surface: sourness starter pct vs ferm time

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

Per-Response Desirability

ResponseWeightDesirabilityPredictedDir
probiotic_cfu 1.0
0.5983
8.70 0.5983 8.70 log_CFU/mL
sourness 1.5
0.6252
4.47 0.6252 4.47 pts

Recommended Settings

FactorValue
ferm_temp37.9 C
starter_pct5 %
ferm_time12 hrs

Source: from RSM model prediction

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
sourness4.472.40+2.07

Top 3 Runs by Desirability

RunDFactor Settings
#80.6039ferm_temp=33.2842, starter_pct=3, ferm_time=8
#150.5953ferm_temp=46, starter_pct=5, ferm_time=12

Model Quality

ResponseType
sourness0.7833quadratic

Full Multi-Objective Output

doe optimize --multi
============================================================ MULTI-OBJECTIVE OPTIMIZATION Method: Derringer-Suich Desirability Function ============================================================ Overall desirability: D = 0.6143 Response Weight Desirability Predicted Direction --------------------------------------------------------------------- probiotic_cfu 1.0 0.5983 8.70 log_CFU/mL ↑ sourness 1.5 0.6252 4.47 pts ↓ Recommended settings: ferm_temp = 37.9 C starter_pct = 5 % ferm_time = 12 hrs (from RSM model prediction) Trade-off summary: probiotic_cfu: 8.70 (best observed: 10.50, sacrifice: +1.80) sourness: 4.47 (best observed: 2.40, sacrifice: +2.07) Model quality: probiotic_cfu: R² = 0.6604 (quadratic) sourness: R² = 0.7833 (quadratic) Top 3 observed runs by overall desirability: 1. Run #22 (D=0.6129): ferm_temp=37, starter_pct=1, ferm_time=12 2. Run #8 (D=0.6039): ferm_temp=33.2842, starter_pct=3, ferm_time=8 3. Run #15 (D=0.5953): ferm_temp=46, starter_pct=5, ferm_time=12

Full Analysis Output

doe analyze
=== Main Effects: probiotic_cfu === Factor Effect Std Error % Contribution -------------------------------------------------------------- ferm_time 3.2500 0.2716 51.6% starter_pct 2.4250 0.2716 38.5% ferm_temp 0.6250 0.2716 9.9% === ANOVA Table: probiotic_cfu === Source DF SS MS F p-value ----------------------------------------------------------------------------- ferm_temp 4 0.5734 0.1434 0.152 0.9572 starter_pct 4 5.7867 1.4467 1.537 0.2715 ferm_time 4 15.8584 3.9646 4.212 0.0341 Lack of Fit 2 5.2836 2.6418 2.807 0.1273 Pure Error 7 6.5887 0.9412 Error 9 11.8723 0.9412 Total 21 34.0909 1.6234 === Summary Statistics: probiotic_cfu === ferm_temp: Level N Mean Std Min Max ------------------------------------------------------------ 33.2842 1 8.4000 0.0000 8.4000 8.4000 37 4 7.9750 2.2351 5.9000 10.5000 41.5 12 7.8750 1.1917 5.9000 9.5000 46 4 7.9750 0.9845 6.5000 8.5000 49.7158 1 8.5000 0.0000 8.5000 8.5000 starter_pct: Level N Mean Std Min Max ------------------------------------------------------------ -0.651484 1 8.3000 0.0000 8.3000 8.3000 1 4 8.4250 1.7154 6.3000 10.5000 3 12 8.0917 1.0457 5.9000 9.5000 5 4 7.5250 1.5756 5.9000 9.2000 6.65148 1 6.0000 0.0000 6.0000 6.0000 ferm_time: Level N Mean Std Min Max ------------------------------------------------------------ 0.697033 1 8.6000 0.0000 8.6000 8.6000 12 4 6.8000 1.1605 5.9000 8.5000 15.303 1 5.9000 0.0000 5.9000 5.9000 4 4 9.1500 0.9678 8.4000 10.5000 8 12 8.0750 1.0172 6.0000 9.5000 === Main Effects: sourness === Factor Effect Std Error % Contribution -------------------------------------------------------------- starter_pct 4.4000 0.3290 51.3% ferm_time 3.4000 0.3290 39.7% ferm_temp 0.7750 0.3290 9.0% === ANOVA Table: sourness === Source DF SS MS F p-value ----------------------------------------------------------------------------- ferm_temp 4 1.7808 0.4452 0.203 0.9303 starter_pct 4 11.2308 2.8077 1.281 0.3464 ferm_time 4 14.5175 3.6294 1.656 0.2430 Lack of Fit 2 7.1258 3.5629 1.626 0.2631 Pure Error 7 15.3400 2.1914 Error 9 22.4658 2.1914 Total 21 49.9950 2.3807 === Summary Statistics: sourness === ferm_temp: Level N Mean Std Min Max ------------------------------------------------------------ 33.2842 1 4.6000 0.0000 4.6000 4.6000 37 4 5.1250 2.2066 3.4000 8.1000 41.5 12 4.9833 1.7320 2.4000 8.1000 46 4 4.3500 0.4509 3.7000 4.7000 49.7158 1 4.4000 0.0000 4.4000 4.4000 starter_pct: Level N Mean Std Min Max ------------------------------------------------------------ -0.651484 1 7.0000 0.0000 7.0000 7.0000 1 4 5.1500 2.0240 3.5000 8.1000 3 12 4.9333 1.4680 2.4000 8.1000 5 4 4.3250 0.9605 3.4000 5.5000 6.65148 1 2.6000 0.0000 2.6000 2.6000 ferm_time: Level N Mean Std Min Max ------------------------------------------------------------ 0.697033 1 5.8000 0.0000 5.8000 5.8000 12 4 3.8000 0.5477 3.4000 4.6000 15.303 1 2.4000 0.0000 2.4000 2.4000 4 4 5.6750 1.6820 4.4000 8.1000 8 12 5.0500 1.5401 2.6000 8.1000

Optimization Recommendations

doe optimize
=== Optimization: probiotic_cfu === Direction: maximize Best observed run: #18 ferm_temp = 41.5 starter_pct = -0.651484 ferm_time = 8 Value: 10.5 RSM Model (linear, R² = 0.1086, Adj R² = -0.0400): Coefficients: intercept +7.9636 ferm_temp -0.0626 starter_pct -0.4057 ferm_time +0.2896 RSM Model (quadratic, R² = 0.3763, Adj R² = -0.0915): Coefficients: intercept +7.6018 ferm_temp -0.0626 starter_pct -0.4057 ferm_time +0.2896 ferm_temp*starter_pct +0.6625 ferm_temp*ferm_time +0.3125 starter_pct*ferm_time -0.3625 ferm_temp^2 +0.3359 starter_pct^2 +0.2759 ferm_time^2 -0.0691 Curvature analysis: ferm_temp coef=+0.3359 convex (has a minimum) starter_pct coef=+0.2759 convex (has a minimum) ferm_time coef=-0.0691 negligible curvature Notable interactions: ferm_temp*starter_pct coef=+0.6625 (synergistic) starter_pct*ferm_time coef=-0.3625 (antagonistic) ferm_temp*ferm_time coef=+0.3125 (synergistic) Predicted optimum (from linear model, at observed points): ferm_temp = 37 starter_pct = 1 ferm_time = 12 Predicted value: 8.7215 Surface optimum (via L-BFGS-B, linear model): ferm_temp = 37 starter_pct = 1 ferm_time = 12 Predicted value: 8.7215 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. starter_pct (effect: 4.3, contribution: 54.8%) 2. ferm_time (effect: 2.6, contribution: 33.1%) 3. ferm_temp (effect: 1.0, contribution: 12.1%) === Optimization: sourness === Direction: minimize Best observed run: #20 ferm_temp = 41.5 starter_pct = 3 ferm_time = 0.697033 Value: 2.4 RSM Model (linear, R² = 0.0356, Adj R² = -0.1252): Coefficients: intercept +4.8500 ferm_temp +0.2187 starter_pct -0.2614 ferm_time +0.0717 RSM Model (quadratic, R² = 0.2839, Adj R² = -0.2532): Coefficients: intercept +4.6605 ferm_temp +0.2187 starter_pct -0.2614 ferm_time +0.0717 ferm_temp*starter_pct +0.6750 ferm_temp*ferm_time -0.2750 starter_pct*ferm_time -0.3500 ferm_temp^2 +0.2147 starter_pct^2 +0.4097 ferm_time^2 -0.3403 Curvature analysis: starter_pct coef=+0.4097 convex (has a minimum) ferm_time coef=-0.3403 concave (has a maximum) ferm_temp coef=+0.2147 convex (has a minimum) Notable interactions: ferm_temp*starter_pct coef=+0.6750 (synergistic) starter_pct*ferm_time coef=-0.3500 (antagonistic) Predicted optimum (from linear model, at observed points): ferm_temp = 46 starter_pct = 1 ferm_time = 12 Predicted value: 5.4018 Surface optimum (via L-BFGS-B, linear model): ferm_temp = 37 starter_pct = 5 ferm_time = 4 Predicted value: 4.2982 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. starter_pct (effect: 4.4, contribution: 51.6%) 2. ferm_time (effect: 3.0, contribution: 34.9%) 3. ferm_temp (effect: 1.2, contribution: 13.5%)
← All Use Cases All Use Cases →