← All Use Cases
🏠
Full Factorial Design

Wood Stain & Finish

Full factorial of stain dilution, number of coats, drying time between coats, and topcoat type to maximize color depth and durability

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

Experimental Setup

Factors

FactorLowHighUnit
stain_dilution050%
num_coats13coats
dry_hrs224hrs
topcoat_coats13coats

Fixed: wood_type = oak, stain_color = walnut

Responses

ResponseDirectionUnit
color_depth↑ maximizepts
durability↑ maximizepts

Configuration

use_cases/141_wood_stain_finish/config.json
{ "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.

Runstain_dilutionnum_coatsdry_hrstopcoat_coats
103243
250123
30323
403241
5503241
6501241
750321
850121
90123
1001241
1150323
12503243
130321
14501243
150121
1601243

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/141_wood_stain_finish/config.json
2

Generate the runner script

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

Terminal
$ bash use_cases/141_wood_stain_finish/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/141_wood_stain_finish/config.json
5

Get optimization recommendations

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

Terminal
$ doe optimize --config use_cases/141_wood_stain_finish/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/141_wood_stain_finish/config.json \ --output use_cases/141_wood_stain_finish/results/report.html

Features Exercised

FeatureValue
Design typefull_factorial
Factor typescontinuous (all 4)
Arg styledouble-dash
Responses2 (color_depth ↑, durability ↑)
Total runs16

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

SourceDFSSMSFp-value
SourceDFSSMSFp-value
stain_dilution13.80253.80250.5510.4914
num_coats10.56250.56250.0810.7868
dry_hrs10.36000.36000.0520.8284
topcoat_coats13.24003.24000.4690.5238
stain_dilution*num_coats10.72250.72250.1050.7594
stain_dilution*dry_hrs19.00009.00001.3030.3053
stain_dilution*topcoat_coats10.36000.36000.0520.8284
num_coats*dry_hrs13.61003.61000.5230.5021
num_coats*topcoat_coats11.21001.21000.1750.6929
dry_hrs*topcoat_coats10.06250.06250.0090.9279
Error534.52756.9055
Total1557.45753.8305

Pareto Chart

Pareto chart for color_depth

Main Effects Plot

Main effects plot for color_depth

Normal Probability Plot of Effects

Normal probability plot for color_depth

Half-Normal Plot of Effects

Half-normal plot for color_depth

Model Diagnostics

Model diagnostics for color_depth

Response: durability

Top factors: num_coats (33.1%), stain_dilution (32.3%), topcoat_coats (25.8%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
stain_dilution117.640017.64005.8690.0599
num_coats118.490018.49006.1520.0558
dry_hrs11.32251.32250.4400.5365
topcoat_coats111.222511.22253.7340.1112
stain_dilution*num_coats10.42250.42250.1410.7231
stain_dilution*dry_hrs11.21001.21000.4030.5536
stain_dilution*topcoat_coats12.56002.56000.8520.3984
num_coats*dry_hrs13.61003.61001.2010.3231
num_coats*topcoat_coats11.21001.21000.4030.5536
dry_hrs*topcoat_coats10.00250.00250.0010.9781
Error515.02753.0055
Total1572.71754.8478

Pareto Chart

Pareto chart for durability

Main Effects Plot

Main effects plot for durability

Normal Probability Plot of Effects

Normal probability plot for durability

Half-Normal Plot of Effects

Half-normal plot for durability

Model Diagnostics

Model diagnostics for durability

Response Surface Plots

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

color depth dry hrs vs topcoat coats

RSM surface: color depth dry hrs vs topcoat coats

color depth num coats vs dry hrs

RSM surface: color depth num coats vs dry hrs

color depth num coats vs topcoat coats

RSM surface: color depth num coats vs topcoat coats

color depth stain dilution vs dry hrs

RSM surface: color depth stain dilution vs dry hrs

color depth stain dilution vs num coats

RSM surface: color depth stain dilution vs num coats

color depth stain dilution vs topcoat coats

RSM surface: color depth stain dilution vs topcoat coats

durability dry hrs vs topcoat coats

RSM surface: durability dry hrs vs topcoat coats

durability num coats vs dry hrs

RSM surface: durability num coats vs dry hrs

durability num coats vs topcoat coats

RSM surface: durability num coats vs topcoat coats

durability stain dilution vs dry hrs

RSM surface: durability stain dilution vs dry hrs

durability stain dilution vs num coats

RSM surface: durability stain dilution vs num coats

durability stain dilution vs topcoat coats

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

ResponseWeightDesirabilityPredictedDir
color_depth 1.5
0.9545
9.70 0.9545 9.70 pts
durability 1.0
0.9237
7.70 0.9237 7.70 pts

Recommended Settings

FactorValue
stain_dilution50 %
num_coats3 coats
dry_hrs2 hrs
topcoat_coats3 coats

Source: from observed run #1

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
durability7.707.90+0.20

Top 3 Runs by Desirability

RunDFactor Settings
#30.7380stain_dilution=0, num_coats=1, dry_hrs=24, topcoat_coats=1
#120.6259stain_dilution=50, num_coats=3, dry_hrs=24, topcoat_coats=1

Model Quality

ResponseType
durability0.3904linear

Full Multi-Objective Output

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

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

doe optimize
=== 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%)
← Previous: Candle Making Optimization All Use Cases →