Summary
This experiment investigates lawn grass seed mix. Box-Behnken design to optimize turf density and drought tolerance by tuning perennial ryegrass ratio, fescue ratio, and seeding rate.
The design varies 3 factors: ryegrass pct (%), ranging from 20 to 60, fescue pct (%), ranging from 20 to 60, and seed rate (g/m2), ranging from 30 to 80. The goal is to optimize 2 responses: density score (pts) (maximize) and drought tolerance (pts) (maximize). Fixed conditions held constant across all runs include remaining bluegrass pct = balance, mowing height mm = 50.
A Box-Behnken design was chosen because it efficiently fits quadratic models with 3 continuous factors while avoiding extreme corner combinations — requiring only 15 runs instead of the 8 needed for a full factorial at two levels.
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 density score, the most influential factors were fescue pct (51.0%), ryegrass pct (40.2%), seed rate (8.8%). The best observed value was 7.6 (at ryegrass pct = 60, fescue pct = 40, seed rate = 80).
For drought tolerance, the most influential factors were seed rate (39.0%), fescue pct (31.6%), ryegrass pct (29.4%). The best observed value was 7.7 (at ryegrass pct = 40, fescue pct = 40, seed rate = 55).
Recommended Next Steps
- Run confirmation experiments at the predicted optimal settings to validate the model.
- Consider whether any fixed factors should be varied in a future study.
Experimental Setup
Factors
| Factor | Low | High | Unit |
ryegrass_pct | 20 | 60 | % |
fescue_pct | 20 | 60 | % |
seed_rate | 30 | 80 | g/m2 |
Fixed: remaining_bluegrass_pct = balance, mowing_height_mm = 50
Responses
| Response | Direction | Unit |
density_score | ↑ maximize | pts |
drought_tolerance | ↑ maximize | pts |
Configuration
{
"metadata": {
"name": "Lawn Grass Seed Mix",
"description": "Box-Behnken design to optimize turf density and drought tolerance by tuning perennial ryegrass ratio, fescue ratio, and seeding rate"
},
"factors": [
{
"name": "ryegrass_pct",
"levels": [
"20",
"60"
],
"type": "continuous",
"unit": "%"
},
{
"name": "fescue_pct",
"levels": [
"20",
"60"
],
"type": "continuous",
"unit": "%"
},
{
"name": "seed_rate",
"levels": [
"30",
"80"
],
"type": "continuous",
"unit": "g/m2"
}
],
"fixed_factors": {
"remaining_bluegrass_pct": "balance",
"mowing_height_mm": "50"
},
"responses": [
{
"name": "density_score",
"optimize": "maximize",
"unit": "pts"
},
{
"name": "drought_tolerance",
"optimize": "maximize",
"unit": "pts"
}
],
"settings": {
"operation": "box_behnken",
"test_script": "use_cases/101_lawn_grass_mix/sim.sh"
}
}
Experimental Matrix
The Box-Behnken Design produces 15 runs. Each row is one experiment with specific factor settings.
| Run | ryegrass_pct | fescue_pct | seed_rate |
| 1 | 40 | 20 | 30 |
| 2 | 40 | 40 | 55 |
| 3 | 60 | 40 | 80 |
| 4 | 60 | 40 | 30 |
| 5 | 40 | 40 | 55 |
| 6 | 40 | 40 | 55 |
| 7 | 20 | 40 | 80 |
| 8 | 60 | 20 | 55 |
| 9 | 40 | 20 | 80 |
| 10 | 60 | 60 | 55 |
| 11 | 20 | 40 | 30 |
| 12 | 40 | 60 | 80 |
| 13 | 20 | 20 | 55 |
| 14 | 20 | 60 | 55 |
| 15 | 40 | 60 | 30 |
Step-by-Step Workflow
1
Preview the design
$ doe info --config use_cases/101_lawn_grass_mix/config.json
2
Generate the runner script
$ doe generate --config use_cases/101_lawn_grass_mix/config.json \
--output use_cases/101_lawn_grass_mix/results/run.sh --seed 42
3
Execute the experiments
$ bash use_cases/101_lawn_grass_mix/results/run.sh
4
Analyze results
$ doe analyze --config use_cases/101_lawn_grass_mix/config.json
5
Get optimization recommendations
$ doe optimize --config use_cases/101_lawn_grass_mix/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/101_lawn_grass_mix/config.json --multi
7
Generate the HTML report
$ doe report --config use_cases/101_lawn_grass_mix/config.json \
--output use_cases/101_lawn_grass_mix/results/report.html
Features Exercised
| Feature | Value |
| Design type | box_behnken |
| Factor types | continuous (all 3) |
| Arg style | double-dash |
| Responses | 2 (density_score ↑, drought_tolerance ↑) |
| Total runs | 15 |
Analysis Results
Generated from actual experiment runs using the DOE Helper Tool.
Response: density_score
Top factors: fescue_pct (51.0%), ryegrass_pct (40.2%), seed_rate (8.8%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| ryegrass_pct | 2 | 2.8212 | 1.4106 | 1.679 | 0.2461 |
| fescue_pct | 2 | 4.5098 | 2.2549 | 2.684 | 0.1282 |
| seed_rate | 2 | 0.1383 | 0.0692 | 0.082 | 0.9217 |
| Lack | of | Fit | 6 | 15.5840 | 2.5973 |
| Pure | Error | 2 | 1.6800 | | |
| Error | 8 | 17.2640 | 0.8400 | | |
| Total | 14 | 24.7333 | 1.7667 | | |
Pareto Chart
Main Effects Plot
Normal Probability Plot of Effects
Half-Normal Plot of Effects
Model Diagnostics
Response: drought_tolerance
Top factors: seed_rate (39.0%), fescue_pct (31.6%), ryegrass_pct (29.4%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| ryegrass_pct | 2 | 3.5388 | 1.7694 | 3.141 | 0.0985 |
| fescue_pct | 2 | 3.7480 | 1.8740 | 3.327 | 0.0888 |
| seed_rate | 2 | 6.1830 | 3.0915 | 5.488 | 0.0316 |
| Lack | of | Fit | 6 | 12.1008 | 2.0168 |
| Pure | Error | 2 | 1.1267 | | |
| Error | 8 | 13.2275 | 0.5633 | | |
| Total | 14 | 26.6973 | 1.9070 | | |
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.
density score fescue pct vs seed rate
density score ryegrass pct vs fescue pct
density score ryegrass pct vs seed rate
drought tolerance fescue pct vs seed rate
drought tolerance ryegrass pct vs fescue pct
drought tolerance ryegrass pct vs seed rate
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.8657
Per-Response Desirability
| Response | Weight | Desirability | Predicted | Dir |
density_score |
1.5 |
|
7.30 0.8911 7.30 pts |
↑ |
drought_tolerance |
1.5 |
|
7.10 0.8409 7.10 pts |
↑ |
Recommended Settings
| Factor | Value |
ryegrass_pct | 40 % |
fescue_pct | 60 % |
seed_rate | 30 g/m2 |
Source: from observed run #12
Trade-off Summary
Sacrifice = how much worse than single-objective best.
| Response | Predicted | Best Observed | Sacrifice |
drought_tolerance | 7.10 | 7.70 | +0.60 |
Top 3 Runs by Desirability
| Run | D | Factor Settings |
| #10 | 0.7331 | ryegrass_pct=60, fescue_pct=20, seed_rate=55 |
| #3 | 0.6642 | ryegrass_pct=60, fescue_pct=40, seed_rate=30 |
Model Quality
| Response | R² | Type |
drought_tolerance | 0.6242 | quadratic |
Full Multi-Objective Output
============================================================
MULTI-OBJECTIVE OPTIMIZATION
Method: Derringer-Suich Desirability Function
============================================================
Overall desirability: D = 0.8657
Response Weight Desirability Predicted Direction
---------------------------------------------------------------------
density_score 1.5 0.8911 7.30 pts ↑
drought_tolerance 1.5 0.8409 7.10 pts ↑
Recommended settings:
ryegrass_pct = 40 %
fescue_pct = 60 %
seed_rate = 30 g/m2
(from observed run #12)
Trade-off summary:
density_score: 7.30 (best observed: 7.60, sacrifice: +0.30)
drought_tolerance: 7.10 (best observed: 7.70, sacrifice: +0.60)
Model quality:
density_score: R² = 0.8634 (quadratic)
drought_tolerance: R² = 0.6242 (quadratic)
Top 3 observed runs by overall desirability:
1. Run #12 (D=0.8657): ryegrass_pct=40, fescue_pct=60, seed_rate=30
2. Run #10 (D=0.7331): ryegrass_pct=60, fescue_pct=20, seed_rate=55
3. Run #3 (D=0.6642): ryegrass_pct=60, fescue_pct=40, seed_rate=30
Full Analysis Output
=== Main Effects: density_score ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
fescue_pct 1.3107 0.3432 51.0%
ryegrass_pct 1.0321 0.3432 40.2%
seed_rate 0.2250 0.3432 8.8%
=== ANOVA Table: density_score ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
ryegrass_pct 2 2.8212 1.4106 1.679 0.2461
fescue_pct 2 4.5098 2.2549 2.684 0.1282
seed_rate 2 0.1383 0.0692 0.082 0.9217
Lack of Fit 6 15.5840 2.5973 3.092 0.2644
Pure Error 2 1.6800 0.8400
Error 8 17.2640 0.8400
Total 14 24.7333 1.7667
=== Summary Statistics: density_score ===
ryegrass_pct:
Level N Mean Std Min Max
------------------------------------------------------------
20 4 5.0250 1.4728 3.3000 6.3000
40 7 6.0571 1.1928 4.8000 7.6000
60 4 5.8750 1.5130 3.8000 7.3000
fescue_pct:
Level N Mean Std Min Max
------------------------------------------------------------
20 4 6.6250 0.9708 5.4000 7.5000
40 7 5.3143 1.0383 3.8000 6.7000
60 4 5.5750 1.9085 3.3000 7.6000
seed_rate:
Level N Mean Std Min Max
------------------------------------------------------------
30 4 5.5750 1.6174 3.8000 7.5000
55 7 5.8000 1.3601 3.3000 7.3000
80 4 5.7750 1.3720 4.3000 7.6000
=== Main Effects: drought_tolerance ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
seed_rate 1.4786 0.3566 39.0%
fescue_pct 1.1964 0.3566 31.6%
ryegrass_pct 1.1143 0.3566 29.4%
=== ANOVA Table: drought_tolerance ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
ryegrass_pct 2 3.5388 1.7694 3.141 0.0985
fescue_pct 2 3.7480 1.8740 3.327 0.0888
seed_rate 2 6.1830 3.0915 5.488 0.0316
Lack of Fit 6 12.1008 2.0168 3.580 0.2344
Pure Error 2 1.1267 0.5633
Error 8 13.2275 0.5633
Total 14 26.6973 1.9070
=== Summary Statistics: drought_tolerance ===
ryegrass_pct:
Level N Mean Std Min Max
------------------------------------------------------------
20 4 5.0500 1.2557 3.5000 6.3000
40 7 5.8143 1.0991 4.4000 7.7000
60 4 4.7000 1.9305 2.9000 7.1000
fescue_pct:
Level N Mean Std Min Max
------------------------------------------------------------
20 4 5.1750 1.5692 3.5000 7.1000
40 7 4.9286 1.3829 2.9000 6.7000
60 4 6.1250 1.1673 5.1000 7.7000
seed_rate:
Level N Mean Std Min Max
------------------------------------------------------------
30 4 5.6500 1.7597 3.4000 7.7000
55 7 5.7286 1.1926 3.5000 7.1000
80 4 4.2500 0.9469 2.9000 5.1000
Optimization Recommendations
=== Optimization: density_score ===
Direction: maximize
Best observed run: #3
ryegrass_pct = 60
fescue_pct = 40
seed_rate = 80
Value: 7.6
RSM Model (linear, R² = 0.5395, Adj R² = 0.4139):
Coefficients:
intercept +5.7333
ryegrass_pct +0.9125
fescue_pct -0.7000
seed_rate +0.5875
RSM Model (quadratic, R² = 0.6693, Adj R² = 0.0741):
Coefficients:
intercept +6.0333
ryegrass_pct +0.9125
fescue_pct -0.7000
seed_rate +0.5875
ryegrass_pct*fescue_pct -0.5500
ryegrass_pct*seed_rate -0.4750
fescue_pct*seed_rate +0.1500
ryegrass_pct^2 -0.2292
fescue_pct^2 -0.4542
seed_rate^2 +0.1208
Curvature analysis:
fescue_pct coef=-0.4542 concave (has a maximum)
ryegrass_pct coef=-0.2292 concave (has a maximum)
seed_rate coef=+0.1208 convex (has a minimum)
Notable interactions:
ryegrass_pct*fescue_pct coef=-0.5500 (antagonistic)
ryegrass_pct*seed_rate coef=-0.4750 (antagonistic)
Predicted optimum (from linear model, at observed points):
ryegrass_pct = 60
fescue_pct = 20
seed_rate = 55
Predicted value: 7.3458
Surface optimum (via L-BFGS-B, linear model):
ryegrass_pct = 60
fescue_pct = 20
seed_rate = 80
Predicted value: 7.9333
Model quality: Moderate fit — use predictions directionally, not precisely.
Factor importance:
1. ryegrass_pct (effect: 1.8, contribution: 41.5%)
2. fescue_pct (effect: 1.4, contribution: 31.8%)
3. seed_rate (effect: 1.2, contribution: 26.7%)
=== Optimization: drought_tolerance ===
Direction: maximize
Best observed run: #14
ryegrass_pct = 40
fescue_pct = 40
seed_rate = 55
Value: 7.7
RSM Model (linear, R² = 0.0438, Adj R² = -0.2170):
Coefficients:
intercept +5.3133
ryegrass_pct +0.1000
fescue_pct -0.1750
seed_rate -0.3250
RSM Model (quadratic, R² = 0.8266, Adj R² = 0.5144):
Coefficients:
intercept +6.1000
ryegrass_pct +0.1000
fescue_pct -0.1750
seed_rate -0.3250
ryegrass_pct*fescue_pct -1.0000
ryegrass_pct*seed_rate -0.6000
fescue_pct*seed_rate -0.9500
ryegrass_pct^2 -0.2750
fescue_pct^2 -1.6750
seed_rate^2 +0.4750
Curvature analysis:
fescue_pct coef=-1.6750 concave (has a maximum)
seed_rate coef=+0.4750 convex (has a minimum)
ryegrass_pct coef=-0.2750 concave (has a maximum)
Notable interactions:
ryegrass_pct*fescue_pct coef=-1.0000 (antagonistic)
fescue_pct*seed_rate coef=-0.9500 (antagonistic)
ryegrass_pct*seed_rate coef=-0.6000 (antagonistic)
Predicted optimum (from quadratic model, at observed points):
ryegrass_pct = 60
fescue_pct = 40
seed_rate = 30
Predicted value: 7.3250
Surface optimum (via L-BFGS-B, quadratic model):
ryegrass_pct = 60
fescue_pct = 38.6567
seed_rate = 30
Predicted value: 7.3326
Model quality: Good fit — general trends are captured, some noise remains.
Factor importance:
1. fescue_pct (effect: 1.9, contribution: 60.3%)
2. seed_rate (effect: 0.9, contribution: 30.4%)
3. ryegrass_pct (effect: 0.3, contribution: 9.4%)