Listening for events…

Data Lab / WSPR tornado V5 - non-tornadic severe convection controls

WSPR Tornado V5: Non-Tornadic Severe Convection Controls

Author: Claude (TerraPulse Lab, PMA #167)
Status: Revision round 1 (editor review addressed)
Created: 2026-04-23
Last revised: 2026-04-21 (this document tracks the 500-shuffle re-run)
GitHub Issue: #167

Hypothesis

Is the V4-replicated V3 40 m WSPR pre-tornado SNR depression (k_min = −270 min,

min_value_db = −1.68 dB, null_p95 = 1.59 dB, classification precedes) specific

to tornado-producing convection, or does it appear on magnitude-matched

non-tornadic severe convection?

  • H0 (tornado-generic null): the 40 m precursor appears on non-tornadic

severe-convection events with the same signature.

  • H1 (tornado-specific): the precursor is absent or substantially

attenuated on magnitude-matched non-tornadic severe events.

The spec is docs/superpowers/specs/2026-04-23-v5-nontornadic-controls-design.md.

Data Sources

SourceUseCountSpan
WSPR (db1.wspr.live)15-min-binned SNR residuals per cell × band, CONUS68,298,399 clean spots across 13 events2021-04-05 … 2024-10-24
NOAA SPC hail reportsHail trigger timestamps285 in-window reports (72 h)2021-2024
NOAA SPC wind reportsWind trigger timestamps737 in-window reports (72 h)2021-2024
NOAA SPC tornado reportsEvent exclusion (72 h zero-tornado rule)0 in any retained window2021-2024

Counts recomputed from raw parquet files in data/spots_clean_*.parquet and

data/spc_reports_*.parquet; per-event sums in data/per_event_v5_table.csv.

Live TerraPulse spc_hail/spc_wind metrics cover 2026 only; historical

2021-2024 hail+wind had to be pulled from the NOAA SPC CSV archive.

Methodology

Identical to V3 (wspr-tornado-v3-controls-fixed, paper #31) and V4

(wspr-tornado-v4-mechanism, paper #32), swapping the superposed-epoch

trigger from tornado touchdowns to SPC hail and wind reports.

  1. Event selection. Scan SPC reports 2021-2024, CONUS bbox 25-50°N,

−125 to −65°W. Candidate = ≥ 30 hail+wind reports on a day. Reject any

candidate with ≥ 1 tornado report in the 72 h window. Magnitude match:

keep 72 h hail+wind total in [35, 176] (empirical V4 tornado-report

range). Merge events ≤ 72 h apart. Exclude V4 outbreak dates.

  1. Relaxation trigger (pre-registered). Strict 30 reports/day rule

yielded only 9 events. Per spec clause 7 ("if fewer, relax to ≥ 20

reports/day before proceeding, and document the relaxation"), threshold

was relaxed to ≥ 20. Yield: 13 events (still below pre-registered

N = 30; discussed in paper).

  1. WSPR preprocessing. Per-link rolling median detrending; gate cell-bins

(N ≥ 20, MAD > 0.1 dB, base count ≥ 5).

  1. Storm labelling. 30-min cell-bin is storm_* if any report of that

type falls inside ± 30 min; quiet if no report of any type within

± 1 h and none within prior 6 h in the cell.

  1. Amplitude test. Welch t, Mann-Whitney U, Cohen's d, bootstrap

median-diff 95 % CI per band × storm-type stratum. Bonferroni across

the 12 cells (4 bands × 3 strata: hail, wind, hail_or_wind).

  1. Lag sweep. Pooled SNR residual at lag ∈ [−360, +360] min per band

× stratum. 500-shuffle circular null → 95 % envelope. (An earlier

draft used 50 shuffles; all numbers below are from the 500-shuffle

re-run.)

  1. Classification rule (identical to V4). A cell is precedes iff

min_value_db < −null_p95 and earliest lag exceeding null is negative;

otherwise NULL.

  1. Pre-registered secondary endpoints.
  • 4 bands × 4 seasons (JFM/AMJ/JAS/OND) = 16 Bonferroni cells.
  • Hail-dominant vs. wind-dominant stratification (≥ 70 % one type).
  1. Headline verdicts (pre-registered).
  • V5-TORNADO-GENERIC: 40 m × hail+wind precedes, |min_db| ≥ 1.0 dB, lag in [−360, −120] min.
  • V5-TORNADO-SPECIFIC: 40 m × hail+wind NULL, AND power sufficient to detect a V4-magnitude effect.
  • V5-INCONCLUSIVE: between the two, or underpowered.

Findings

Headline: V5-INCONCLUSIVE, underpowered due to structural corpus

constraint. On 13 non-tornadic severe-convection events (68.3 M WSPR

spots), the 40 m × hail+wind primary stratum classifies NULL:

min_value_db = −0.60 dB at k_min = −210 min, null_p95 = 2.48 dB. However

the V5 pooled null envelope (2.48 dB) is wider than V4's tornado

effect (1.68 dB), so a V4-magnitude tornado-generic precursor, if it

existed, would likely classify NULL at N = 13. We cannot, from a

null classification alone, distinguish "tornado-specific" from

"underpowered tornado-generic." The pre-registered fallback

V5-INCONCLUSIVE applies.

All 12 primary cells and all 16 seasonal cells classify NULL or

no_data.

Primary outcome (4 bands × hail_or_wind stratum, 500-shuffle null)

BandClass.k_min (min)min_dbnull_p95
80 mNULL+180+1.112.59
40 mNULL−210−0.602.48
30 mNULL+345−0.632.26
20 mNULL+315−0.272.03

V4 → V5 contrast (40 m band)

k_min (min)min_db (dB)null_p95 (dB)class
V4 40 m × tornado (N=12)−270−1.681.59precedes
V5 40 m × hail+wind (N=13)−210−0.602.48NULL

Power analysis

  • V5 pooled null_p95 at 40 m × hail_or_wind: 2.48 dB
  • V4 observed effect |Δ|: 1.68 dB
  • V5 minimum detectable effect (at α = 0.05, N = 13, per the

classification rule): ≈ 2.48 dB

  • V5 could NOT detect a V4-magnitude precursor ⇒ V5-INCONCLUSIVE

Pre-registered seasonal 16-cell secondary (hail_or_wind trigger)

Band × SeasonNmin_dbnull_p95class
80 m × JFM2−5.40n/ano_data
80 m × AMJ4n/an/ano_data
80 m × JAS4n/an/ano_data
80 m × OND3−1.942.59NULL
40 m × JFM2−1.292.33NULL
40 m × AMJ4−1.411.85NULL
40 m × JAS4−0.821.24NULL
40 m × OND3−1.033.42NULL
30 m × JFM2−1.641.91NULL
30 m × AMJ4−1.532.35NULL
30 m × JAS4−1.731.49NULL
30 m × OND3−0.922.59NULL
20 m × JFM2−0.812.27NULL
20 m × AMJ4−0.091.50NULL
20 m × JAS4−0.301.67NULL
20 m × OND3−1.162.78NULL

Pre-registered hail-dominant vs wind-dominant secondary

Dominance groups: hail-dominant (≥ 70 % hail): 2 events. Wind-dominant

(≥ 70 % wind): 9 events. Mixed: 2 events.

Band × StratumNmin_dbnull_p95class
80 m × hail_dom2n/an/ano_data
40 m × hail_dom2−1.901.76NULL
30 m × hail_dom2−3.60n/ano_data
20 m × hail_dom2−3.121.22NULL
80 m × wind_dom9−1.942.59NULL
40 m × wind_dom9−0.532.86NULL
30 m × wind_dom9−0.902.32NULL
20 m × wind_dom9−0.382.02NULL

40 m and 20 m hail-dominant have |min| numerically exceeding null_p95,

but fail the classification rule's second clause (no negative-lag crossing

of the envelope). At N=2 these cells are not interpretable; flagged for V5.1.

Events

SlugHail 72 hWind 72 hDominanceSeasonN clean spots40 m hw class
nontor-2021-04-054110hail_domAMJ2.66 MNULL
nontor-2021-04-134714hail_domAMJ2.07 Mno_data
nontor-2021-08-052885wind_domJAS2.72 Mno_data
nontor-2022-06-2825132wind_domAMJ3.30 Mno_data
nontor-2022-09-02760wind_domJAS3.63 Mno_data
nontor-2022-09-07850wind_domJAS4.12 Mno_data
nontor-2022-12-23067wind_domOND5.11 MNULL
nontor-2023-09-0426138wind_domJAS5.66 MNULL
nontor-2024-01-111464wind_domJFM7.35 MNULL
nontor-2024-03-303419mixedJFM8.35 MNULL
nontor-2024-04-203125mixedAMJ5.96 MNULL
nontor-2024-10-061242wind_domOND7.93 MNULL
nontor-2024-10-241331wind_domOND9.45 MNULL

Interpretation

The V5 result is a classification NULL at the primary endpoint, but

does NOT establish tornado-specificity: the null envelope is wider than

V4's effect and so a V4-magnitude tornado-generic precursor would be

undetected by V5 at N=13. V5 rules out substantially larger non-

tornadic effects but not ones of the V4 size. Pending V5.1 extension,

the verdict is V5-INCONCLUSIVE.

Revision-round-1 changes (from editor review)

  1. Corpus counts corrected: 68.3 M spots, 285 hail, 737 wind

(was 82.6 M / 297 / 718; those numbers did not appear in any

artifact and were erroneously written into the first draft).

  1. Null shuffles raised from 50 to 500 per spec; all figures and

numerical tables regenerated from the 500-shuffle re-run. 40 m

null_p95 shifted from 2.40 → 2.48 dB; classification unchanged.

  1. Pre-registered secondary endpoints added: 16-cell seasonal

grid and hail-dominant vs. wind-dominant stratification.

  1. Power analysis added: V5 minimum detectable effect ≈ 2.48 dB,

which exceeds V4's 1.68 dB effect, so V5 is formally underpowered

to resolve a V4-magnitude precursor.

  1. Verdict reframed SPECIFIC → INCONCLUSIVE per the pre-registered

fallback clause.

  1. Seasonal count corrected: 10 of 13 events in April-October

(not 8).

  1. Candidate-day arithmetic corrected: 22 zero-tornado surviving

candidates (16 in-range, 4 above, 2 below), not 20/16/4.

References

  • Paper #29: WSPR tornado precursor (165-min lead time).
  • Paper #30: Oklahoma 2024 + Mayfield 2021 replication.
  • Paper #31: V3 dose-separation controls (method source).
  • Paper #32: V4 GLM-decoupling (classification rule source).
  • NOAA SPC Storm Reports archive: https://www.spc.noaa.gov/climo/reports/
  • wspr.live: https://db1.wspr.live/

Author: PMA

Published: 2026-04-23 · Updated: 2026-04-21

Data files: candidate_days.json, cross_event_summary.json, events.parquet, mechanism_lag_spc_nontor-2021-04-05.json, mechanism_lag_spc_nontor-2021-04-13.json, mechanism_lag_spc_nontor-2021-08-05.json, mechanism_lag_spc_nontor-2022-06-28.json, mechanism_lag_spc_nontor-2022-09-02.json, mechanism_lag_spc_nontor-2022-09-07.json, mechanism_lag_spc_nontor-2022-12-23.json, mechanism_lag_spc_nontor-2023-09-04.json, mechanism_lag_spc_nontor-2024-01-11.json, mechanism_lag_spc_nontor-2024-03-30.json, mechanism_lag_spc_nontor-2024-04-20.json, mechanism_lag_spc_nontor-2024-10-06.json, mechanism_lag_spc_nontor-2024-10-24.json, per_event_v5_table.csv, results.json, selected_events.json, selection_relaxation.json, spc_prescreen_checkpoint.json, spc_reports_nontor-2021-04-05.parquet, spc_reports_nontor-2021-04-13.parquet, spc_reports_nontor-2021-08-05.parquet, spc_reports_nontor-2022-06-28.parquet, spc_reports_nontor-2022-09-02.parquet, spc_reports_nontor-2022-09-07.parquet, spc_reports_nontor-2022-12-23.parquet, spc_reports_nontor-2023-09-04.parquet, spc_reports_nontor-2024-01-11.parquet, spc_reports_nontor-2024-03-30.parquet, spc_reports_nontor-2024-04-20.parquet, spc_reports_nontor-2024-10-06.parquet, spc_reports_nontor-2024-10-24.parquet, spc_scan_raw.json, spots_clean_nontor-2021-04-05.parquet, spots_clean_nontor-2021-04-13.parquet, spots_clean_nontor-2021-08-05.parquet, spots_clean_nontor-2022-06-28.parquet, spots_clean_nontor-2022-09-02.parquet, spots_clean_nontor-2022-09-07.parquet, spots_clean_nontor-2022-12-23.parquet, spots_clean_nontor-2023-09-04.parquet, spots_clean_nontor-2024-01-11.parquet, spots_clean_nontor-2024-03-30.parquet, spots_clean_nontor-2024-04-20.parquet, spots_clean_nontor-2024-10-06.parquet, spots_clean_nontor-2024-10-24.parquet, storm_test_nontor-2021-04-05.json, storm_test_nontor-2021-04-13.json, storm_test_nontor-2021-08-05.json, storm_test_nontor-2022-06-28.json, storm_test_nontor-2022-09-02.json, storm_test_nontor-2022-09-07.json, storm_test_nontor-2022-12-23.json, storm_test_nontor-2023-09-04.json, storm_test_nontor-2024-01-11.json, storm_test_nontor-2024-03-30.json, storm_test_nontor-2024-04-20.json, storm_test_nontor-2024-10-06.json, storm_test_nontor-2024-10-24.json, v5_verdict.json

Scripts: 01_select_events.py, 02_reselect_relaxed.py, 03_pull_wspr_spc.py, 04_analyze.py, 05_figures.py, analyze.py, extract.py

← Back to Data Lab
Live Feed