Summary
This experiment investigates wood stain & finish. Full factorial of stain dilution, number of coats, drying time between coats, and topcoat type to maximize color depth and durability.
The design varies 4 factors: stain dilution (%), ranging from 0 to 50, num coats (coats), ranging from 1 to 3, dry hrs (hrs), ranging from 2 to 24, and topcoat coats (coats), ranging from 1 to 3. The goal is to optimize 2 responses: color depth (pts) (maximize) and durability (pts) (maximize). Fixed conditions held constant across all runs include wood type = oak, stain color = walnut.
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 color depth, the most influential factors were stain dilution (38.2%), topcoat coats (35.3%), num coats (14.7%). The best observed value was 9.7 (at stain dilution = 50, num coats = 1, dry hrs = 2).
For durability, the most influential factors were num coats (33.1%), stain dilution (32.3%), topcoat coats (25.8%). The best observed value was 7.9 (at stain dilution = 0, num coats = 3, dry hrs = 2).
Recommended Next Steps
- Consider whether any fixed factors should be varied in a future study.
Experimental Setup
Factors
| Factor | Low | High | Unit |
stain_dilution | 0 | 50 | % |
num_coats | 1 | 3 | coats |
dry_hrs | 2 | 24 | hrs |
topcoat_coats | 1 | 3 | coats |
Fixed: wood_type = oak, stain_color = walnut
Responses
| Response | Direction | Unit |
color_depth | ↑ maximize | pts |
durability | ↑ maximize | pts |
Configuration
{
"metadata": {
"name": "Wood Stain & Finish",
"description": "Full factorial of stain dilution, number of coats, drying time between coats, and topcoat type to maximize color depth and durability"
},
"factors": [
{
"name": "stain_dilution",
"levels": [
"0",
"50"
],
"type": "continuous",
"unit": "%"
},
{
"name": "num_coats",
"levels": [
"1",
"3"
],
"type": "continuous",
"unit": "coats"
},
{
"name": "dry_hrs",
"levels": [
"2",
"24"
],
"type": "continuous",
"unit": "hrs"
},
{
"name": "topcoat_coats",
"levels": [
"1",
"3"
],
"type": "continuous",
"unit": "coats"
}
],
"fixed_factors": {
"wood_type": "oak",
"stain_color": "walnut"
},
"responses": [
{
"name": "color_depth",
"optimize": "maximize",
"unit": "pts"
},
{
"name": "durability",
"optimize": "maximize",
"unit": "pts"
}
],
"settings": {
"operation": "full_factorial",
"test_script": "use_cases/141_wood_stain_finish/sim.sh"
}
}
Experimental Matrix
The Full Factorial Design produces 16 runs. Each row is one experiment with specific factor settings.
| Run | stain_dilution | num_coats | dry_hrs | topcoat_coats |
| 1 | 0 | 3 | 24 | 3 |
| 2 | 50 | 1 | 2 | 3 |
| 3 | 0 | 3 | 2 | 3 |
| 4 | 0 | 3 | 24 | 1 |
| 5 | 50 | 3 | 24 | 1 |
| 6 | 50 | 1 | 24 | 1 |
| 7 | 50 | 3 | 2 | 1 |
| 8 | 50 | 1 | 2 | 1 |
| 9 | 0 | 1 | 2 | 3 |
| 10 | 0 | 1 | 24 | 1 |
| 11 | 50 | 3 | 2 | 3 |
| 12 | 50 | 3 | 24 | 3 |
| 13 | 0 | 3 | 2 | 1 |
| 14 | 50 | 1 | 24 | 3 |
| 15 | 0 | 1 | 2 | 1 |
| 16 | 0 | 1 | 24 | 3 |
Step-by-Step Workflow
1
Preview the design
$ doe info --config use_cases/141_wood_stain_finish/config.json
2
Generate the runner script
$ doe generate --config use_cases/141_wood_stain_finish/config.json \
--output use_cases/141_wood_stain_finish/results/run.sh --seed 42
3
Execute the experiments
$ bash use_cases/141_wood_stain_finish/results/run.sh
4
Analyze results
$ doe analyze --config use_cases/141_wood_stain_finish/config.json
5
Get optimization recommendations
$ doe optimize --config use_cases/141_wood_stain_finish/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/141_wood_stain_finish/config.json --multi
7
Generate the HTML report
$ doe report --config use_cases/141_wood_stain_finish/config.json \
--output use_cases/141_wood_stain_finish/results/report.html
Features Exercised
| Feature | Value |
| Design type | full_factorial |
| Factor types | continuous (all 4) |
| Arg style | double-dash |
| Responses | 2 (color_depth ↑, durability ↑) |
| Total runs | 16 |
Analysis Results
Generated from actual experiment runs using the DOE Helper Tool.
Response: color_depth
Top factors: stain_dilution (38.2%), topcoat_coats (35.3%), num_coats (14.7%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| stain_dilution | 1 | 3.8025 | 3.8025 | 0.551 | 0.4914 |
| num_coats | 1 | 0.5625 | 0.5625 | 0.081 | 0.7868 |
| dry_hrs | 1 | 0.3600 | 0.3600 | 0.052 | 0.8284 |
| topcoat_coats | 1 | 3.2400 | 3.2400 | 0.469 | 0.5238 |
| stain_dilution*num_coats | 1 | 0.7225 | 0.7225 | 0.105 | 0.7594 |
| stain_dilution*dry_hrs | 1 | 9.0000 | 9.0000 | 1.303 | 0.3053 |
| stain_dilution*topcoat_coats | 1 | 0.3600 | 0.3600 | 0.052 | 0.8284 |
| num_coats*dry_hrs | 1 | 3.6100 | 3.6100 | 0.523 | 0.5021 |
| num_coats*topcoat_coats | 1 | 1.2100 | 1.2100 | 0.175 | 0.6929 |
| dry_hrs*topcoat_coats | 1 | 0.0625 | 0.0625 | 0.009 | 0.9279 |
| Error | 5 | 34.5275 | 6.9055 | | |
| Total | 15 | 57.4575 | 3.8305 | | |
Pareto Chart
Main Effects Plot
Normal Probability Plot of Effects
Half-Normal Plot of Effects
Model Diagnostics
Response: durability
Top factors: num_coats (33.1%), stain_dilution (32.3%), topcoat_coats (25.8%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| stain_dilution | 1 | 17.6400 | 17.6400 | 5.869 | 0.0599 |
| num_coats | 1 | 18.4900 | 18.4900 | 6.152 | 0.0558 |
| dry_hrs | 1 | 1.3225 | 1.3225 | 0.440 | 0.5365 |
| topcoat_coats | 1 | 11.2225 | 11.2225 | 3.734 | 0.1112 |
| stain_dilution*num_coats | 1 | 0.4225 | 0.4225 | 0.141 | 0.7231 |
| stain_dilution*dry_hrs | 1 | 1.2100 | 1.2100 | 0.403 | 0.5536 |
| stain_dilution*topcoat_coats | 1 | 2.5600 | 2.5600 | 0.852 | 0.3984 |
| num_coats*dry_hrs | 1 | 3.6100 | 3.6100 | 1.201 | 0.3231 |
| num_coats*topcoat_coats | 1 | 1.2100 | 1.2100 | 0.403 | 0.5536 |
| dry_hrs*topcoat_coats | 1 | 0.0025 | 0.0025 | 0.001 | 0.9781 |
| Error | 5 | 15.0275 | 3.0055 | | |
| Total | 15 | 72.7175 | 4.8478 | | |
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.
color depth dry hrs vs topcoat coats
color depth num coats vs dry hrs
color depth num coats vs topcoat coats
color depth stain dilution vs dry hrs
color depth stain dilution vs num coats
color depth stain dilution vs topcoat coats
durability dry hrs vs topcoat coats
durability num coats vs dry hrs
durability num coats vs topcoat coats
durability stain dilution vs dry hrs
durability stain dilution vs num coats
durability stain dilution vs topcoat coats
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.9421
Per-Response Desirability
| Response | Weight | Desirability | Predicted | Dir |
color_depth |
1.5 |
|
9.70 0.9545 9.70 pts |
↑ |
durability |
1.0 |
|
7.70 0.9237 7.70 pts |
↑ |
Recommended Settings
| Factor | Value |
stain_dilution | 50 % |
num_coats | 3 coats |
dry_hrs | 2 hrs |
topcoat_coats | 3 coats |
Source: from observed run #1
Trade-off Summary
Sacrifice = how much worse than single-objective best.
| Response | Predicted | Best Observed | Sacrifice |
durability | 7.70 | 7.90 | +0.20 |
Top 3 Runs by Desirability
| Run | D | Factor Settings |
| #3 | 0.7380 | stain_dilution=0, num_coats=1, dry_hrs=24, topcoat_coats=1 |
| #12 | 0.6259 | stain_dilution=50, num_coats=3, dry_hrs=24, topcoat_coats=1 |
Model Quality
| Response | R² | Type |
durability | 0.3904 | linear |
Full Multi-Objective Output
============================================================
MULTI-OBJECTIVE OPTIMIZATION
Method: Derringer-Suich Desirability Function
============================================================
Overall desirability: D = 0.9421
Response Weight Desirability Predicted Direction
---------------------------------------------------------------------
color_depth 1.5 0.9545 9.70 pts ↑
durability 1.0 0.9237 7.70 pts ↑
Recommended settings:
stain_dilution = 50 %
num_coats = 3 coats
dry_hrs = 2 hrs
topcoat_coats = 3 coats
(from observed run #1)
Trade-off summary:
color_depth: 9.70 (best observed: 9.70, sacrifice: +0.00)
durability: 7.70 (best observed: 7.90, sacrifice: +0.20)
Model quality:
color_depth: R² = 0.1116 (linear)
durability: R² = 0.3904 (linear)
Top 3 observed runs by overall desirability:
1. Run #1 (D=0.9421): stain_dilution=50, num_coats=3, dry_hrs=2, topcoat_coats=3
2. Run #3 (D=0.7380): stain_dilution=0, num_coats=1, dry_hrs=24, topcoat_coats=1
3. Run #12 (D=0.6259): stain_dilution=50, num_coats=3, dry_hrs=24, topcoat_coats=1
Full Analysis Output
=== Main Effects: color_depth ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
stain_dilution -0.9750 0.4893 38.2%
topcoat_coats -0.9000 0.4893 35.3%
num_coats -0.3750 0.4893 14.7%
dry_hrs -0.3000 0.4893 11.8%
=== ANOVA Table: color_depth ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
stain_dilution 1 3.8025 3.8025 0.551 0.4914
num_coats 1 0.5625 0.5625 0.081 0.7868
dry_hrs 1 0.3600 0.3600 0.052 0.8284
topcoat_coats 1 3.2400 3.2400 0.469 0.5238
stain_dilution*num_coats 1 0.7225 0.7225 0.105 0.7594
stain_dilution*dry_hrs 1 9.0000 9.0000 1.303 0.3053
stain_dilution*topcoat_coats 1 0.3600 0.3600 0.052 0.8284
num_coats*dry_hrs 1 3.6100 3.6100 0.523 0.5021
num_coats*topcoat_coats 1 1.2100 1.2100 0.175 0.6929
dry_hrs*topcoat_coats 1 0.0625 0.0625 0.009 0.9279
Error 5 34.5275 6.9055
Total 15 57.4575 3.8305
=== Interaction Effects: color_depth ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
stain_dilution dry_hrs 1.5000 39.0%
num_coats dry_hrs 0.9500 24.7%
num_coats topcoat_coats -0.5500 14.3%
stain_dilution num_coats -0.4250 11.0%
stain_dilution topcoat_coats 0.3000 7.8%
dry_hrs topcoat_coats -0.1250 3.2%
=== Summary Statistics: color_depth ===
stain_dilution:
Level N Mean Std Min Max
------------------------------------------------------------
0 8 6.5500 1.7452 3.9000 9.7000
50 8 5.5750 2.1493 3.1000 8.7000
num_coats:
Level N Mean Std Min Max
------------------------------------------------------------
1 8 6.2500 2.4605 3.4000 9.7000
3 8 5.8750 1.4400 3.1000 8.1000
dry_hrs:
Level N Mean Std Min Max
------------------------------------------------------------
2 8 6.2125 2.3443 3.1000 9.7000
24 8 5.9125 1.6313 3.6000 8.7000
topcoat_coats:
Level N Mean Std Min Max
------------------------------------------------------------
1 8 6.5125 2.2662 3.4000 9.7000
3 8 5.6125 1.6155 3.1000 8.2000
=== Main Effects: durability ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
num_coats -2.1500 0.5504 33.1%
stain_dilution -2.1000 0.5504 32.3%
topcoat_coats 1.6750 0.5504 25.8%
dry_hrs 0.5750 0.5504 8.8%
=== ANOVA Table: durability ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
stain_dilution 1 17.6400 17.6400 5.869 0.0599
num_coats 1 18.4900 18.4900 6.152 0.0558
dry_hrs 1 1.3225 1.3225 0.440 0.5365
topcoat_coats 1 11.2225 11.2225 3.734 0.1112
stain_dilution*num_coats 1 0.4225 0.4225 0.141 0.7231
stain_dilution*dry_hrs 1 1.2100 1.2100 0.403 0.5536
stain_dilution*topcoat_coats 1 2.5600 2.5600 0.852 0.3984
num_coats*dry_hrs 1 3.6100 3.6100 1.201 0.3231
num_coats*topcoat_coats 1 1.2100 1.2100 0.403 0.5536
dry_hrs*topcoat_coats 1 0.0025 0.0025 0.001 0.9781
Error 5 15.0275 3.0055
Total 15 72.7175 4.8478
=== Interaction Effects: durability ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
num_coats dry_hrs 0.9500 29.7%
stain_dilution topcoat_coats 0.8000 25.0%
stain_dilution dry_hrs -0.5500 17.2%
num_coats topcoat_coats -0.5500 17.2%
stain_dilution num_coats 0.3250 10.2%
dry_hrs topcoat_coats 0.0250 0.8%
=== Summary Statistics: durability ===
stain_dilution:
Level N Mean Std Min Max
------------------------------------------------------------
0 8 5.8625 2.0619 2.0000 7.9000
50 8 3.7625 1.9018 2.1000 7.1000
num_coats:
Level N Mean Std Min Max
------------------------------------------------------------
1 8 5.8875 2.1203 2.3000 7.9000
3 8 3.7375 1.8031 2.0000 7.1000
dry_hrs:
Level N Mean Std Min Max
------------------------------------------------------------
2 8 4.5250 2.4259 2.0000 7.9000
24 8 5.1000 2.0771 2.1000 7.1000
topcoat_coats:
Level N Mean Std Min Max
------------------------------------------------------------
1 8 3.9750 2.2334 2.0000 7.7000
3 8 5.6500 1.9486 3.0000 7.9000
Optimization Recommendations
=== Optimization: color_depth ===
Direction: maximize
Best observed run: #1
stain_dilution = 50
num_coats = 1
dry_hrs = 2
topcoat_coats = 1
Value: 9.7
RSM Model (linear, R² = 0.3856, Adj R² = 0.1622):
Coefficients:
intercept +6.0625
stain_dilution +0.3625
num_coats -0.3875
dry_hrs -0.0250
topcoat_coats -1.0500
RSM Model (quadratic, R² = 0.4671, Adj R² = -6.9931):
Coefficients:
intercept +1.2125
stain_dilution +0.3625
num_coats -0.3875
dry_hrs -0.0250
topcoat_coats -1.0500
stain_dilution*num_coats -0.0625
stain_dilution*dry_hrs +0.2250
stain_dilution*topcoat_coats -0.2500
num_coats*dry_hrs -0.1000
num_coats*topcoat_coats -0.1250
dry_hrs*topcoat_coats +0.3875
stain_dilution^2 +1.2125
num_coats^2 +1.2125
dry_hrs^2 +1.2125
topcoat_coats^2 +1.2125
Curvature analysis:
stain_dilution coef=+1.2125 convex (has a minimum)
dry_hrs coef=+1.2125 convex (has a minimum)
topcoat_coats coef=+1.2125 convex (has a minimum)
num_coats coef=+1.2125 convex (has a minimum)
Notable interactions:
dry_hrs*topcoat_coats coef=+0.3875 (synergistic)
Predicted optimum (from linear model, at observed points):
stain_dilution = 50
num_coats = 1
dry_hrs = 2
topcoat_coats = 1
Predicted value: 7.8875
Surface optimum (via L-BFGS-B, linear model):
stain_dilution = 50
num_coats = 1
dry_hrs = 2
topcoat_coats = 1
Predicted value: 7.8875
Model quality: Weak fit — consider adding center points or using a different design.
Factor importance:
1. topcoat_coats (effect: -2.1, contribution: 57.5%)
2. num_coats (effect: -0.8, contribution: 21.2%)
3. stain_dilution (effect: 0.7, contribution: 19.9%)
4. dry_hrs (effect: -0.1, contribution: 1.4%)
=== Optimization: durability ===
Direction: maximize
Best observed run: #12
stain_dilution = 0
num_coats = 3
dry_hrs = 2
topcoat_coats = 1
Value: 7.9
RSM Model (linear, R² = 0.0634, Adj R² = -0.2771):
Coefficients:
intercept +4.8125
stain_dilution -0.4250
num_coats -0.2500
dry_hrs -0.1875
topcoat_coats -0.1000
RSM Model (quadratic, R² = 0.6018, Adj R² = -4.9733):
Coefficients:
intercept +0.9625
stain_dilution -0.4250
num_coats -0.2500
dry_hrs -0.1875
topcoat_coats -0.1000
stain_dilution*num_coats +0.0125
stain_dilution*dry_hrs +0.4750
stain_dilution*topcoat_coats -0.3375
num_coats*dry_hrs +0.4750
num_coats*topcoat_coats -0.4375
dry_hrs*topcoat_coats +1.3000
stain_dilution^2 +0.9625
num_coats^2 +0.9625
dry_hrs^2 +0.9625
topcoat_coats^2 +0.9625
Curvature analysis:
stain_dilution coef=+0.9625 convex (has a minimum)
topcoat_coats coef=+0.9625 convex (has a minimum)
num_coats coef=+0.9625 convex (has a minimum)
dry_hrs coef=+0.9625 convex (has a minimum)
Notable interactions:
dry_hrs*topcoat_coats coef=+1.3000 (synergistic)
num_coats*dry_hrs coef=+0.4750 (synergistic)
stain_dilution*dry_hrs coef=+0.4750 (synergistic)
num_coats*topcoat_coats coef=-0.4375 (antagonistic)
stain_dilution*topcoat_coats coef=-0.3375 (antagonistic)
Predicted optimum (from linear model, at observed points):
stain_dilution = 0
num_coats = 1
dry_hrs = 2
topcoat_coats = 1
Predicted value: 5.7750
Surface optimum (via L-BFGS-B, linear model):
stain_dilution = 0
num_coats = 1
dry_hrs = 2
topcoat_coats = 1
Predicted value: 5.7750
Model quality: Weak fit — consider adding center points or using a different design.
Factor importance:
1. stain_dilution (effect: -0.8, contribution: 44.2%)
2. num_coats (effect: -0.5, contribution: 26.0%)
3. dry_hrs (effect: -0.4, contribution: 19.5%)
4. topcoat_coats (effect: -0.2, contribution: 10.4%)