Summary
This experiment investigates fruit tree pruning strategy. Full factorial of pruning intensity, timing, branch angle, and thinning ratio to maximize fruit size and total yield per tree.
The design varies 4 factors: prune intensity (%), ranging from 10 to 40, prune month (month), ranging from 1 to 3, branch angle (deg), ranging from 30 to 60, and thin ratio (%), ranging from 0 to 50. The goal is to optimize 2 responses: fruit size g (g) (maximize) and yield kg (kg/tree) (maximize). Fixed conditions held constant across all runs include tree age = 7yr, variety = honeycrisp_apple.
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 fruit size g, the most influential factors were thin ratio (42.3%), prune intensity (35.6%), branch angle (11.9%). The best observed value was 234.0 (at prune intensity = 10, prune month = 1, branch angle = 60).
For yield kg, the most influential factors were branch angle (32.9%), thin ratio (31.4%), prune intensity (20.9%). The best observed value was 68.9 (at prune intensity = 10, prune month = 1, branch angle = 30).
Recommended Next Steps
- Consider whether any fixed factors should be varied in a future study.
Experimental Setup
Factors
| Factor | Low | High | Unit |
prune_intensity | 10 | 40 | % |
prune_month | 1 | 3 | month |
branch_angle | 30 | 60 | deg |
thin_ratio | 0 | 50 | % |
Fixed: tree_age = 7yr, variety = honeycrisp_apple
Responses
| Response | Direction | Unit |
fruit_size_g | ↑ maximize | g |
yield_kg | ↑ maximize | kg/tree |
Configuration
{
"metadata": {
"name": "Fruit Tree Pruning Strategy",
"description": "Full factorial of pruning intensity, timing, branch angle, and thinning ratio to maximize fruit size and total yield per tree"
},
"factors": [
{
"name": "prune_intensity",
"levels": [
"10",
"40"
],
"type": "continuous",
"unit": "%"
},
{
"name": "prune_month",
"levels": [
"1",
"3"
],
"type": "continuous",
"unit": "month"
},
{
"name": "branch_angle",
"levels": [
"30",
"60"
],
"type": "continuous",
"unit": "deg"
},
{
"name": "thin_ratio",
"levels": [
"0",
"50"
],
"type": "continuous",
"unit": "%"
}
],
"fixed_factors": {
"tree_age": "7yr",
"variety": "honeycrisp_apple"
},
"responses": [
{
"name": "fruit_size_g",
"optimize": "maximize",
"unit": "g"
},
{
"name": "yield_kg",
"optimize": "maximize",
"unit": "kg/tree"
}
],
"settings": {
"operation": "full_factorial",
"test_script": "use_cases/102_fruit_tree_pruning/sim.sh"
}
}
Experimental Matrix
The Full Factorial Design produces 16 runs. Each row is one experiment with specific factor settings.
| Run | prune_intensity | prune_month | branch_angle | thin_ratio |
| 1 | 10 | 3 | 60 | 50 |
| 2 | 40 | 1 | 30 | 50 |
| 3 | 10 | 3 | 30 | 50 |
| 4 | 10 | 3 | 60 | 0 |
| 5 | 40 | 3 | 60 | 0 |
| 6 | 40 | 1 | 60 | 0 |
| 7 | 40 | 3 | 30 | 0 |
| 8 | 40 | 1 | 30 | 0 |
| 9 | 10 | 1 | 30 | 50 |
| 10 | 10 | 1 | 60 | 0 |
| 11 | 40 | 3 | 30 | 50 |
| 12 | 40 | 3 | 60 | 50 |
| 13 | 10 | 3 | 30 | 0 |
| 14 | 40 | 1 | 60 | 50 |
| 15 | 10 | 1 | 30 | 0 |
| 16 | 10 | 1 | 60 | 50 |
Step-by-Step Workflow
1
Preview the design
$ doe info --config use_cases/102_fruit_tree_pruning/config.json
2
Generate the runner script
$ doe generate --config use_cases/102_fruit_tree_pruning/config.json \
--output use_cases/102_fruit_tree_pruning/results/run.sh --seed 42
3
Execute the experiments
$ bash use_cases/102_fruit_tree_pruning/results/run.sh
4
Analyze results
$ doe analyze --config use_cases/102_fruit_tree_pruning/config.json
5
Get optimization recommendations
$ doe optimize --config use_cases/102_fruit_tree_pruning/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/102_fruit_tree_pruning/config.json --multi
7
Generate the HTML report
$ doe report --config use_cases/102_fruit_tree_pruning/config.json \
--output use_cases/102_fruit_tree_pruning/results/report.html
Features Exercised
| Feature | Value |
| Design type | full_factorial |
| Factor types | continuous (all 4) |
| Arg style | double-dash |
| Responses | 2 (fruit_size_g ↑, yield_kg ↑) |
| Total runs | 16 |
Analysis Results
Generated from actual experiment runs using the DOE Helper Tool.
Response: fruit_size_g
Top factors: thin_ratio (42.3%), prune_intensity (35.6%), branch_angle (11.9%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| prune_intensity | 1 | 1190.2500 | 1190.2500 | 0.622 | 0.4662 |
| prune_month | 1 | 100.0000 | 100.0000 | 0.052 | 0.8283 |
| branch_angle | 1 | 132.2500 | 132.2500 | 0.069 | 0.8032 |
| thin_ratio | 1 | 1681.0000 | 1681.0000 | 0.878 | 0.3918 |
| prune_intensity*prune_month | 1 | 256.0000 | 256.0000 | 0.134 | 0.7296 |
| prune_intensity*branch_angle | 1 | 812.2500 | 812.2500 | 0.424 | 0.5436 |
| prune_intensity*thin_ratio | 1 | 1024.0000 | 1024.0000 | 0.535 | 0.4974 |
| prune_month*branch_angle | 1 | 49.0000 | 49.0000 | 0.026 | 0.8792 |
| prune_month*thin_ratio | 1 | 110.2500 | 110.2500 | 0.058 | 0.8199 |
| branch_angle*thin_ratio | 1 | 225.0000 | 225.0000 | 0.118 | 0.7457 |
| Error | 5 | 9573.7500 | 1914.7500 | | |
| Total | 15 | 15153.7500 | 1010.2500 | | |
Pareto Chart
Main Effects Plot
Normal Probability Plot of Effects
Half-Normal Plot of Effects
Model Diagnostics
Response: yield_kg
Top factors: branch_angle (32.9%), thin_ratio (31.4%), prune_intensity (20.9%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| prune_intensity | 1 | 148.8400 | 148.8400 | 0.389 | 0.5599 |
| prune_month | 1 | 75.6900 | 75.6900 | 0.198 | 0.6749 |
| branch_angle | 1 | 370.5625 | 370.5625 | 0.970 | 0.3700 |
| thin_ratio | 1 | 336.7225 | 336.7225 | 0.881 | 0.3910 |
| prune_intensity*prune_month | 1 | 282.2400 | 282.2400 | 0.739 | 0.4294 |
| prune_intensity*branch_angle | 1 | 386.1225 | 386.1225 | 1.010 | 0.3609 |
| prune_intensity*thin_ratio | 1 | 308.0025 | 308.0025 | 0.806 | 0.4105 |
| prune_month*branch_angle | 1 | 12.6025 | 12.6025 | 0.033 | 0.8630 |
| prune_month*thin_ratio | 1 | 122.1025 | 122.1025 | 0.320 | 0.5963 |
| branch_angle*thin_ratio | 1 | 86.4900 | 86.4900 | 0.226 | 0.6543 |
| Error | 5 | 1910.7350 | 382.1470 | | |
| Total | 15 | 4040.1100 | 269.3407 | | |
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.
fruit size g branch angle vs thin ratio
fruit size g prune intensity vs branch angle
fruit size g prune intensity vs prune month
fruit size g prune intensity vs thin ratio
fruit size g prune month vs branch angle
fruit size g prune month vs thin ratio
yield kg branch angle vs thin ratio
yield kg prune intensity vs branch angle
yield kg prune intensity vs prune month
yield kg prune intensity vs thin ratio
yield kg prune month vs branch angle
yield kg prune month vs thin ratio
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.6285
Per-Response Desirability
| Response | Weight | Desirability | Predicted | Dir |
fruit_size_g |
1.5 |
|
193.00 0.6304 193.00 g |
↑ |
yield_kg |
1.5 |
|
49.60 0.6266 49.60 kg/tree |
↑ |
Recommended Settings
| Factor | Value |
prune_intensity | 10 % |
prune_month | 1 month |
branch_angle | 30 deg |
thin_ratio | 50 % |
Source: from observed run #1
Trade-off Summary
Sacrifice = how much worse than single-objective best.
| Response | Predicted | Best Observed | Sacrifice |
yield_kg | 49.60 | 68.90 | +19.30 |
Top 3 Runs by Desirability
| Run | D | Factor Settings |
| #5 | 0.5543 | prune_intensity=40, prune_month=1, branch_angle=60, thin_ratio=50 |
| #16 | 0.5257 | prune_intensity=40, prune_month=3, branch_angle=60, thin_ratio=0 |
Model Quality
| Response | R² | Type |
yield_kg | 0.1312 | linear |
Full Multi-Objective Output
============================================================
MULTI-OBJECTIVE OPTIMIZATION
Method: Derringer-Suich Desirability Function
============================================================
Overall desirability: D = 0.6285
Response Weight Desirability Predicted Direction
---------------------------------------------------------------------
fruit_size_g 1.5 0.6304 193.00 g ↑
yield_kg 1.5 0.6266 49.60 kg/tree ↑
Recommended settings:
prune_intensity = 10 %
prune_month = 1 month
branch_angle = 30 deg
thin_ratio = 50 %
(from observed run #1)
Trade-off summary:
fruit_size_g: 193.00 (best observed: 234.00, sacrifice: +41.00)
yield_kg: 49.60 (best observed: 68.90, sacrifice: +19.30)
Model quality:
fruit_size_g: R² = 0.0997 (linear)
yield_kg: R² = 0.1312 (linear)
Top 3 observed runs by overall desirability:
1. Run #1 (D=0.6285): prune_intensity=10, prune_month=1, branch_angle=30, thin_ratio=50
2. Run #5 (D=0.5543): prune_intensity=40, prune_month=1, branch_angle=60, thin_ratio=50
3. Run #16 (D=0.5257): prune_intensity=40, prune_month=3, branch_angle=60, thin_ratio=0
Full Analysis Output
=== Main Effects: fruit_size_g ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
thin_ratio -20.5000 7.9461 42.3%
prune_intensity -17.2500 7.9461 35.6%
branch_angle -5.7500 7.9461 11.9%
prune_month -5.0000 7.9461 10.3%
=== ANOVA Table: fruit_size_g ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
prune_intensity 1 1190.2500 1190.2500 0.622 0.4662
prune_month 1 100.0000 100.0000 0.052 0.8283
branch_angle 1 132.2500 132.2500 0.069 0.8032
thin_ratio 1 1681.0000 1681.0000 0.878 0.3918
prune_intensity*prune_month 1 256.0000 256.0000 0.134 0.7296
prune_intensity*branch_angle 1 812.2500 812.2500 0.424 0.5436
prune_intensity*thin_ratio 1 1024.0000 1024.0000 0.535 0.4974
prune_month*branch_angle 1 49.0000 49.0000 0.026 0.8792
prune_month*thin_ratio 1 110.2500 110.2500 0.058 0.8199
branch_angle*thin_ratio 1 225.0000 225.0000 0.118 0.7457
Error 5 9573.7500 1914.7500
Total 15 15153.7500 1010.2500
=== Interaction Effects: fruit_size_g ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
prune_intensity thin_ratio -16.0000 29.4%
prune_intensity branch_angle 14.2500 26.1%
prune_intensity prune_month 8.0000 14.7%
branch_angle thin_ratio -7.5000 13.8%
prune_month thin_ratio 5.2500 9.6%
prune_month branch_angle 3.5000 6.4%
=== Summary Statistics: fruit_size_g ===
prune_intensity:
Level N Mean Std Min Max
------------------------------------------------------------
10 8 178.2500 26.1684 145.0000 217.0000
40 8 161.0000 36.1939 119.0000 234.0000
prune_month:
Level N Mean Std Min Max
------------------------------------------------------------
1 8 172.1250 41.8038 119.0000 234.0000
3 8 167.1250 20.0744 145.0000 193.0000
branch_angle:
Level N Mean Std Min Max
------------------------------------------------------------
30 8 172.5000 31.2639 133.0000 217.0000
60 8 166.7500 34.1833 119.0000 234.0000
thin_ratio:
Level N Mean Std Min Max
------------------------------------------------------------
0 8 179.8750 31.2750 133.0000 234.0000
50 8 159.3750 30.7661 119.0000 217.0000
=== Main Effects: yield_kg ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
branch_angle 9.6250 4.1029 32.9%
thin_ratio 9.1750 4.1029 31.4%
prune_intensity 6.1000 4.1029 20.9%
prune_month 4.3500 4.1029 14.9%
=== ANOVA Table: yield_kg ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
prune_intensity 1 148.8400 148.8400 0.389 0.5599
prune_month 1 75.6900 75.6900 0.198 0.6749
branch_angle 1 370.5625 370.5625 0.970 0.3700
thin_ratio 1 336.7225 336.7225 0.881 0.3910
prune_intensity*prune_month 1 282.2400 282.2400 0.739 0.4294
prune_intensity*branch_angle 1 386.1225 386.1225 1.010 0.3609
prune_intensity*thin_ratio 1 308.0025 308.0025 0.806 0.4105
prune_month*branch_angle 1 12.6025 12.6025 0.033 0.8630
prune_month*thin_ratio 1 122.1025 122.1025 0.320 0.5963
branch_angle*thin_ratio 1 86.4900 86.4900 0.226 0.6543
Error 5 1910.7350 382.1470
Total 15 4040.1100 269.3407
=== Interaction Effects: yield_kg ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
prune_intensity branch_angle -9.8250 25.2%
prune_intensity thin_ratio 8.7750 22.5%
prune_intensity prune_month -8.4000 21.6%
prune_month thin_ratio 5.5250 14.2%
branch_angle thin_ratio 4.6500 11.9%
prune_month branch_angle -1.7750 4.6%
=== Summary Statistics: yield_kg ===
prune_intensity:
Level N Mean Std Min Max
------------------------------------------------------------
10 8 44.5250 15.5284 15.4000 59.6000
40 8 50.6250 17.7416 23.6000 68.9000
prune_month:
Level N Mean Std Min Max
------------------------------------------------------------
1 8 45.4000 19.8910 15.4000 68.9000
3 8 49.7500 13.0650 23.6000 64.4000
branch_angle:
Level N Mean Std Min Max
------------------------------------------------------------
30 8 42.7625 19.3368 15.4000 68.9000
60 8 52.3875 12.2601 27.8000 67.9000
thin_ratio:
Level N Mean Std Min Max
------------------------------------------------------------
0 8 42.9875 15.9779 23.6000 68.9000
50 8 52.1625 16.5458 15.4000 67.9000
Optimization Recommendations
=== Optimization: fruit_size_g ===
Direction: maximize
Best observed run: #12
prune_intensity = 10
prune_month = 1
branch_angle = 60
thin_ratio = 0
Value: 234.0
RSM Model (linear, R² = 0.2888, Adj R² = 0.0301):
Coefficients:
intercept +169.6250
prune_intensity +0.6250
prune_month -13.2500
branch_angle -9.8750
thin_ratio -0.1250
RSM Model (quadratic, R² = 0.4453, Adj R² = -7.3200):
Coefficients:
intercept +33.9250
prune_intensity +0.6250
prune_month -13.2500
branch_angle -9.8750
thin_ratio -0.1250
prune_intensity*prune_month -4.7500
prune_intensity*branch_angle -2.8750
prune_intensity*thin_ratio -1.1250
prune_month*branch_angle -5.7500
prune_month*thin_ratio +5.0000
branch_angle*thin_ratio -7.6250
prune_intensity^2 +33.9250
prune_month^2 +33.9250
branch_angle^2 +33.9250
thin_ratio^2 +33.9250
Curvature analysis:
prune_month coef=+33.9250 convex (has a minimum)
thin_ratio coef=+33.9250 convex (has a minimum)
prune_intensity coef=+33.9250 convex (has a minimum)
branch_angle coef=+33.9250 convex (has a minimum)
Notable interactions:
branch_angle*thin_ratio coef=-7.6250 (antagonistic)
prune_month*branch_angle coef=-5.7500 (antagonistic)
prune_month*thin_ratio coef=+5.0000 (synergistic)
prune_intensity*prune_month coef=-4.7500 (antagonistic)
prune_intensity*branch_angle coef=-2.8750 (antagonistic)
prune_intensity*thin_ratio coef=-1.1250 (antagonistic)
Predicted optimum (from linear model, at observed points):
prune_intensity = 40
prune_month = 1
branch_angle = 30
thin_ratio = 0
Predicted value: 193.5000
Surface optimum (via L-BFGS-B, linear model):
prune_intensity = 40
prune_month = 1
branch_angle = 30
thin_ratio = 3.55271e-15
Predicted value: 193.5000
Model quality: Weak fit — consider adding center points or using a different design.
Factor importance:
1. prune_month (effect: -26.5, contribution: 55.5%)
2. branch_angle (effect: -19.8, contribution: 41.4%)
3. prune_intensity (effect: 1.2, contribution: 2.6%)
4. thin_ratio (effect: -0.2, contribution: 0.5%)
=== Optimization: yield_kg ===
Direction: maximize
Best observed run: #13
prune_intensity = 10
prune_month = 1
branch_angle = 30
thin_ratio = 0
Value: 68.9
RSM Model (linear, R² = 0.2722, Adj R² = 0.0075):
Coefficients:
intercept +47.5750
prune_intensity -2.1125
prune_month +2.2750
branch_angle +7.6625
thin_ratio +0.6125
RSM Model (quadratic, R² = 0.6192, Adj R² = -4.7126):
Coefficients:
intercept +9.5150
prune_intensity -2.1125
prune_month +2.2750
branch_angle +7.6625
thin_ratio +0.6125
prune_intensity*prune_month +5.2625
prune_intensity*branch_angle +3.7500
prune_intensity*thin_ratio +2.3250
prune_month*branch_angle +2.9625
prune_month*thin_ratio -4.3875
branch_angle*thin_ratio +3.5250
prune_intensity^2 +9.5150
prune_month^2 +9.5150
branch_angle^2 +9.5150
thin_ratio^2 +9.5150
Curvature analysis:
prune_intensity coef=+9.5150 convex (has a minimum)
prune_month coef=+9.5150 convex (has a minimum)
branch_angle coef=+9.5150 convex (has a minimum)
thin_ratio coef=+9.5150 convex (has a minimum)
Notable interactions:
prune_intensity*prune_month coef=+5.2625 (synergistic)
prune_month*thin_ratio coef=-4.3875 (antagonistic)
prune_intensity*branch_angle coef=+3.7500 (synergistic)
branch_angle*thin_ratio coef=+3.5250 (synergistic)
prune_month*branch_angle coef=+2.9625 (synergistic)
prune_intensity*thin_ratio coef=+2.3250 (synergistic)
Predicted optimum (from linear model, at observed points):
prune_intensity = 10
prune_month = 3
branch_angle = 60
thin_ratio = 50
Predicted value: 60.2375
Surface optimum (via L-BFGS-B, linear model):
prune_intensity = 10
prune_month = 3
branch_angle = 60
thin_ratio = 50
Predicted value: 60.2375
Model quality: Weak fit — consider adding center points or using a different design.
Factor importance:
1. branch_angle (effect: 15.3, contribution: 60.5%)
2. prune_month (effect: 4.5, contribution: 18.0%)
3. prune_intensity (effect: -4.2, contribution: 16.7%)
4. thin_ratio (effect: 1.2, contribution: 4.8%)