Listening for events…

Data Lab / WSPR tornado V2: historical outbreak case studies (Joplin, Super Outbreak, Moore, Rolling Fork, ...)

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.

SourceN (this study)SpanRole
WSPR spots (wspr.live)48.6 M2011-04 … 2023-04Per (cell, 15 min) residual SNR
SPC storm reports (NOAA)14,1352011-04 … 2023-04Event rasterization to 1° grid
Event catalog (hand-curated)287 outbreaks + 21 ctrlWindow 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:

  1. Per (cell, hour-of-day) residual SNR from the denoised wspr.live pull.
  2. Quality gates: n_min = 20 spots per cell-bin, baseline n ≥ 5, MAD > 0.1 dB.
  3. Amplitude test: Welch t + Mann-Whitney U for storm vs quiet cell-bins on a band × storm-type grid (12 strata). Cohen's d with pooled SD; Bonferroni across 12 strata (α_corr = 4.17 × 10⁻³).
  4. Superposed-epoch lag test: per event, align cell residuals to SPC report time; bin ±360 min at 15-min resolution; pool across events.
  5. Pooling: per-event Cohen's d via stratum-specific Welch; Fisher combined one-sided p across events.
  6. 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

SlugDateN spots (72 h)Verdict40m_tor d40m_tor k_min (min)Bonf. pass
super-outbreak-2011-04-272011-04-2778,902GATE_FAIL
joplin-2011-05-222011-05-2262,310GATE_FAIL
moore-2013-05-202013-05-2097,108GATE_FAIL
el-reno-2013-05-312013-05-31129,354GATE_FAIL
easter-2020-04-102020-04-101,966,074NO_TORNADO
mayfield-2021-12-112021-12-113,297,359REPLICATES-0.447-270yes
rolling-fork-2023-03-242023-03-245,567,509PARTIAL-0.255-120no

(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_tornado is 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)

  1. clean_controls_cannot_test_40m_tornado_by_construction_no_storm_bins
  2. heuristic_flagged_15_of_21_controls_contaminated (>2)
  3. 4_outbreaks_gate_fail_on_40m_tornado_power_limited
  4. 1_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

← Back to Data Lab
Live Feed