Summary
This experiment investigates sandpaper grit progression. Fractional factorial screening of starting grit, grit steps, sanding pressure, passes per grit, and dust extraction for surface finish and time efficiency.
The design varies 5 factors: start grit (grit), ranging from 60 to 120, grit steps (steps), ranging from 2 to 5, pressure kg (kg), ranging from 0.5 to 3.0, passes (passes), ranging from 3 to 10, and dust extract (bool), ranging from 0 to 1. The goal is to optimize 2 responses: finish score (pts) (maximize) and time min (min) (minimize). Fixed conditions held constant across all runs include wood = walnut, final grit = 220.
A fractional factorial design reduces the number of runs from 32 to 8 by deliberately confounding higher-order interactions. This is ideal for screening — identifying which of the 5 factors matter most before investing in a full study.
Key Findings
For finish score, the most influential factors were dust extract (43.5%), passes (22.4%), pressure kg (15.3%). The best observed value was 7.6 (at start grit = 60, grit steps = 2, pressure kg = 3.0).
For time min, the most influential factors were grit steps (38.8%), dust extract (36.7%), pressure kg (16.3%). The best observed value was 2.0 (at start grit = 60, grit steps = 5, pressure kg = 0.5).
Recommended Next Steps
- Follow up with a response surface design (CCD or Box-Behnken) on the top 3–4 factors to model curvature and find the true optimum.
- Consider whether any fixed factors should be varied in a future study.
- The screening results can guide factor reduction — drop factors contributing less than 5% and re-run with a smaller, more focused design.
Experimental Setup
Factors
| Factor | Low | High | Unit |
start_grit | 60 | 120 | grit |
grit_steps | 2 | 5 | steps |
pressure_kg | 0.5 | 3.0 | kg |
passes | 3 | 10 | passes |
dust_extract | 0 | 1 | bool |
Fixed: wood = walnut, final_grit = 220
Responses
| Response | Direction | Unit |
finish_score | ↑ maximize | pts |
time_min | ↓ minimize | min |
Configuration
{
"metadata": {
"name": "Sandpaper Grit Progression",
"description": "Fractional factorial screening of starting grit, grit steps, sanding pressure, passes per grit, and dust extraction for surface finish and time efficiency"
},
"factors": [
{
"name": "start_grit",
"levels": [
"60",
"120"
],
"type": "continuous",
"unit": "grit"
},
{
"name": "grit_steps",
"levels": [
"2",
"5"
],
"type": "continuous",
"unit": "steps"
},
{
"name": "pressure_kg",
"levels": [
"0.5",
"3.0"
],
"type": "continuous",
"unit": "kg"
},
{
"name": "passes",
"levels": [
"3",
"10"
],
"type": "continuous",
"unit": "passes"
},
{
"name": "dust_extract",
"levels": [
"0",
"1"
],
"type": "continuous",
"unit": "bool"
}
],
"fixed_factors": {
"wood": "walnut",
"final_grit": "220"
},
"responses": [
{
"name": "finish_score",
"optimize": "maximize",
"unit": "pts"
},
{
"name": "time_min",
"optimize": "minimize",
"unit": "min"
}
],
"settings": {
"operation": "fractional_factorial",
"test_script": "use_cases/205_sandpaper_progression/sim.sh"
}
}
Experimental Matrix
The Fractional Factorial Design produces 8 runs. Each row is one experiment with specific factor settings.
| Run | start_grit | grit_steps | pressure_kg | passes | dust_extract |
| 1 | 60 | 5 | 3.0 | 3 | 0 |
| 2 | 120 | 2 | 0.5 | 3 | 0 |
| 3 | 120 | 5 | 0.5 | 10 | 0 |
| 4 | 120 | 5 | 3.0 | 10 | 1 |
| 5 | 60 | 5 | 0.5 | 3 | 1 |
| 6 | 120 | 2 | 3.0 | 3 | 1 |
| 7 | 60 | 2 | 0.5 | 10 | 1 |
| 8 | 60 | 2 | 3.0 | 10 | 0 |
Step-by-Step Workflow
1
Preview the design
$ doe info --config use_cases/205_sandpaper_progression/config.json
2
Generate the runner script
$ doe generate --config use_cases/205_sandpaper_progression/config.json \
--output use_cases/205_sandpaper_progression/results/run.sh --seed 42
3
Execute the experiments
$ bash use_cases/205_sandpaper_progression/results/run.sh
4
Analyze results
$ doe analyze --config use_cases/205_sandpaper_progression/config.json
5
Get optimization recommendations
$ doe optimize --config use_cases/205_sandpaper_progression/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/205_sandpaper_progression/config.json --multi
7
Generate the HTML report
$ doe report --config use_cases/205_sandpaper_progression/config.json \
--output use_cases/205_sandpaper_progression/results/report.html
Features Exercised
| Feature | Value |
| Design type | fractional_factorial |
| Factor types | continuous (all 5) |
| Arg style | double-dash |
| Responses | 2 (finish_score ↑, time_min ↓) |
| Total runs | 8 |
Analysis Results
Generated from actual experiment runs using the DOE Helper Tool.
Response: finish_score
Top factors: dust_extract (43.5%), passes (22.4%), pressure_kg (15.3%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| start_grit | 1 | 0.2450 | 0.2450 | 0.193 | 0.6785 |
| grit_steps | 1 | 0.4050 | 0.4050 | 0.320 | 0.5963 |
| pressure_kg | 1 | 0.8450 | 0.8450 | 0.667 | 0.4513 |
| passes | 1 | 1.8050 | 1.8050 | 1.424 | 0.2863 |
| dust_extract | 1 | 6.8450 | 6.8450 | 5.400 | 0.0677 |
| start_grit*grit_steps | 1 | 1.8050 | 1.8050 | 1.424 | 0.2863 |
| start_grit*pressure_kg | 1 | 6.8450 | 6.8450 | 5.400 | 0.0677 |
| start_grit*passes | 1 | 0.4050 | 0.4050 | 0.320 | 0.5963 |
| start_grit*dust_extract | 1 | 0.8450 | 0.8450 | 0.667 | 0.4513 |
| grit_steps*pressure_kg | 1 | 3.1250 | 3.1250 | 2.465 | 0.1772 |
| grit_steps*passes | 1 | 0.2450 | 0.2450 | 0.193 | 0.6785 |
| grit_steps*dust_extract | 1 | 1.4450 | 1.4450 | 1.140 | 0.3345 |
| pressure_kg*passes | 1 | 1.4450 | 1.4450 | 1.140 | 0.3345 |
| pressure_kg*dust_extract | 1 | 0.2450 | 0.2450 | 0.193 | 0.6785 |
| passes*dust_extract | 1 | 3.1250 | 3.1250 | 2.465 | 0.1772 |
| Error | (Lenth | PSE) | 5 | 6.3375 | 1.2675 |
| Total | 7 | 14.7150 | 2.1021 | | |
Pareto Chart
Main Effects Plot
Normal Probability Plot of Effects
Half-Normal Plot of Effects
Model Diagnostics
Response: time_min
Top factors: grit_steps (38.8%), dust_extract (36.7%), pressure_kg (16.3%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| start_grit | 1 | 0.5000 | 0.5000 | 0.167 | 0.7000 |
| grit_steps | 1 | 180.5000 | 180.5000 | 60.167 | 0.0006 |
| pressure_kg | 1 | 32.0000 | 32.0000 | 10.667 | 0.0223 |
| passes | 1 | 4.5000 | 4.5000 | 1.500 | 0.2752 |
| dust_extract | 1 | 162.0000 | 162.0000 | 54.000 | 0.0007 |
| start_grit*grit_steps | 1 | 4.5000 | 4.5000 | 1.500 | 0.2752 |
| start_grit*pressure_kg | 1 | 162.0000 | 162.0000 | 54.000 | 0.0007 |
| start_grit*passes | 1 | 180.5000 | 180.5000 | 60.167 | 0.0006 |
| start_grit*dust_extract | 1 | 32.0000 | 32.0000 | 10.667 | 0.0223 |
| grit_steps*pressure_kg | 1 | 2.0000 | 2.0000 | 0.667 | 0.4513 |
| grit_steps*passes | 1 | 0.5000 | 0.5000 | 0.167 | 0.7000 |
| grit_steps*dust_extract | 1 | 128.0000 | 128.0000 | 42.667 | 0.0013 |
| pressure_kg*passes | 1 | 128.0000 | 128.0000 | 42.667 | 0.0013 |
| pressure_kg*dust_extract | 1 | 0.5000 | 0.5000 | 0.167 | 0.7000 |
| passes*dust_extract | 1 | 2.0000 | 2.0000 | 0.667 | 0.4513 |
| Error | (Lenth | PSE) | 5 | 15.0000 | 3.0000 |
| Total | 7 | 509.5000 | 72.7857 | | |
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.
finish score grit steps vs dust extract
finish score grit steps vs passes
finish score grit steps vs pressure kg
finish score passes vs dust extract
finish score pressure kg vs dust extract
finish score pressure kg vs passes
finish score start grit vs dust extract
finish score start grit vs grit steps
finish score start grit vs passes
finish score start grit vs pressure kg
time min grit steps vs dust extract
time min grit steps vs passes
time min grit steps vs pressure kg
time min passes vs dust extract
time min pressure kg vs dust extract
time min pressure kg vs passes
time min start grit vs dust extract
time min start grit vs grit steps
time min start grit vs passes
time min start grit vs pressure kg
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.7200
Per-Response Desirability
| Response | Weight | Desirability | Predicted | Dir |
finish_score |
1.5 |
|
6.59 0.7545 6.59 pts |
↑ |
time_min |
1.0 |
|
8.86 0.6711 8.86 min |
↓ |
Recommended Settings
| Factor | Value |
start_grit | 75.62 grit |
grit_steps | 5 steps |
pressure_kg | 2.822 kg |
passes | 9.972 passes |
dust_extract | 0.9599 bool |
Source: from RSM model prediction
Trade-off Summary
Sacrifice = how much worse than single-objective best.
| Response | Predicted | Best Observed | Sacrifice |
time_min | 8.86 | 2.00 | +6.86 |
Top 3 Runs by Desirability
| Run | D | Factor Settings |
| #1 | 0.6490 | start_grit=120, grit_steps=5, pressure_kg=0.5, passes=10, dust_extract=0 |
| #7 | 0.6476 | start_grit=120, grit_steps=5, pressure_kg=3.0, passes=10, dust_extract=1 |
Model Quality
| Response | R² | Type |
time_min | 0.6104 | linear |
Full Multi-Objective Output
============================================================
MULTI-OBJECTIVE OPTIMIZATION
Method: Derringer-Suich Desirability Function
============================================================
Overall desirability: D = 0.7200
Response Weight Desirability Predicted Direction
---------------------------------------------------------------------
finish_score 1.5 0.7545 6.59 pts ↑
time_min 1.0 0.6711 8.86 min ↓
Recommended settings:
start_grit = 75.62 grit
grit_steps = 5 steps
pressure_kg = 2.822 kg
passes = 9.972 passes
dust_extract = 0.9599 bool
(from RSM model prediction)
Trade-off summary:
finish_score: 6.59 (best observed: 7.60, sacrifice: +1.01)
time_min: 8.86 (best observed: 2.00, sacrifice: +6.86)
Model quality:
finish_score: R² = 0.4563 (linear)
time_min: R² = 0.6104 (linear)
Top 3 observed runs by overall desirability:
1. Run #5 (D=0.6805): start_grit=60, grit_steps=5, pressure_kg=3.0, passes=3, dust_extract=0
2. Run #1 (D=0.6490): start_grit=120, grit_steps=5, pressure_kg=0.5, passes=10, dust_extract=0
3. Run #7 (D=0.6476): start_grit=120, grit_steps=5, pressure_kg=3.0, passes=10, dust_extract=1
Full Analysis Output
=== Main Effects: finish_score ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
dust_extract -1.8500 0.5126 43.5%
passes -0.9500 0.5126 22.4%
pressure_kg -0.6500 0.5126 15.3%
grit_steps -0.4500 0.5126 10.6%
start_grit -0.3500 0.5126 8.2%
=== ANOVA Table: finish_score ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
start_grit 1 0.2450 0.2450 0.193 0.6785
grit_steps 1 0.4050 0.4050 0.320 0.5963
pressure_kg 1 0.8450 0.8450 0.667 0.4513
passes 1 1.8050 1.8050 1.424 0.2863
dust_extract 1 6.8450 6.8450 5.400 0.0677
start_grit*grit_steps 1 1.8050 1.8050 1.424 0.2863
start_grit*pressure_kg 1 6.8450 6.8450 5.400 0.0677
start_grit*passes 1 0.4050 0.4050 0.320 0.5963
start_grit*dust_extract 1 0.8450 0.8450 0.667 0.4513
grit_steps*pressure_kg 1 3.1250 3.1250 2.465 0.1772
grit_steps*passes 1 0.2450 0.2450 0.193 0.6785
grit_steps*dust_extract 1 1.4450 1.4450 1.140 0.3345
pressure_kg*passes 1 1.4450 1.4450 1.140 0.3345
pressure_kg*dust_extract 1 0.2450 0.2450 0.193 0.6785
passes*dust_extract 1 3.1250 3.1250 2.465 0.1772
Error (Lenth PSE) 5 6.3375 1.2675
Total 7 14.7150 2.1021
Note: Error estimated using Lenth's pseudo-standard-error (unreplicated design)
=== Interaction Effects: finish_score ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
start_grit pressure_kg 1.8500 21.0%
grit_steps pressure_kg 1.2500 14.2%
passes dust_extract -1.2500 14.2%
start_grit grit_steps -0.9500 10.8%
grit_steps dust_extract 0.8500 9.7%
pressure_kg passes -0.8500 9.7%
start_grit dust_extract 0.6500 7.4%
start_grit passes -0.4500 5.1%
grit_steps passes -0.3500 4.0%
pressure_kg dust_extract 0.3500 4.0%
=== Summary Statistics: finish_score ===
start_grit:
Level N Mean Std Min Max
------------------------------------------------------------
120 4 5.5500 1.9070 3.0000 7.6000
60 4 5.2000 1.0893 3.7000 6.3000
grit_steps:
Level N Mean Std Min Max
------------------------------------------------------------
2 4 5.6000 1.9374 3.0000 7.6000
5 4 5.1500 1.0083 3.7000 6.0000
pressure_kg:
Level N Mean Std Min Max
------------------------------------------------------------
0.5 4 5.7000 1.6062 3.7000 7.6000
3.0 4 5.0500 1.4295 3.0000 6.3000
passes:
Level N Mean Std Min Max
------------------------------------------------------------
10 4 5.8500 0.3697 5.5000 6.3000
3 4 4.9000 2.0412 3.0000 7.6000
dust_extract:
Level N Mean Std Min Max
------------------------------------------------------------
0 4 6.3000 0.9626 5.3000 7.6000
1 4 4.4500 1.3026 3.0000 5.6000
=== Main Effects: time_min ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
grit_steps -9.5000 3.0163 38.8%
dust_extract -9.0000 3.0163 36.7%
pressure_kg -4.0000 3.0163 16.3%
passes -1.5000 3.0163 6.1%
start_grit -0.5000 3.0163 2.0%
=== ANOVA Table: time_min ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
start_grit 1 0.5000 0.5000 0.167 0.7000
grit_steps 1 180.5000 180.5000 60.167 0.0006
pressure_kg 1 32.0000 32.0000 10.667 0.0223
passes 1 4.5000 4.5000 1.500 0.2752
dust_extract 1 162.0000 162.0000 54.000 0.0007
start_grit*grit_steps 1 4.5000 4.5000 1.500 0.2752
start_grit*pressure_kg 1 162.0000 162.0000 54.000 0.0007
start_grit*passes 1 180.5000 180.5000 60.167 0.0006
start_grit*dust_extract 1 32.0000 32.0000 10.667 0.0223
grit_steps*pressure_kg 1 2.0000 2.0000 0.667 0.4513
grit_steps*passes 1 0.5000 0.5000 0.167 0.7000
grit_steps*dust_extract 1 128.0000 128.0000 42.667 0.0013
pressure_kg*passes 1 128.0000 128.0000 42.667 0.0013
pressure_kg*dust_extract 1 0.5000 0.5000 0.167 0.7000
passes*dust_extract 1 2.0000 2.0000 0.667 0.4513
Error (Lenth PSE) 5 15.0000 3.0000
Total 7 509.5000 72.7857
Note: Error estimated using Lenth's pseudo-standard-error (unreplicated design)
=== Interaction Effects: time_min ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
start_grit passes -9.5000 22.1%
start_grit pressure_kg 9.0000 20.9%
grit_steps dust_extract 8.0000 18.6%
pressure_kg passes -8.0000 18.6%
start_grit dust_extract 4.0000 9.3%
start_grit grit_steps -1.5000 3.5%
grit_steps pressure_kg -1.0000 2.3%
passes dust_extract 1.0000 2.3%
grit_steps passes -0.5000 1.2%
pressure_kg dust_extract 0.5000 1.2%
=== Summary Statistics: time_min ===
start_grit:
Level N Mean Std Min Max
------------------------------------------------------------
120 4 10.0000 9.6954 3.0000 24.0000
60 4 9.5000 8.6987 2.0000 22.0000
grit_steps:
Level N Mean Std Min Max
------------------------------------------------------------
2 4 14.5000 9.9833 4.0000 24.0000
5 4 5.0000 3.1623 2.0000 9.0000
pressure_kg:
Level N Mean Std Min Max
------------------------------------------------------------
0.5 4 11.7500 8.2614 6.0000 24.0000
3.0 4 7.7500 9.5350 2.0000 22.0000
passes:
Level N Mean Std Min Max
------------------------------------------------------------
10 4 10.5000 8.1035 3.0000 22.0000
3 4 9.0000 10.1325 2.0000 24.0000
dust_extract:
Level N Mean Std Min Max
------------------------------------------------------------
0 4 14.2500 10.5317 2.0000 24.0000
1 4 5.2500 2.2174 3.0000 8.0000
Optimization Recommendations
=== Optimization: finish_score ===
Direction: maximize
Best observed run: #4
start_grit = 60
grit_steps = 2
pressure_kg = 3.0
passes = 10
dust_extract = 0
Value: 7.6
RSM Model (linear, R² = 0.5345, Adj R² = -0.6293):
Coefficients:
intercept +5.3750
start_grit -0.1750
grit_steps -0.1750
pressure_kg -0.2250
passes +0.8750
dust_extract -0.3250
Predicted optimum (from linear model, at observed points):
start_grit = 60
grit_steps = 2
pressure_kg = 3.0
passes = 10
dust_extract = 0
Predicted value: 6.7000
Surface optimum (via L-BFGS-B, linear model):
start_grit = 60
grit_steps = 2
pressure_kg = 0.5
passes = 10
dust_extract = 0
Predicted value: 7.1500
Model quality: Moderate fit — use predictions directionally, not precisely.
Factor importance:
1. passes (effect: -1.8, contribution: 49.3%)
2. dust_extract (effect: -0.7, contribution: 18.3%)
3. pressure_kg (effect: -0.4, contribution: 12.7%)
4. start_grit (effect: 0.3, contribution: 9.9%)
5. grit_steps (effect: -0.3, contribution: 9.9%)
=== Optimization: time_min ===
Direction: minimize
Best observed run: #7
start_grit = 60
grit_steps = 5
pressure_kg = 0.5
passes = 3
dust_extract = 1
Value: 2.0
RSM Model (linear, R² = 0.6811, Adj R² = -0.1163):
Coefficients:
intercept +9.7500
start_grit +1.0000
grit_steps -0.2500
pressure_kg +4.2500
passes +4.5000
dust_extract -2.0000
Predicted optimum (from linear model, at observed points):
start_grit = 60
grit_steps = 2
pressure_kg = 3.0
passes = 10
dust_extract = 0
Predicted value: 19.7500
Surface optimum (via L-BFGS-B, linear model):
start_grit = 60
grit_steps = 5
pressure_kg = 0.5
passes = 3
dust_extract = 1
Predicted value: -2.2500
Model quality: Moderate fit — use predictions directionally, not precisely.
Factor importance:
1. passes (effect: -9.0, contribution: 37.5%)
2. pressure_kg (effect: 8.5, contribution: 35.4%)
3. dust_extract (effect: -4.0, contribution: 16.7%)
4. start_grit (effect: -2.0, contribution: 8.3%)
5. grit_steps (effect: -0.5, contribution: 2.1%)