← All Use Cases
🪨
Full Factorial Design

Seismograph Network Placement

Full factorial of station spacing, depth of burial, sampling rate, and filter bandwidth to maximize event detection and minimize false triggers

Summary

This experiment investigates seismograph network placement. Full factorial of station spacing, depth of burial, sampling rate, and filter bandwidth to maximize event detection and minimize false triggers.

The design varies 4 factors: spacing km (km), ranging from 5 to 25, burial m (m), ranging from 0 to 3, sample hz (Hz), ranging from 40 to 200, and filter hz (Hz), ranging from 0.5 to 10. The goal is to optimize 2 responses: detection pct (%) (maximize) and false trigger day (per_day) (minimize). Fixed conditions held constant across all runs include sensor = broadband, network size = 8_stations.

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 detection pct, the most influential factors were sample hz (55.4%), filter hz (33.7%), burial m (8.4%). The best observed value was 100.0 (at spacing km = 5, burial m = 3, sample hz = 200).

For false trigger day, the most influential factors were filter hz (34.1%), spacing km (29.4%), burial m (22.7%). The best observed value was -0.0 (at spacing km = 25, burial m = 3, sample hz = 200).

Recommended Next Steps

Experimental Setup

Factors

FactorLowHighUnit
spacing_km525km
burial_m03m
sample_hz40200Hz
filter_hz0.510Hz

Fixed: sensor = broadband, network_size = 8_stations

Responses

ResponseDirectionUnit
detection_pct↑ maximize%
false_trigger_day↓ minimizeper_day

Configuration

use_cases/232_seismograph_placement/config.json
{ "metadata": { "name": "Seismograph Network Placement", "description": "Full factorial of station spacing, depth of burial, sampling rate, and filter bandwidth to maximize event detection and minimize false triggers" }, "factors": [ { "name": "spacing_km", "levels": [ "5", "25" ], "type": "continuous", "unit": "km" }, { "name": "burial_m", "levels": [ "0", "3" ], "type": "continuous", "unit": "m" }, { "name": "sample_hz", "levels": [ "40", "200" ], "type": "continuous", "unit": "Hz" }, { "name": "filter_hz", "levels": [ "0.5", "10" ], "type": "continuous", "unit": "Hz" } ], "fixed_factors": { "sensor": "broadband", "network_size": "8_stations" }, "responses": [ { "name": "detection_pct", "optimize": "maximize", "unit": "%" }, { "name": "false_trigger_day", "optimize": "minimize", "unit": "per_day" } ], "settings": { "operation": "full_factorial", "test_script": "use_cases/232_seismograph_placement/sim.sh" } }

Experimental Matrix

The Full Factorial Design produces 16 runs. Each row is one experiment with specific factor settings.

Runspacing_kmburial_msample_hzfilter_hz
15320010
22504010
3534010
4532000.5
52532000.5
62502000.5
7253400.5
8250400.5
9504010
10502000.5
112534010
1225320010
1353400.5
1425020010
1550400.5
165020010

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/232_seismograph_placement/config.json
2

Generate the runner script

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

Execute the experiments

Terminal
$ bash use_cases/232_seismograph_placement/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/232_seismograph_placement/config.json
5

Get optimization recommendations

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

Generate the HTML report

Terminal
$ doe report --config use_cases/232_seismograph_placement/config.json \ --output use_cases/232_seismograph_placement/results/report.html

Features Exercised

FeatureValue
Design typefull_factorial
Factor typescontinuous (all 4)
Arg styledouble-dash
Responses2 (detection_pct ↑, false_trigger_day ↓)
Total runs16

Analysis Results

Generated from actual experiment runs using the DOE Helper Tool.

Response: detection_pct

Top factors: sample_hz (55.4%), filter_hz (33.7%), burial_m (8.4%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
spacing_km11.00001.00000.0140.9117
burial_m112.250012.25000.1660.7002
sample_hz1529.0000529.00007.1880.0438
filter_hz1196.0000196.00002.6630.1636
spacing_km*burial_m112.250012.25000.1660.7002
spacing_km*sample_hz1196.0000196.00002.6630.1636
spacing_km*filter_hz1324.0000324.00004.4020.0900
burial_m*sample_hz142.250042.25000.5740.4828
burial_m*filter_hz156.250056.25000.7640.4220
sample_hz*filter_hz136.000036.00000.4890.5155
Error5368.000073.6000
Total151773.0000118.2000

Pareto Chart

Pareto chart for detection_pct

Main Effects Plot

Main effects plot for detection_pct

Normal Probability Plot of Effects

Normal probability plot for detection_pct

Half-Normal Plot of Effects

Half-normal plot for detection_pct

Model Diagnostics

Model diagnostics for detection_pct

Response: false_trigger_day

Top factors: filter_hz (34.1%), spacing_km (29.4%), burial_m (22.7%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
spacing_km17.98067.98060.5550.4897
burial_m14.73064.73060.3290.5910
sample_hz11.75561.75560.1220.7409
filter_hz110.725610.72560.7460.4271
spacing_km*burial_m11.62561.62560.1130.7503
spacing_km*sample_hz15.40565.40560.3760.5665
spacing_km*filter_hz10.07560.07560.0050.9450
burial_m*sample_hz111.390611.39060.7930.4141
burial_m*filter_hz172.675672.67565.0580.0744
sample_hz*filter_hz136.300636.30062.5260.1728
Error571.848114.3696
Total15224.514414.9676

Pareto Chart

Pareto chart for false_trigger_day

Main Effects Plot

Main effects plot for false_trigger_day

Normal Probability Plot of Effects

Normal probability plot for false_trigger_day

Half-Normal Plot of Effects

Half-normal plot for false_trigger_day

Model Diagnostics

Model diagnostics for false_trigger_day

Response Surface Plots

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

detection pct burial m vs filter hz

RSM surface: detection pct burial m vs filter hz

detection pct burial m vs sample hz

RSM surface: detection pct burial m vs sample hz

detection pct sample hz vs filter hz

RSM surface: detection pct sample hz vs filter hz

detection pct spacing km vs burial m

RSM surface: detection pct spacing km vs burial m

detection pct spacing km vs filter hz

RSM surface: detection pct spacing km vs filter hz

detection pct spacing km vs sample hz

RSM surface: detection pct spacing km vs sample hz

false trigger day burial m vs filter hz

RSM surface: false trigger day burial m vs filter hz

false trigger day burial m vs sample hz

RSM surface: false trigger day burial m vs sample hz

false trigger day sample hz vs filter hz

RSM surface: false trigger day sample hz vs filter hz

false trigger day spacing km vs burial m

RSM surface: false trigger day spacing km vs burial m

false trigger day spacing km vs filter hz

RSM surface: false trigger day spacing km vs filter hz

false trigger day spacing km vs sample hz

RSM surface: false trigger day spacing km vs sample hz

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

Per-Response Desirability

ResponseWeightDesirabilityPredictedDir
detection_pct 1.5
0.8808
97.00 0.8808 97.00 %
false_trigger_day 1.0
0.6539
4.20 0.6539 4.20 per_day

Recommended Settings

FactorValue
spacing_km25 km
burial_m0 m
sample_hz40 Hz
filter_hz10 Hz

Source: from observed run #1

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
false_trigger_day4.20-0.00+4.20

Top 3 Runs by Desirability

RunDFactor Settings
#30.7413spacing_km=25, burial_m=0, sample_hz=40, filter_hz=0.5
#40.6201spacing_km=5, burial_m=3, sample_hz=40, filter_hz=10

Model Quality

ResponseType
false_trigger_day0.3639linear

Full Multi-Objective Output

doe optimize --multi
============================================================ MULTI-OBJECTIVE OPTIMIZATION Method: Derringer-Suich Desirability Function ============================================================ Overall desirability: D = 0.7819 Response Weight Desirability Predicted Direction --------------------------------------------------------------------- detection_pct 1.5 0.8808 97.00 % ↑ false_trigger_day 1.0 0.6539 4.20 per_day ↓ Recommended settings: spacing_km = 25 km burial_m = 0 m sample_hz = 40 Hz filter_hz = 10 Hz (from observed run #1) Trade-off summary: detection_pct: 97.00 (best observed: 100.00, sacrifice: +3.00) false_trigger_day: 4.20 (best observed: -0.00, sacrifice: +4.20) Model quality: detection_pct: R² = 0.3357 (linear) false_trigger_day: R² = 0.3639 (linear) Top 3 observed runs by overall desirability: 1. Run #1 (D=0.7819): spacing_km=25, burial_m=0, sample_hz=40, filter_hz=10 2. Run #3 (D=0.7413): spacing_km=25, burial_m=0, sample_hz=40, filter_hz=0.5 3. Run #4 (D=0.6201): spacing_km=5, burial_m=3, sample_hz=40, filter_hz=10

Full Analysis Output

doe analyze
=== Main Effects: detection_pct === Factor Effect Std Error % Contribution -------------------------------------------------------------- sample_hz -11.5000 2.7180 55.4% filter_hz 7.0000 2.7180 33.7% burial_m 1.7500 2.7180 8.4% spacing_km 0.5000 2.7180 2.4% === ANOVA Table: detection_pct === Source DF SS MS F p-value ----------------------------------------------------------------------------- spacing_km 1 1.0000 1.0000 0.014 0.9117 burial_m 1 12.2500 12.2500 0.166 0.7002 sample_hz 1 529.0000 529.0000 7.188 0.0438 filter_hz 1 196.0000 196.0000 2.663 0.1636 spacing_km*burial_m 1 12.2500 12.2500 0.166 0.7002 spacing_km*sample_hz 1 196.0000 196.0000 2.663 0.1636 spacing_km*filter_hz 1 324.0000 324.0000 4.402 0.0900 burial_m*sample_hz 1 42.2500 42.2500 0.574 0.4828 burial_m*filter_hz 1 56.2500 56.2500 0.764 0.4220 sample_hz*filter_hz 1 36.0000 36.0000 0.489 0.5155 Error 5 368.0000 73.6000 Total 15 1773.0000 118.2000 === Interaction Effects: detection_pct === Factor A Factor B Interaction % Contribution ------------------------------------------------------------------------ spacing_km filter_hz 9.0000 32.4% spacing_km sample_hz 7.0000 25.2% burial_m filter_hz 3.7500 13.5% burial_m sample_hz 3.2500 11.7% sample_hz filter_hz 3.0000 10.8% spacing_km burial_m 1.7500 6.3% === Summary Statistics: detection_pct === spacing_km: Level N Mean Std Min Max ------------------------------------------------------------ 25 8 81.0000 11.3263 68.0000 100.0000 5 8 81.5000 11.1739 63.0000 97.0000 burial_m: Level N Mean Std Min Max ------------------------------------------------------------ 0 8 80.3750 11.6243 63.0000 100.0000 3 8 82.1250 10.7894 68.0000 97.0000 sample_hz: Level N Mean Std Min Max ------------------------------------------------------------ 200 8 87.0000 10.0143 68.0000 100.0000 40 8 75.5000 8.7994 63.0000 89.0000 filter_hz: Level N Mean Std Min Max ------------------------------------------------------------ 0.5 8 77.7500 12.4298 63.0000 100.0000 10 8 84.7500 8.4134 72.0000 97.0000 === Main Effects: false_trigger_day === Factor Effect Std Error % Contribution -------------------------------------------------------------- filter_hz 1.6375 0.9672 34.1% spacing_km 1.4125 0.9672 29.4% burial_m -1.0875 0.9672 22.7% sample_hz 0.6625 0.9672 13.8% === ANOVA Table: false_trigger_day === Source DF SS MS F p-value ----------------------------------------------------------------------------- spacing_km 1 7.9806 7.9806 0.555 0.4897 burial_m 1 4.7306 4.7306 0.329 0.5910 sample_hz 1 1.7556 1.7556 0.122 0.7409 filter_hz 1 10.7256 10.7256 0.746 0.4271 spacing_km*burial_m 1 1.6256 1.6256 0.113 0.7503 spacing_km*sample_hz 1 5.4056 5.4056 0.376 0.5665 spacing_km*filter_hz 1 0.0756 0.0756 0.005 0.9450 burial_m*sample_hz 1 11.3906 11.3906 0.793 0.4141 burial_m*filter_hz 1 72.6756 72.6756 5.058 0.0744 sample_hz*filter_hz 1 36.3006 36.3006 2.526 0.1728 Error 5 71.8481 14.3696 Total 15 224.5144 14.9676 === Interaction Effects: false_trigger_day === Factor A Factor B Interaction % Contribution ------------------------------------------------------------------------ burial_m filter_hz 4.2625 39.1% sample_hz filter_hz 3.0125 27.6% burial_m sample_hz 1.6875 15.5% spacing_km sample_hz -1.1625 10.7% spacing_km burial_m 0.6375 5.8% spacing_km filter_hz -0.1375 1.3% === Summary Statistics: false_trigger_day === spacing_km: Level N Mean Std Min Max ------------------------------------------------------------ 25 8 5.8625 4.3270 -0.0000 10.8000 5 8 7.2750 3.4944 2.9000 12.7000 burial_m: Level N Mean Std Min Max ------------------------------------------------------------ 0 8 7.1125 3.4286 1.8000 11.9000 3 8 6.0250 4.4319 -0.0000 12.7000 sample_hz: Level N Mean Std Min Max ------------------------------------------------------------ 200 8 6.2375 3.7210 1.0000 11.9000 40 8 6.9000 4.2399 -0.0000 12.7000 filter_hz: Level N Mean Std Min Max ------------------------------------------------------------ 0.5 8 5.7500 4.3105 -0.0000 11.9000 10 8 7.3875 3.4585 1.8000 12.7000

Optimization Recommendations

doe optimize
=== Optimization: detection_pct === Direction: maximize Best observed run: #4 spacing_km = 5 burial_m = 3 sample_hz = 200 filter_hz = 0.5 Value: 100.0 RSM Model (linear, R² = 0.1514, Adj R² = -0.1571): Coefficients: intercept +81.2500 spacing_km -1.5000 burial_m -0.6250 sample_hz +3.6250 filter_hz -1.0000 RSM Model (quadratic, R² = 0.2941, Adj R² = -9.5880): Coefficients: intercept +16.2500 spacing_km -1.5000 burial_m -0.6250 sample_hz +3.6250 filter_hz -1.0000 spacing_km*burial_m -1.1250 spacing_km*sample_hz -1.3750 spacing_km*filter_hz -3.0000 burial_m*sample_hz +0.0000 burial_m*filter_hz -0.3750 sample_hz*filter_hz +1.8750 spacing_km^2 +16.2500 burial_m^2 +16.2500 sample_hz^2 +16.2500 filter_hz^2 +16.2500 Curvature analysis: spacing_km coef=+16.2500 convex (has a minimum) burial_m coef=+16.2500 convex (has a minimum) sample_hz coef=+16.2500 convex (has a minimum) filter_hz coef=+16.2500 convex (has a minimum) Notable interactions: spacing_km*filter_hz coef=-3.0000 (antagonistic) sample_hz*filter_hz coef=+1.8750 (synergistic) spacing_km*sample_hz coef=-1.3750 (antagonistic) spacing_km*burial_m coef=-1.1250 (antagonistic) burial_m*filter_hz coef=-0.3750 (antagonistic) Predicted optimum (from linear model, at observed points): spacing_km = 5 burial_m = 0 sample_hz = 200 filter_hz = 0.5 Predicted value: 88.0000 Surface optimum (via L-BFGS-B, linear model): spacing_km = 5 burial_m = 0 sample_hz = 200 filter_hz = 0.5 Predicted value: 88.0000 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. sample_hz (effect: -7.2, contribution: 53.7%) 2. spacing_km (effect: 3.0, contribution: 22.2%) 3. filter_hz (effect: -2.0, contribution: 14.8%) 4. burial_m (effect: -1.2, contribution: 9.3%) === Optimization: false_trigger_day === Direction: minimize Best observed run: #11 spacing_km = 25 burial_m = 3 sample_hz = 200 filter_hz = 10 Value: -0.0 RSM Model (linear, R² = 0.1293, Adj R² = -0.1873): Coefficients: intercept +6.5688 spacing_km -1.0313 burial_m -0.2813 sample_hz -0.8187 filter_hz -0.0437 RSM Model (quadratic, R² = 0.6693, Adj R² = -3.9602): Coefficients: intercept +1.3137 spacing_km -1.0312 burial_m -0.2813 sample_hz -0.8187 filter_hz -0.0438 spacing_km*burial_m -0.5813 spacing_km*sample_hz +0.0313 spacing_km*filter_hz -1.1688 burial_m*sample_hz +0.0563 burial_m*filter_hz +0.2813 sample_hz*filter_hz -2.4063 spacing_km^2 +1.3138 burial_m^2 +1.3138 sample_hz^2 +1.3137 filter_hz^2 +1.3138 Curvature analysis: spacing_km coef=+1.3138 convex (has a minimum) burial_m coef=+1.3138 convex (has a minimum) filter_hz coef=+1.3138 convex (has a minimum) sample_hz coef=+1.3137 convex (has a minimum) Notable interactions: sample_hz*filter_hz coef=-2.4063 (antagonistic) spacing_km*filter_hz coef=-1.1688 (antagonistic) spacing_km*burial_m coef=-0.5813 (antagonistic) Predicted optimum (from linear model, at observed points): spacing_km = 5 burial_m = 0 sample_hz = 40 filter_hz = 0.5 Predicted value: 8.7438 Surface optimum (via L-BFGS-B, linear model): spacing_km = 25 burial_m = 3 sample_hz = 200 filter_hz = 10 Predicted value: 4.3938 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. spacing_km (effect: 2.1, contribution: 47.4%) 2. sample_hz (effect: 1.6, contribution: 37.6%) 3. burial_m (effect: -0.6, contribution: 12.9%) 4. filter_hz (effect: -0.1, contribution: 2.0%)
← Previous: Rock Thin Section Preparation Next: Hillside Erosion Control →