← All Use Cases
🌱
Box-Behnken Design

Lawn Grass Seed Mix

Box-Behnken design to optimize turf density and drought tolerance by tuning perennial ryegrass ratio, fescue ratio, and seeding rate

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

Experimental Setup

Factors

FactorLowHighUnit
ryegrass_pct2060%
fescue_pct2060%
seed_rate3080g/m2

Fixed: remaining_bluegrass_pct = balance, mowing_height_mm = 50

Responses

ResponseDirectionUnit
density_score↑ maximizepts
drought_tolerance↑ maximizepts

Configuration

use_cases/101_lawn_grass_mix/config.json
{ "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.

Runryegrass_pctfescue_pctseed_rate
1402030
2404055
3604080
4604030
5404055
6404055
7204080
8602055
9402080
10606055
11204030
12406080
13202055
14206055
15406030

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/101_lawn_grass_mix/config.json
2

Generate the runner script

Terminal
$ 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

Terminal
$ bash use_cases/101_lawn_grass_mix/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/101_lawn_grass_mix/config.json
5

Get optimization recommendations

Terminal
$ 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.

Terminal
$ doe optimize --config use_cases/101_lawn_grass_mix/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/101_lawn_grass_mix/config.json \ --output use_cases/101_lawn_grass_mix/results/report.html

Features Exercised

FeatureValue
Design typebox_behnken
Factor typescontinuous (all 3)
Arg styledouble-dash
Responses2 (density_score ↑, drought_tolerance ↑)
Total runs15

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

SourceDFSSMSFp-value
SourceDFSSMSFp-value
ryegrass_pct22.82121.41061.6790.2461
fescue_pct24.50982.25492.6840.1282
seed_rate20.13830.06920.0820.9217
LackofFit615.58402.5973
PureError21.6800
Error817.26400.8400
Total1424.73331.7667

Pareto Chart

Pareto chart for density_score

Main Effects Plot

Main effects plot for density_score

Normal Probability Plot of Effects

Normal probability plot for density_score

Half-Normal Plot of Effects

Half-normal plot for density_score

Model Diagnostics

Model diagnostics for density_score

Response: drought_tolerance

Top factors: seed_rate (39.0%), fescue_pct (31.6%), ryegrass_pct (29.4%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
ryegrass_pct23.53881.76943.1410.0985
fescue_pct23.74801.87403.3270.0888
seed_rate26.18303.09155.4880.0316
LackofFit612.10082.0168
PureError21.1267
Error813.22750.5633
Total1426.69731.9070

Pareto Chart

Pareto chart for drought_tolerance

Main Effects Plot

Main effects plot for drought_tolerance

Normal Probability Plot of Effects

Normal probability plot for drought_tolerance

Half-Normal Plot of Effects

Half-normal plot for drought_tolerance

Model Diagnostics

Model diagnostics for drought_tolerance

Response Surface Plots

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

density score fescue pct vs seed rate

RSM surface: density score fescue pct vs seed rate

density score ryegrass pct vs fescue pct

RSM surface: density score ryegrass pct vs fescue pct

density score ryegrass pct vs seed rate

RSM surface: density score ryegrass pct vs seed rate

drought tolerance fescue pct vs seed rate

RSM surface: drought tolerance fescue pct vs seed rate

drought tolerance ryegrass pct vs fescue pct

RSM surface: drought tolerance ryegrass pct vs fescue pct

drought tolerance ryegrass pct vs seed rate

RSM surface: 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

ResponseWeightDesirabilityPredictedDir
density_score 1.5
0.8911
7.30 0.8911 7.30 pts
drought_tolerance 1.5
0.8409
7.10 0.8409 7.10 pts

Recommended Settings

FactorValue
ryegrass_pct40 %
fescue_pct60 %
seed_rate30 g/m2

Source: from observed run #12

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
drought_tolerance7.107.70+0.60

Top 3 Runs by Desirability

RunDFactor Settings
#100.7331ryegrass_pct=60, fescue_pct=20, seed_rate=55
#30.6642ryegrass_pct=60, fescue_pct=40, seed_rate=30

Model Quality

ResponseType
drought_tolerance0.6242quadratic

Full Multi-Objective Output

doe optimize --multi
============================================================ 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

doe analyze
=== 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

doe optimize
=== 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%)
← Previous: Hydroponic Nutrient Solution Next: Fruit Tree Pruning Strategy →