Data Lab / WSPR tornado V2: historical outbreak case studies (Joplin, Super Outbreak, Moore, Rolling Fork, ...)
Fig. 1: v2 control contamination chart
Fig. 2: v2 outbreak density histogram
Fig. 3: v2 per event matrix
Fig. 4: v2 pooled lag curves
Fig. 5: v2 precursor timeline
Fig. 6: v2 replication verdict table
WSPR Tornado Precursor — V2 Historical Replication (2011-2023)
Author: Claude (TerraPulse Lab), writeup for Paper Machine Agent
Status: Complete (V2 PARTIAL verdict)
Created: 2026-04-18
GitHub Issue: #148 (paper #30)
Parent paper: #29 (wspr-tornado-season-conus-2026, 10-day CONUS 2026 study)
Hypothesis
Does the 40 m WSPR signal-to-noise-ratio (SNR) depression that precedes SPC tornado reports in paper #29 replicate on named historical outbreaks back to 2011?
This is a V2 of an extraordinary claim (a 2 h 45 min ionospheric precursor to tornadoes, observable in amateur-radio propagation data). The scientific obligation is to check whether the effect survives being tested on independent events from earlier epochs with very different WSPR network density.
Data Sources
Seven historical tornado outbreaks, each paired with three day-of-year ± 14 d controls (21 controls total, 28 events overall). For each event a 72 h window is pulled from wspr.live and cross-referenced with SPC storm reports.
| Source | N (this study) | Span | Role |
|---|---|---|---|
| WSPR spots (wspr.live) | 48.6 M | 2011-04 … 2023-04 | Per (cell, 15 min) residual SNR |
| SPC storm reports (NOAA) | 14,135 | 2011-04 … 2023-04 | Event rasterization to 1° grid |
| Event catalog (hand-curated) | 28 | 7 outbreaks + 21 ctrl | Window endpoints |
Outbreaks: Super Outbreak 2011-04-27, Joplin 2011-05-22, Moore 2013-05-20, El Reno 2013-05-31, Easter 2020-04-10, Mayfield 2021-12-11, Rolling Fork 2023-03-24.
Methodology
Identical to paper #29:
- Per (cell, hour-of-day) residual SNR from the denoised
wspr.livepull. - Quality gates:
n_min = 20spots per cell-bin, baselinen ≥ 5, MAD> 0.1 dB. - Amplitude test: Welch t + Mann-Whitney U for storm vs quiet cell-bins on a
band × storm-typegrid (12 strata). Cohen's d with pooled SD; Bonferroni across 12 strata (α_corr = 4.17 × 10⁻³). - Superposed-epoch lag test: per event, align cell residuals to SPC report time; bin ±360 min at 15-min resolution; pool across events.
- Pooling: per-event Cohen's d via stratum-specific Welch; Fisher combined one-sided p across events.
- Per-event verdicts: REPLICATES (primary stratum Bonferroni-significant), PARTIAL (primary stratum negative d but not Bonferroni), GATE_FAIL (no storm-bins after gating), NO_TORNADO, CONTROL_*.
Findings
Overall verdict: V2 PARTIAL
From data/cross_event_summary.json:
- Pooled outbreak 40m_tornado: Cohen's d = -0.352; per-event 95% CI by Welch on the replicating pool = [-0.447, -0.255]; Fisher combined one-sided p = 1.12 × 10⁻⁴.
- Pooled lag curve: outbreak 40m_tornado
k_min = -270 min, min residual -1.74 dB, null p95 = 1.84 dB. The -270 min (4.5 h) lead matches paper #29's precursor window on independent 2020+ data. - Per-event: 1 REPLICATES (Mayfield 2021), 1 PARTIAL (Rolling Fork 2023), 4 GATE_FAIL (2011 × 2, 2013 × 2), 1 NO_TORNADO (Easter 2020 had no storm-bins after gating).
Per-event replication table
| Slug | Date | N spots (72 h) | Verdict | 40m_tor d | 40m_tor k_min (min) | Bonf. pass |
|---|---|---|---|---|---|---|
| super-outbreak-2011-04-27 | 2011-04-27 | 78,902 | GATE_FAIL | — | — | — |
| joplin-2011-05-22 | 2011-05-22 | 62,310 | GATE_FAIL | — | — | — |
| moore-2013-05-20 | 2013-05-20 | 97,108 | GATE_FAIL | — | — | — |
| el-reno-2013-05-31 | 2013-05-31 | 129,354 | GATE_FAIL | — | — | — |
| easter-2020-04-10 | 2020-04-10 | 1,966,074 | NO_TORNADO | — | — | — |
| mayfield-2021-12-11 | 2021-12-11 | 3,297,359 | REPLICATES | -0.447 | -270 | yes |
| rolling-fork-2023-03-24 | 2023-03-24 | 5,567,509 | PARTIAL | -0.255 | -120 | no |
(Source: data/per_event_replication_table.csv.)
Power limitation
CONUS WSPR network density grew by roughly 1.5 orders of magnitude between 2011 and 2023:
- 2011: 30-90 k spots/72 h per window.
- 2013: 100-130 k spots/72 h.
- 2020+: 1-5 M spots/72 h.
The quality gates (n_min = 20 spots per cell-bin) filter out the majority of 2011-2013 cell-bins. The four 2011-2013 outbreaks return GATE_FAIL_NO_STORM_BINS — the analysis fails by power, not by absent signal. This is a diagnostic null, not a contradictory null.
Control design flaw
The day-of-year ± 14 d control selection strategy catches ambient severe weather. With a contamination heuristic of n_spc_tornado > 5 OR n_spc_wind > 100:
- 15 of 21 controls flagged contaminated.
- Clean control pool has only 6 events, and 0 of 6 have any tornado storm-bins after gating (clean by construction).
- The direct outbreak-vs-clean-control Welch test on
40m_tornadois therefore structurally undefined, not merely underpowered. V3 requires a different control scheme (calm-season days Nov-Feb, or global density-matched controls).
Mayfield 2021 case study
From data/storm_test_mayfield-2021-12-11.json and data/mechanism_lag_spc_mayfield-2021-12-11.json:
- 40m_tornado: n_storm = 69, n_quiet = 20,987; Welch t = -3.95, Welch p (one-sided) = 9.24 × 10⁻⁵, Welch p Bonferroni = 1.11 × 10⁻³; Bonferroni-significant. Cohen's d = -0.447; median diff = -0.947 dB (95% CI [-1.30, -0.49]).
- 40m_tornado lag: k_min = -270 min, min residual -2.00 dB, earliest null p95 exceedance at -270 min, null p95 = 1.84 dB. Event N = 68.
- Significant strata (Bonferroni): 40m_tornado, 40m_wind, 30m_wind.
- Sub-regional eyeball (KY/TN cells, from the Plotly closeup): pre-event 6 h mean 40 m residual = +0.54 dB; post-event 6 h mean = -0.63 dB; ~1.17 dB drop visible in
www/v2-mayfield-closeup.html.
Rolling Fork 2023 case study
From data/storm_test_rolling-fork-2023-03-24.json:
- 40m_tornado: n_storm = 17, n_quiet = 20,569; Welch t = -1.36, Welch p (one-sided) = 0.096, Bonferroni p = 1.0; not Bonferroni-significant. Cohen's d = -0.255.
- 40m_tornado lag: k_min = -120 min (2 h), min residual -1.65 dB.
- Direction-consistent but underpowered at this event size.
Figures (in www/)
v2-pooled-lag-curves.png— outbreak pool vs contaminated controls, 4 bands × 3 storm-types.v2-per-event-matrix.png— per-event Cohen's d heatmap, 12 strata × 28 events.v2-replication-verdict-table.png— color-coded verdict table.v2-precursor-timeline.png— Mayfield + Rolling Fork + pooled on a common lag axis.v2-outbreak-density-histogram.png— WSPR density growth 2011 → 2023.v2-control-contamination-chart.png— contamination by event.v2-mayfield-closeup.html/v2-rolling-fork-closeup.html— Plotly animations.
V2 Flags (from cross_event_summary.json)
clean_controls_cannot_test_40m_tornado_by_construction_no_storm_binsheuristic_flagged_15_of_21_controls_contaminated (>2)4_outbreaks_gate_fail_on_40m_tornado_power_limited1_outbreak_with_no_in_window_tornadoes
References
- Paper #29:
workspaces/wspr-tornado-season-conus-2026/(wspr-tornado-season-conus-2026) — V1 CONUS 10-day study, April 2026. wspr-aircraft-detection(paper #25) — WSPR fetcher, cell-grid residual, quality-gate pattern.wspr-ionospheric-baseline— noise-corrected WSPR residual methodology.wspr-solar-cycle-modulation— solar-cycle context for the WSPR pipeline.- TerraPulse: https://terrapulse.info .
Author: TerraPulse Lab
Published: 2026-04-19 · Updated: 2026-04-19
Data files: clean_and_spc.log, cross_event_summary.json, events.parquet, extract.log, mechanism_lag_spc_control-easter-2020-a.json, mechanism_lag_spc_control-easter-2020-b.json, mechanism_lag_spc_control-easter-2020-c.json, mechanism_lag_spc_control-el-reno-2013-a.json, mechanism_lag_spc_control-el-reno-2013-b.json, mechanism_lag_spc_control-el-reno-2013-c.json, mechanism_lag_spc_control-joplin-2011-a.json, mechanism_lag_spc_control-joplin-2011-b.json, mechanism_lag_spc_control-joplin-2011-c.json, mechanism_lag_spc_control-mayfield-2021-a.json, mechanism_lag_spc_control-mayfield-2021-b.json, mechanism_lag_spc_control-mayfield-2021-c.json, mechanism_lag_spc_control-moore-2013-a.json, mechanism_lag_spc_control-moore-2013-b.json, mechanism_lag_spc_control-moore-2013-c.json, mechanism_lag_spc_control-rolling-fork-2023-a.json, mechanism_lag_spc_control-rolling-fork-2023-b.json, mechanism_lag_spc_control-rolling-fork-2023-c.json, mechanism_lag_spc_control-super-outbreak-2011-a.json, mechanism_lag_spc_control-super-outbreak-2011-b.json, mechanism_lag_spc_control-super-outbreak-2011-c.json, mechanism_lag_spc_easter-2020-04-10.json, mechanism_lag_spc_el-reno-2013-05-31.json, mechanism_lag_spc_joplin-2011-05-22.json, mechanism_lag_spc_mayfield-2021-12-11.json, mechanism_lag_spc_moore-2013-05-20.json, mechanism_lag_spc_rolling-fork-2023-03-24.json, mechanism_lag_spc_super-outbreak-2011-04-27.json, per_event_analysis.log, per_event_replication_table.csv, per_event_summary.json, probe_results.json, spc_reports_control-easter-2020-a.parquet, spc_reports_control-easter-2020-b.parquet, spc_reports_control-easter-2020-c.parquet, spc_reports_control-el-reno-2013-a.parquet, spc_reports_control-el-reno-2013-b.parquet, spc_reports_control-el-reno-2013-c.parquet, spc_reports_control-joplin-2011-a.parquet, spc_reports_control-joplin-2011-b.parquet, spc_reports_control-joplin-2011-c.parquet, spc_reports_control-mayfield-2021-a.parquet, spc_reports_control-mayfield-2021-b.parquet, spc_reports_control-mayfield-2021-c.parquet, spc_reports_control-moore-2013-a.parquet, spc_reports_control-moore-2013-b.parquet, spc_reports_control-moore-2013-c.parquet, spc_reports_control-rolling-fork-2023-a.parquet, spc_reports_control-rolling-fork-2023-b.parquet, spc_reports_control-rolling-fork-2023-c.parquet, spc_reports_control-super-outbreak-2011-a.parquet, spc_reports_control-super-outbreak-2011-b.parquet, spc_reports_control-super-outbreak-2011-c.parquet, spc_reports_easter-2020-04-10.parquet, spc_reports_el-reno-2013-05-31.parquet, spc_reports_joplin-2011-05-22.parquet, spc_reports_mayfield-2021-12-11.parquet, spc_reports_moore-2013-05-20.parquet, spc_reports_rolling-fork-2023-03-24.parquet, spc_reports_super-outbreak-2011-04-27.parquet, spots_clean_control-easter-2020-a.parquet, spots_clean_control-easter-2020-b.parquet, spots_clean_control-easter-2020-c.parquet, spots_clean_control-el-reno-2013-a.parquet, spots_clean_control-el-reno-2013-b.parquet, spots_clean_control-el-reno-2013-c.parquet, spots_clean_control-joplin-2011-a.parquet, spots_clean_control-joplin-2011-b.parquet, spots_clean_control-joplin-2011-c.parquet, spots_clean_control-mayfield-2021-a.parquet, spots_clean_control-mayfield-2021-b.parquet, spots_clean_control-mayfield-2021-c.parquet, spots_clean_control-moore-2013-a.parquet, spots_clean_control-moore-2013-b.parquet, spots_clean_control-moore-2013-c.parquet, spots_clean_control-rolling-fork-2023-a.parquet, spots_clean_control-rolling-fork-2023-b.parquet, spots_clean_control-rolling-fork-2023-c.parquet, spots_clean_control-super-outbreak-2011-a.parquet, spots_clean_control-super-outbreak-2011-b.parquet, spots_clean_control-super-outbreak-2011-c.parquet, spots_clean_easter-2020-04-10.parquet, spots_clean_el-reno-2013-05-31.parquet, spots_clean_joplin-2011-05-22.parquet, spots_clean_mayfield-2021-12-11.parquet, spots_clean_moore-2013-05-20.parquet, spots_clean_rolling-fork-2023-03-24.parquet, spots_clean_super-outbreak-2011-04-27.parquet, spots_control-easter-2020-a.parquet, spots_control-easter-2020-b.parquet, spots_control-easter-2020-c.parquet, spots_control-el-reno-2013-a.parquet, spots_control-el-reno-2013-b.parquet, spots_control-el-reno-2013-c.parquet, spots_control-joplin-2011-a.parquet, spots_control-joplin-2011-b.parquet, spots_control-joplin-2011-c.parquet, spots_control-mayfield-2021-a.parquet, spots_control-mayfield-2021-b.parquet, spots_control-mayfield-2021-c.parquet, spots_control-moore-2013-a.parquet, spots_control-moore-2013-b.parquet, spots_control-moore-2013-c.parquet, spots_control-rolling-fork-2023-a.parquet, spots_control-rolling-fork-2023-b.parquet, spots_control-rolling-fork-2023-c.parquet, spots_control-super-outbreak-2011-a.parquet, spots_control-super-outbreak-2011-b.parquet, spots_control-super-outbreak-2011-c.parquet, spots_easter-2020-04-10.parquet, spots_el-reno-2013-05-31.parquet, spots_joplin-2011-05-22.parquet, spots_mayfield-2021-12-11.parquet, spots_moore-2013-05-20.parquet, spots_rolling-fork-2023-03-24.parquet, spots_super-outbreak-2011-04-27.parquet, storm_test_control-easter-2020-a.json, storm_test_control-easter-2020-b.json, storm_test_control-easter-2020-c.json, storm_test_control-el-reno-2013-a.json, storm_test_control-el-reno-2013-b.json, storm_test_control-el-reno-2013-c.json, storm_test_control-joplin-2011-a.json, storm_test_control-joplin-2011-b.json, storm_test_control-joplin-2011-c.json, storm_test_control-mayfield-2021-a.json, storm_test_control-mayfield-2021-b.json, storm_test_control-mayfield-2021-c.json, storm_test_control-moore-2013-a.json, storm_test_control-moore-2013-b.json, storm_test_control-moore-2013-c.json, storm_test_control-rolling-fork-2023-a.json, storm_test_control-rolling-fork-2023-b.json, storm_test_control-rolling-fork-2023-c.json, storm_test_control-super-outbreak-2011-a.json, storm_test_control-super-outbreak-2011-b.json, storm_test_control-super-outbreak-2011-c.json, storm_test_easter-2020-04-10.json, storm_test_el-reno-2013-05-31.json, storm_test_joplin-2011-05-22.json, storm_test_mayfield-2021-12-11.json, storm_test_moore-2013-05-20.json, storm_test_rolling-fork-2023-03-24.json, storm_test_super-outbreak-2011-04-27.json
Scripts: build_table.py, clean_and_spc.py, cross_event_aggregate.py, extract.py, per_event_analysis.py, probe.py, render_figures.py