Data Lab / WSPR tornado V3: calm-season + density-matched controls (12 outbreaks, 24 controls)
Fig. 1: v3 density comparison
Fig. 2: v3 dose response scatter
Fig. 3: v3 per event matrix
Fig. 4: v3 per event precursor curves
Fig. 5: v3 replication verdict table
Fig. 6: v3 three pool lag curves
WSPR tornado V3: outbreak-vs-control with fixed controls (12 outbreaks, 24 SPC-screened controls)
Author: TerraPulse Lab (M. Isenbek, E. Isenbek, B. Isenbek)
Status: Complete, paper #31
Created: 2026-04-20
GitHub Issue: #155
Predecessors: paper #29 (workspacewspr-tornado-season-conus-2026, V1), paper #30 (workspacewspr-tornado-v2-historical, V2)
Hypothesis
V3 tests whether the WSPR 40 m pre-tornado anomaly reported in V1/V2 is specific to outbreak severity or general to any tornado-producing convection. The test is an outbreak pool (12 density-adequate events, 2021-2024) versus two control pools drawn with SPC pre-screening to eliminate V2's 71% contamination rate.
Design fix vs V2
V2's ±14-day DOY controls landed in tornado season and 15/21 (71%) had contaminating severe weather. V3 fixes this by:
- Drawing candidates from Nov-Feb calm season, or same-month-different-year dates that empirically had no severe weather.
- Querying the NOAA SPC archive for each candidate before pulling WSPR data.
- Classifying each control as CLEAN (0 tornadoes) or DOSE (2–8 tornadoes) to enable a graded comparison.
Result: 24/24 selected controls had zero V2-style contamination. Clean-control tornado contamination rate: 0/15 (0.0%). Dose-control pool: 9 events with 2–8 SPC tornadoes each.
Data
- 36 events (12 outbreak + 15 clean control + 9 dose control).
- 298 M WSPR spots, 3.46 GB staged from
/mnt/ursa. - SPC reports: 72 h window per event, classified by band-storm stratum.
data/events.parquet,data/per_event_v3_table.csv,data/cross_event_summary.json.- 36 ×
storm_test_{slug}.json(per-event amplitude tests). - 36 ×
mechanism_lag_spc_{slug}.json(per-event precursor curves).
Methodology
Per-event pipeline is identical to V2 (wspr-tornado-v2-historical):
- Clean WSPR spots, gate cell-bins (N ≥ 20, MAD ≥ 0.1 dB, base count ≥ 5).
- Assign each 30-min cell-bin as "storm" if any SPC report falls in it, else "quiet".
- Per band × storm-type stratum (12 strata): Welch t-test, Mann-Whitney U, Cohen's d, median-difference 95% CI, Bonferroni over 12 strata.
- Lag sweep: for each band × storm-type, compute mean residual dB at lags −360…+360 min with a 500-shuffle circular null (95% envelope).
Cross-event aggregation (new in V3):
- Pool storm/quiet arrays per stratum across the three pools (outbreak / clean / dose).
- Direct outbreak-vs-control Welch on storm-bin means + 500-bootstrap delta_d on Cohen's d.
- Event-level dose-response: regress per-event d against log(1 + n_SPC_tornado); 2000-permutation p-value.
Findings
Pooled outbreak 40m_tornado: d = −0.525 (n_storm = 286, n_quiet = 273,755), Welch p = 2.40 × 10⁻¹⁹, p_Bonferroni = 2.88 × 10⁻¹⁸. The precursor is robustly detected in the pooled outbreak data.
Pooled outbreak lag: k_min = −270 min, min = −1.68 dB, null p95 = 1.31 dB, earliest lag exceeding null envelope = −285 min. The precursor starts roughly 4.75 h before the first SPC tornado report and is deepest at −4.5 h.
Per-event replications: 2 of 12 outbreaks meet the V3 REPLICATES gate (Bonferroni-significant, same sign, k_min < 0):
| Outbreak | d | p_Bonf | k_min |
|---|---|---|---|
| Mayfield 2021-12-11 | −0.447 | 1.11e-3 | −270 min |
| Oklahoma 2024-05-06 (Barnsdall EF4) | −0.595 | 8.70e-9 | −105 min |
Three additional outbreaks are PARTIAL (ark-la-miss-2023-04-01, tennessee-2023-12-09, southeast-2024-12-28), four GATE_FAIL, one no test. Heterogeneity is substantial.
V3 primary test, outbreak vs dose-control on 40m_tornado:
- Outbreak pool d = −0.525 (n_storm = 286).
- Dose-control pool d = −0.384 (n_storm = 20).
- delta_d = −0.142, CI [−0.442, +0.213], Welch p (storm-vs-storm, one-sided) = 0.219, MWU U = 2374, p (one-sided) = 0.102, p_Bonferroni = 1.0.
Not Bonferroni-significant. The outbreak signal is not distinguishable from the dose-control signal. The precursor shows up in any pool that contains tornado storm-bins, regardless of whether the underlying event was an "outbreak" by NOAA's count.
Clean-control pool: 0 tornado storm-bins by construction (by design, these events had zero SPC tornadoes in the 72 h window). Direct outbreak-vs-clean Welch on 40m_tornado is structurally undefined. The "clean" design fixed V2's contamination but left the primary stratum untestable at the clean end.
Dose-response slope: For 40m_tornado, insufficient dose-bucket events (n_per_bucket = {clean: 0, dose: 0, outbreak: 6}); slope undefined. For 40m_hail and 40m_wind, slopes are negative but permutation-p > 0.25.
V3 verdict (one sentence)
The WSPR 40 m pre-tornado anomaly is reproducible in pooled outbreak data (k_min = −270 min, d = −0.525, exceeds shuffle null) but is not statistically distinguishable from the dose-control signal (d = −0.384, delta_d CI straddles zero); the precursor is best described as a general HF response to any tornado-producing convection rather than a marker of outbreak severity.
Null results (prominent)
- Outbreak-vs-dose delta_d is not Bonferroni-significant on 40m_tornado (delta_d = −0.142, CI [−0.442, 0.213], Welch p (one-sided) = 0.219, MWU p (one-sided) = 0.102, p_Bonferroni = 1.0).
- Dose-response slope undefined for 40m_tornado (only outbreak events populate the bucket).
- Clean-control pool has zero tornado storm-bins by construction; the primary stratum is untestable at the clean end. The V3 SPC screen worked perfectly, at the cost of dropping the bottom of the gradient.
V2 flags fixed
V2 flagged 15/21 controls as contaminated. V3 reports 0/24 (0.0%). The SPC pre-screen works.
References
- Paper #29 (
wspr-tornado-season-conus-2026): V1, 66-event tornado season scan. - Paper #30 (
wspr-tornado-v2-historical): V2, 11 outbreaks + 21 DOY controls (contaminated). - Paper #25 (
wspr-aircraft-detection): aircraft precursor in WSPR corridors. wspr-ionospheric-baseline: HF baseline characterization.wspr-solar-cycle-modulation: solar context for WSPR propagation.- Parent issue: #149 (V3 master plan). Stage 1: #150. Paper: #155.
Author: TerraPulse Lab
Published: 2026-04-20 · Updated: 2026-04-20
Data files: clean_and_spc.log, control_classification.json, control_selection_log.json, cross_event_aggregation.log, cross_event_summary.json, events.parquet, extract.log, mechanism_lag_spc_ark-la-miss-2023-04-01.json, mechanism_lag_spc_control-ark-la-miss-2023-04-01-a.json, mechanism_lag_spc_control-ark-la-miss-2023-04-01-b.json, mechanism_lag_spc_control-deep-south-2023-03-24-a.json, mechanism_lag_spc_control-deep-south-2023-03-24-b.json, mechanism_lag_spc_control-great-plains-2022-04-12-a.json, mechanism_lag_spc_control-great-plains-2022-04-12-b.json, mechanism_lag_spc_control-heartland-2023-05-11-a.json, mechanism_lag_spc_control-heartland-2023-05-11-b.json, mechanism_lag_spc_control-iowa-2024-05-21-a.json, mechanism_lag_spc_control-iowa-2024-05-21-b.json, mechanism_lag_spc_control-mayfield-2021-12-11-a.json, mechanism_lag_spc_control-mayfield-2021-12-11-b.json, mechanism_lag_spc_control-midwest-2021-12-15-a.json, mechanism_lag_spc_control-midwest-2021-12-15-b.json, mechanism_lag_spc_control-nebraska-2024-04-26-a.json, mechanism_lag_spc_control-nebraska-2024-04-26-b.json, mechanism_lag_spc_control-oklahoma-2024-05-06-a.json, mechanism_lag_spc_control-oklahoma-2024-05-06-b.json, mechanism_lag_spc_control-palm-sunday-2023-04-05-a.json, mechanism_lag_spc_control-palm-sunday-2023-04-05-b.json, mechanism_lag_spc_control-southeast-2024-12-28-a.json, mechanism_lag_spc_control-southeast-2024-12-28-b.json, mechanism_lag_spc_control-tennessee-2023-12-09-a.json, mechanism_lag_spc_control-tennessee-2023-12-09-b.json, mechanism_lag_spc_deep-south-2023-03-24.json, mechanism_lag_spc_great-plains-2022-04-12.json, mechanism_lag_spc_heartland-2023-05-11.json, mechanism_lag_spc_iowa-2024-05-21.json, mechanism_lag_spc_mayfield-2021-12-11.json, mechanism_lag_spc_midwest-2021-12-15.json, mechanism_lag_spc_nebraska-2024-04-26.json, mechanism_lag_spc_oklahoma-2024-05-06.json, mechanism_lag_spc_palm-sunday-2023-04-05.json, mechanism_lag_spc_southeast-2024-12-28.json, mechanism_lag_spc_tennessee-2023-12-09.json, mwu_ob_vs_dose.json, per_event_analysis.log, per_event_summary.json, per_event_v3_table.csv, render_figures.log, spc_prescreen.log, spc_reports_ark-la-miss-2023-04-01.parquet, spc_reports_control-ark-la-miss-2023-04-01-a.parquet, spc_reports_control-ark-la-miss-2023-04-01-b.parquet, spc_reports_control-deep-south-2023-03-24-a.parquet, spc_reports_control-deep-south-2023-03-24-b.parquet, spc_reports_control-great-plains-2022-04-12-a.parquet, spc_reports_control-great-plains-2022-04-12-b.parquet, spc_reports_control-heartland-2023-05-11-a.parquet, spc_reports_control-heartland-2023-05-11-b.parquet, spc_reports_control-iowa-2024-05-21-a.parquet, spc_reports_control-iowa-2024-05-21-b.parquet, spc_reports_control-mayfield-2021-12-11-a.parquet, spc_reports_control-mayfield-2021-12-11-b.parquet, spc_reports_control-midwest-2021-12-15-a.parquet, spc_reports_control-midwest-2021-12-15-b.parquet, spc_reports_control-nebraska-2024-04-26-a.parquet, spc_reports_control-nebraska-2024-04-26-b.parquet, spc_reports_control-oklahoma-2024-05-06-a.parquet, spc_reports_control-oklahoma-2024-05-06-b.parquet, spc_reports_control-palm-sunday-2023-04-05-a.parquet, spc_reports_control-palm-sunday-2023-04-05-b.parquet, spc_reports_control-southeast-2024-12-28-a.parquet, spc_reports_control-southeast-2024-12-28-b.parquet, spc_reports_control-tennessee-2023-12-09-a.parquet, spc_reports_control-tennessee-2023-12-09-b.parquet, spc_reports_deep-south-2023-03-24.parquet, spc_reports_great-plains-2022-04-12.parquet, spc_reports_heartland-2023-05-11.parquet, spc_reports_iowa-2024-05-21.parquet, spc_reports_mayfield-2021-12-11.parquet, spc_reports_midwest-2021-12-15.parquet, spc_reports_nebraska-2024-04-26.parquet, spc_reports_oklahoma-2024-05-06.parquet, spc_reports_palm-sunday-2023-04-05.parquet, spc_reports_southeast-2024-12-28.parquet, spc_reports_tennessee-2023-12-09.parquet, spots_ark-la-miss-2023-04-01.parquet, spots_clean_ark-la-miss-2023-04-01.parquet, spots_clean_control-ark-la-miss-2023-04-01-a.parquet, spots_clean_control-ark-la-miss-2023-04-01-b.parquet, spots_clean_control-deep-south-2023-03-24-a.parquet, spots_clean_control-deep-south-2023-03-24-b.parquet, spots_clean_control-great-plains-2022-04-12-a.parquet, spots_clean_control-great-plains-2022-04-12-b.parquet, spots_clean_control-heartland-2023-05-11-a.parquet, spots_clean_control-heartland-2023-05-11-b.parquet, spots_clean_control-iowa-2024-05-21-a.parquet, spots_clean_control-iowa-2024-05-21-b.parquet, spots_clean_control-mayfield-2021-12-11-a.parquet, spots_clean_control-mayfield-2021-12-11-b.parquet, spots_clean_control-midwest-2021-12-15-a.parquet, spots_clean_control-midwest-2021-12-15-b.parquet, spots_clean_control-nebraska-2024-04-26-a.parquet, spots_clean_control-nebraska-2024-04-26-b.parquet, spots_clean_control-oklahoma-2024-05-06-a.parquet, spots_clean_control-oklahoma-2024-05-06-b.parquet, spots_clean_control-palm-sunday-2023-04-05-a.parquet, spots_clean_control-palm-sunday-2023-04-05-b.parquet, spots_clean_control-southeast-2024-12-28-a.parquet, spots_clean_control-southeast-2024-12-28-b.parquet, spots_clean_control-tennessee-2023-12-09-a.parquet, spots_clean_control-tennessee-2023-12-09-b.parquet, spots_clean_deep-south-2023-03-24.parquet, spots_clean_great-plains-2022-04-12.parquet, spots_clean_heartland-2023-05-11.parquet, spots_clean_iowa-2024-05-21.parquet, spots_clean_mayfield-2021-12-11.parquet, spots_clean_midwest-2021-12-15.parquet, spots_clean_nebraska-2024-04-26.parquet, spots_clean_oklahoma-2024-05-06.parquet, spots_clean_palm-sunday-2023-04-05.parquet, spots_clean_southeast-2024-12-28.parquet, spots_clean_tennessee-2023-12-09.parquet, spots_control-ark-la-miss-2023-04-01-a.parquet, spots_control-ark-la-miss-2023-04-01-b.parquet, spots_control-deep-south-2023-03-24-a.parquet, spots_control-deep-south-2023-03-24-b.parquet, spots_control-great-plains-2022-04-12-a.parquet, spots_control-great-plains-2022-04-12-b.parquet, spots_control-heartland-2023-05-11-a.parquet, spots_control-heartland-2023-05-11-b.parquet, spots_control-iowa-2024-05-21-a.parquet, spots_control-iowa-2024-05-21-b.parquet, spots_control-mayfield-2021-12-11-a.parquet, spots_control-mayfield-2021-12-11-b.parquet, spots_control-midwest-2021-12-15-a.parquet, spots_control-midwest-2021-12-15-b.parquet, spots_control-nebraska-2024-04-26-a.parquet, spots_control-nebraska-2024-04-26-b.parquet, spots_control-oklahoma-2024-05-06-a.parquet, spots_control-oklahoma-2024-05-06-b.parquet, spots_control-palm-sunday-2023-04-05-a.parquet, spots_control-palm-sunday-2023-04-05-b.parquet, spots_control-southeast-2024-12-28-a.parquet, spots_control-southeast-2024-12-28-b.parquet, spots_control-tennessee-2023-12-09-a.parquet, spots_control-tennessee-2023-12-09-b.parquet, spots_deep-south-2023-03-24.parquet, spots_great-plains-2022-04-12.parquet, spots_heartland-2023-05-11.parquet, spots_iowa-2024-05-21.parquet, spots_mayfield-2021-12-11.parquet, spots_midwest-2021-12-15.parquet, spots_nebraska-2024-04-26.parquet, spots_oklahoma-2024-05-06.parquet, spots_palm-sunday-2023-04-05.parquet, spots_southeast-2024-12-28.parquet, spots_tennessee-2023-12-09.parquet, storm_test_ark-la-miss-2023-04-01.json, storm_test_control-ark-la-miss-2023-04-01-a.json, storm_test_control-ark-la-miss-2023-04-01-b.json, storm_test_control-deep-south-2023-03-24-a.json, storm_test_control-deep-south-2023-03-24-b.json, storm_test_control-great-plains-2022-04-12-a.json, storm_test_control-great-plains-2022-04-12-b.json, storm_test_control-heartland-2023-05-11-a.json, storm_test_control-heartland-2023-05-11-b.json, storm_test_control-iowa-2024-05-21-a.json, storm_test_control-iowa-2024-05-21-b.json, storm_test_control-mayfield-2021-12-11-a.json, storm_test_control-mayfield-2021-12-11-b.json, storm_test_control-midwest-2021-12-15-a.json, storm_test_control-midwest-2021-12-15-b.json, storm_test_control-nebraska-2024-04-26-a.json, storm_test_control-nebraska-2024-04-26-b.json, storm_test_control-oklahoma-2024-05-06-a.json, storm_test_control-oklahoma-2024-05-06-b.json, storm_test_control-palm-sunday-2023-04-05-a.json, storm_test_control-palm-sunday-2023-04-05-b.json, storm_test_control-southeast-2024-12-28-a.json, storm_test_control-southeast-2024-12-28-b.json, storm_test_control-tennessee-2023-12-09-a.json, storm_test_control-tennessee-2023-12-09-b.json, storm_test_deep-south-2023-03-24.json, storm_test_great-plains-2022-04-12.json, storm_test_heartland-2023-05-11.json, storm_test_iowa-2024-05-21.json, storm_test_mayfield-2021-12-11.json, storm_test_midwest-2021-12-15.json, storm_test_nebraska-2024-04-26.json, storm_test_oklahoma-2024-05-06.json, storm_test_palm-sunday-2023-04-05.json, storm_test_southeast-2024-12-28.json, storm_test_tennessee-2023-12-09.json
Scripts: clean_and_spc.py, compute_mwu_ob_vs_dose.py, compute_verdicts.py, cross_event_aggregation.py, extract.py, per_event_analysis.py, render_figures.py, spc_prescreen.py