← All Use Cases
🏋
Box-Behnken Design

Running Training Plan

Box-Behnken design to maximize VO2max improvement and minimize injury risk by tuning weekly mileage, long run percentage, and interval intensity

Summary

This experiment investigates running training plan. Box-Behnken design to maximize VO2max improvement and minimize injury risk by tuning weekly mileage, long run percentage, and interval intensity.

The design varies 3 factors: weekly km (km), ranging from 20 to 60, long run pct (%), ranging from 20 to 40, and interval pct max (%HR_max), ranging from 80 to 100. The goal is to optimize 2 responses: vo2max gain (mL/kg/min) (maximize) and injury risk (%) (minimize). Fixed conditions held constant across all runs include rest days = 2, runner level = intermediate.

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 vo2max gain, the most influential factors were long run pct (53.7%), interval pct max (32.2%), weekly km (14.2%). The best observed value was 5.3 (at weekly km = 20, long run pct = 30, interval pct max = 80).

For injury risk, the most influential factors were long run pct (50.1%), interval pct max (39.9%), weekly km (10.0%). The best observed value was 8.0 (at weekly km = 40, long run pct = 40, interval pct max = 100).

Recommended Next Steps

Experimental Setup

Factors

FactorLowHighUnit
weekly_km2060km
long_run_pct2040%
interval_pct_max80100%HR_max

Fixed: rest_days = 2, runner_level = intermediate

Responses

ResponseDirectionUnit
vo2max_gain↑ maximizemL/kg/min
injury_risk↓ minimize%

Configuration

use_cases/108_running_performance/config.json
{ "metadata": { "name": "Running Training Plan", "description": "Box-Behnken design to maximize VO2max improvement and minimize injury risk by tuning weekly mileage, long run percentage, and interval intensity" }, "factors": [ { "name": "weekly_km", "levels": [ "20", "60" ], "type": "continuous", "unit": "km" }, { "name": "long_run_pct", "levels": [ "20", "40" ], "type": "continuous", "unit": "%" }, { "name": "interval_pct_max", "levels": [ "80", "100" ], "type": "continuous", "unit": "%HR_max" } ], "fixed_factors": { "rest_days": "2", "runner_level": "intermediate" }, "responses": [ { "name": "vo2max_gain", "optimize": "maximize", "unit": "mL/kg/min" }, { "name": "injury_risk", "optimize": "minimize", "unit": "%" } ], "settings": { "operation": "box_behnken", "test_script": "use_cases/108_running_performance/sim.sh" } }

Experimental Matrix

The Box-Behnken Design produces 15 runs. Each row is one experiment with specific factor settings.

Runweekly_kmlong_run_pctinterval_pct_max
1402080
2403090
36030100
4603080
5403090
6403090
72030100
8602090
94020100
10604090
11203080
124040100
13202090
14204090
15404080

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/108_running_performance/config.json
2

Generate the runner script

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

Execute the experiments

Terminal
$ bash use_cases/108_running_performance/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/108_running_performance/config.json
5

Get optimization recommendations

Terminal
$ doe optimize --config use_cases/108_running_performance/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/108_running_performance/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/108_running_performance/config.json \ --output use_cases/108_running_performance/results/report.html

Features Exercised

FeatureValue
Design typebox_behnken
Factor typescontinuous (all 3)
Arg styledouble-dash
Responses2 (vo2max_gain ↑, injury_risk ↓)
Total runs15

Analysis Results

Generated from actual experiment runs using the DOE Helper Tool.

Response: vo2max_gain

Top factors: long_run_pct (53.7%), interval_pct_max (32.2%), weekly_km (14.2%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
weekly_km20.52470.26230.0620.9399
long_run_pct26.17183.08590.7340.5096
interval_pct_max22.60001.30000.3090.7424
LackofFit612.84612.1410
PureError28.4067
Error821.25284.2033
Total1430.54932.1821

Pareto Chart

Pareto chart for vo2max_gain

Main Effects Plot

Main effects plot for vo2max_gain

Normal Probability Plot of Effects

Normal probability plot for vo2max_gain

Half-Normal Plot of Effects

Half-normal plot for vo2max_gain

Model Diagnostics

Model diagnostics for vo2max_gain

Response: injury_risk

Top factors: long_run_pct (50.1%), interval_pct_max (39.9%), weekly_km (10.0%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
weekly_km26.60003.30000.0220.9782
long_run_pct2118.671459.33570.3970.6847
interval_pct_max290.671445.33570.3040.7463
LackofFit6318.990553.1651
PureError2298.6667
Error8617.6571149.3333
Total14833.600059.5429

Pareto Chart

Pareto chart for injury_risk

Main Effects Plot

Main effects plot for injury_risk

Normal Probability Plot of Effects

Normal probability plot for injury_risk

Half-Normal Plot of Effects

Half-normal plot for injury_risk

Model Diagnostics

Model diagnostics for injury_risk

Response Surface Plots

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

injury risk long run pct vs interval pct max

RSM surface: injury risk long run pct vs interval pct max

injury risk weekly km vs interval pct max

RSM surface: injury risk weekly km vs interval pct max

injury risk weekly km vs long run pct

RSM surface: injury risk weekly km vs long run pct

vo2max gain long run pct vs interval pct max

RSM surface: vo2max gain long run pct vs interval pct max

vo2max gain weekly km vs interval pct max

RSM surface: vo2max gain weekly km vs interval pct max

vo2max gain weekly km vs long run pct

RSM surface: vo2max gain weekly km vs long run pct

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

Per-Response Desirability

ResponseWeightDesirabilityPredictedDir
vo2max_gain 1.5
0.5978
3.30 0.5978 3.30 mL/kg/min
injury_risk 2.0
0.6622
16.04 0.6622 16.04 %

Recommended Settings

FactorValue
weekly_km36 km
long_run_pct20 %
interval_pct_max100 %HR_max

Source: from RSM model prediction

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
injury_risk16.048.00+8.04

Top 3 Runs by Desirability

RunDFactor Settings
#50.6182weekly_km=40, long_run_pct=20, interval_pct_max=100
#60.5735weekly_km=60, long_run_pct=30, interval_pct_max=100

Model Quality

ResponseType
injury_risk0.9497quadratic

Full Multi-Objective Output

doe optimize --multi
============================================================ MULTI-OBJECTIVE OPTIMIZATION Method: Derringer-Suich Desirability Function ============================================================ Overall desirability: D = 0.6338 Response Weight Desirability Predicted Direction --------------------------------------------------------------------- vo2max_gain 1.5 0.5978 3.30 mL/kg/min ↑ injury_risk 2.0 0.6622 16.04 % ↓ Recommended settings: weekly_km = 36 km long_run_pct = 20 % interval_pct_max = 100 %HR_max (from RSM model prediction) Trade-off summary: vo2max_gain: 3.30 (best observed: 5.30, sacrifice: +2.00) injury_risk: 16.04 (best observed: 8.00, sacrifice: +8.04) Model quality: vo2max_gain: R² = 0.8881 (quadratic) injury_risk: R² = 0.9497 (quadratic) Top 3 observed runs by overall desirability: 1. Run #2 (D=0.6182): weekly_km=40, long_run_pct=30, interval_pct_max=90 2. Run #5 (D=0.6182): weekly_km=40, long_run_pct=20, interval_pct_max=100 3. Run #6 (D=0.5735): weekly_km=60, long_run_pct=30, interval_pct_max=100

Full Analysis Output

doe analyze
=== Main Effects: vo2max_gain === Factor Effect Std Error % Contribution -------------------------------------------------------------- long_run_pct 1.6750 0.3814 53.7% interval_pct_max 1.0036 0.3814 32.2% weekly_km 0.4429 0.3814 14.2% === ANOVA Table: vo2max_gain === Source DF SS MS F p-value ----------------------------------------------------------------------------- weekly_km 2 0.5247 0.2623 0.062 0.9399 long_run_pct 2 6.1718 3.0859 0.734 0.5096 interval_pct_max 2 2.6000 1.3000 0.309 0.7424 Lack of Fit 6 12.8461 2.1410 0.509 0.7792 Pure Error 2 8.4067 4.2033 Error 8 21.2528 4.2033 Total 14 30.5493 2.1821 === Summary Statistics: vo2max_gain === weekly_km: Level N Mean Std Min Max ------------------------------------------------------------ 20 4 2.8000 0.4967 2.1000 3.2000 40 7 2.3571 2.1015 0.2000 5.3000 60 4 2.4250 0.9639 1.5000 3.4000 long_run_pct: Level N Mean Std Min Max ------------------------------------------------------------ 20 4 3.1500 1.8877 0.7000 5.3000 30 7 2.7000 1.3102 0.6000 4.2000 40 4 1.4750 1.0626 0.2000 2.8000 interval_pct_max: Level N Mean Std Min Max ------------------------------------------------------------ 100 4 1.8250 1.0243 0.7000 3.1000 80 4 2.5750 2.1685 0.2000 5.3000 90 7 2.8286 1.3351 0.6000 4.2000 === Main Effects: injury_risk === Factor Effect Std Error % Contribution -------------------------------------------------------------- long_run_pct 7.5000 1.9924 50.1% interval_pct_max 5.9643 1.9924 39.9% weekly_km 1.5000 1.9924 10.0% === ANOVA Table: injury_risk === Source DF SS MS F p-value ----------------------------------------------------------------------------- weekly_km 2 6.6000 3.3000 0.022 0.9782 long_run_pct 2 118.6714 59.3357 0.397 0.6847 interval_pct_max 2 90.6714 45.3357 0.304 0.7463 Lack of Fit 6 318.9905 53.1651 0.356 0.8623 Pure Error 2 298.6667 149.3333 Error 8 617.6571 149.3333 Total 14 833.6000 59.5429 === Summary Statistics: injury_risk === weekly_km: Level N Mean Std Min Max ------------------------------------------------------------ 20 4 18.0000 1.8257 16.0000 20.0000 40 7 18.0000 11.2990 8.0000 33.0000 60 4 16.5000 4.1231 12.0000 22.0000 long_run_pct: Level N Mean Std Min Max ------------------------------------------------------------ 20 4 20.7500 9.8784 9.0000 33.0000 30 7 18.2857 7.9522 8.0000 32.0000 40 4 13.2500 3.7749 10.0000 17.0000 interval_pct_max: Level N Mean Std Min Max ------------------------------------------------------------ 100 4 13.7500 5.1881 9.0000 20.0000 80 4 17.7500 10.4682 10.0000 33.0000 90 7 19.7143 7.4546 8.0000 32.0000

Optimization Recommendations

doe optimize
=== Optimization: vo2max_gain === Direction: maximize Best observed run: #3 weekly_km = 20 long_run_pct = 30 interval_pct_max = 80 Value: 5.3 RSM Model (linear, R² = 0.1189, Adj R² = -0.1214): Coefficients: intercept +2.4933 weekly_km -0.5875 long_run_pct -0.1375 interval_pct_max +0.3000 RSM Model (quadratic, R² = 0.5858, Adj R² = -0.1598): Coefficients: intercept +2.4667 weekly_km -0.5875 long_run_pct -0.1375 interval_pct_max +0.3000 weekly_km*long_run_pct -0.3500 weekly_km*interval_pct_max +1.1250 long_run_pct*interval_pct_max -0.3250 weekly_km^2 +1.1917 long_run_pct^2 -0.5583 interval_pct_max^2 -0.5833 Curvature analysis: weekly_km coef=+1.1917 convex (has a minimum) interval_pct_max coef=-0.5833 concave (has a maximum) long_run_pct coef=-0.5583 concave (has a maximum) Notable interactions: weekly_km*interval_pct_max coef=+1.1250 (synergistic) weekly_km*long_run_pct coef=-0.3500 (antagonistic) long_run_pct*interval_pct_max coef=-0.3250 (antagonistic) Predicted optimum (from linear model, at observed points): weekly_km = 20 long_run_pct = 30 interval_pct_max = 100 Predicted value: 3.3808 Surface optimum (via L-BFGS-B, linear model): weekly_km = 20 long_run_pct = 20 interval_pct_max = 100 Predicted value: 3.5183 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. weekly_km (effect: 1.9, contribution: 52.7%) 2. interval_pct_max (effect: 0.9, contribution: 26.3%) 3. long_run_pct (effect: 0.7, contribution: 21.0%) === Optimization: injury_risk === Direction: minimize Best observed run: #11 weekly_km = 40 long_run_pct = 40 interval_pct_max = 100 Value: 8.0 RSM Model (linear, R² = 0.1551, Adj R² = -0.0754): Coefficients: intercept +17.6000 weekly_km -4.0000 long_run_pct +0.1250 interval_pct_max -0.3750 RSM Model (quadratic, R² = 0.5972, Adj R² = -0.1278): Coefficients: intercept +20.0000 weekly_km -4.0000 long_run_pct +0.1250 interval_pct_max -0.3750 weekly_km*long_run_pct +0.2500 weekly_km*interval_pct_max +5.2500 long_run_pct*interval_pct_max -2.0000 weekly_km^2 +4.5000 long_run_pct^2 -3.7500 interval_pct_max^2 -5.2500 Curvature analysis: interval_pct_max coef=-5.2500 concave (has a maximum) weekly_km coef=+4.5000 convex (has a minimum) long_run_pct coef=-3.7500 concave (has a maximum) Notable interactions: weekly_km*interval_pct_max coef=+5.2500 (synergistic) long_run_pct*interval_pct_max coef=-2.0000 (antagonistic) Predicted optimum (from linear model, at observed points): weekly_km = 20 long_run_pct = 30 interval_pct_max = 80 Predicted value: 21.9750 Surface optimum (via L-BFGS-B, linear model): weekly_km = 60 long_run_pct = 20 interval_pct_max = 100 Predicted value: 13.1000 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. weekly_km (effect: 9.1, contribution: 49.0%) 2. interval_pct_max (effect: 5.7, contribution: 30.5%) 3. long_run_pct (effect: 3.8, contribution: 20.5%)
← Previous: Sleep Quality Optimization Next: Strength Training Program →