← Buffalo dashboard

The wave tracker's math

When a surge crests at one gauge, these are the actual equations — coefficients and all — that predict its size and arrival downstream. Fit on every measured wave since December 2014, validated leave-one-year-out (each year predicted by a model that never saw it). Nothing here is hidden: transparency on public safety builds trust.

The lifecycle of a tracked wave

The moment a gauge starts a qualifying rise (25% and 30 cfs over its recent low), a provisional wave launches: the running peak is treated as a floor and the forecast grows with the river. When the gauge crests (drops back 8% from its peak), the wave is confirmed: inputs freeze, and the arrival window is pinned to the actual crest time. The prediction then lives until the water arrives downstream — it never disappears just because the upstream gauge started falling.

The equations

Boxley → Ponca

ln(crest at Ponca) = 0.855 + +0.861×logU + +0.116×logB

logU = the upstream crest (log); logB = this gauge's flow when the upstream rise began (log).

Band shown to users: ×0.84 to ×1.17 of the median (the middle half of out-of-sample errors); fit on 246 launches, median error 12.4% on waves ≥1,000 cfs.

Wave size at BoxleyTravel time to Ponca
0–1,000 cfs0.5–2.2 h (median 1.2)
1,000–∞ cfs0.5–1.2 h (median 0.8)

Ponca → Pruitt

ln(crest at Pruitt) = 0.132 + +0.895×logU + +0.098×logB + +0.095×rint + +0.190×ratio

logU = the upstream crest (log); logB = this gauge's flow when the upstream rise began (log); rint = rain over the drainage between the two gauges (inches, storm max); ratio = how the storm's rain was split — in-between rain ÷ upstream rain.

Band shown to users: ×0.86 to ×1.15 of the median (the middle half of out-of-sample errors); fit on 296 launches, median error 12.0% on waves ≥1,000 cfs.

Wave size at PoncaTravel time to Pruitt
0–1,000 cfs6.7–9.9 h (median 8.2)
1,000–5,000 cfs4.8–6 h (median 5.2)
5,000–∞ cfs4.8–5.5 h (median 5)

Pruitt → St. Joe

ln(crest at St. Joe) = 1.045 + +0.654×logU + +0.163×logB + +0.109×rint + +0.210×ratio + +0.183×ltrib

logU = the upstream crest (log); logB = this gauge's flow when the upstream rise began (log); rint = rain over the drainage between the two gauges (inches, storm max); ratio = how the storm's rain was split — in-between rain ÷ upstream rain; ltrib = the tributary gauge's recent flow (log; Richland or Bear Creek).

Band shown to users: ×0.82 to ×1.16 of the median (the middle half of out-of-sample errors); fit on 302 launches, median error 14.5% on waves ≥1,000 cfs.

Wave size at PruittTravel time to St. Joe
0–1,000 cfs6.3–19.2 h (median 12.9)
1,000–5,000 cfs5.2–11 h (median 8.5)
5,000–∞ cfs6.7–9.5 h (median 8.1)

St. Joe → Harriet

ln(crest at Harriet) = 0.722 + +0.826×logU + +0.055×logB + +0.115×rint + -0.017×ante + +0.061×ltrib

logU = the upstream crest (log); logB = this gauge's flow when the upstream rise began (log); rint = rain over the drainage between the two gauges (inches, storm max); ante = pre-storm 7-day rain over the in-between drainage (inches); ltrib = the tributary gauge's recent flow (log; Richland or Bear Creek).

Band shown to users: ×0.92 to ×1.06 of the median (the middle half of out-of-sample errors); fit on 319 launches, median error 6.3% on waves ≥1,000 cfs.

Wave size at St. JoeTravel time to Harriet
0–1,000 cfs10.9–14.1 h (median 12.8)
1,000–5,000 cfs5.5–8.2 h (median 6.5)
5,000–∞ cfs4.8–6 h (median 5.5)

Ponca → St. Joe (skip reach — the early-warning path)

ln(crest at St. Joe) = 1.241 + +0.602×logU + +0.207×logB + +0.171×rint + -0.027×ante + +0.218×ltrib

logU = the upstream crest (log); logB = this gauge's flow when the upstream rise began (log); rint = rain over the drainage between the two gauges (inches, storm max); ante = pre-storm 7-day rain over the in-between drainage (inches); ltrib = the tributary gauge's recent flow (log; Richland or Bear Creek).

Band shown to users: ×0.81 to ×1.24 of the median (the middle half of out-of-sample errors); fit on 296 launches, median error 20.7% on waves ≥1,000 cfs.

Wave size at PoncaTravel time to St. Joe
0–1,000 cfs10.3–25.2 h (median 18.2)
1,000–5,000 cfs10.2–16.6 h (median 14)
5,000–∞ cfs10.4–15.5 h (median 13.5)

Pruitt → Harriet (skip reach — the early-warning path)

ln(crest at Harriet) = 1.266 + +0.596×logU + +0.183×logB + +0.147×rint + +0.296×ratio + +0.190×ltrib

logU = the upstream crest (log); logB = this gauge's flow when the upstream rise began (log); rint = rain over the drainage between the two gauges (inches, storm max); ratio = how the storm's rain was split — in-between rain ÷ upstream rain; ltrib = the tributary gauge's recent flow (log; Richland or Bear Creek).

Band shown to users: ×0.83 to ×1.18 of the median (the middle half of out-of-sample errors); fit on 302 launches, median error 15.9% on waves ≥1,000 cfs.

Wave size at PruittTravel time to Harriet
0–1,000 cfs10.3–28.9 h (median 19.8)
1,000–5,000 cfs10.2–17.6 h (median 14)
5,000–∞ cfs11.8–15.5 h (median 13.3)

Alerts and self-correction

A watch fires when the median prediction reaches 60% of the destination gauge's flood threshold; a warning only when even the cautious low end of the band floods. And the tracker corrects itself: as the wave passes each gauge it is re-observed, and the freshest observation replaces the older, longer-range estimate. On 2026-06-22, the long-range model over-called St. Joe at ~14,000 cfs from Pruitt's crest; when the wave actually reached St. Joe at 7,890, Harriet's forecast snapped to ~8,300 against an actual 6,870.

Known limit: a wave riding onto bone-dry ground from upper-basin-only rain (roughly once a decade) over-predicts about 2× until re-observation corrects it — we chose not to tune the equations to a single event.

Every number on this page is generated from the deployed model files and an 11½-year hourly replay (2014-12 → 2026-06, baseline v6). Generated 2026-07-02T22:57:24+00:00. Experimental — never rely on a single number for safety decisions.