Catch patterns

What drives the catch

Cross-year analysis of catches, migration, weather and flow. Every finding tested with Benjamini-Hochberg FDR correction — only patterns that survive across the whole dataset are flagged as significant.

Snapshot
2026-05-30
Analyses
14
Statistical tests
104
Significant (BH-FDR)
40
P0

Predictions — what matters and where the next 30 days look strongest

Per-river RandomForest fit on weather + flow + season features + recency-weighted 30-day rolling-mean forecast.

Two views per river: a horizontal bar of feature importance (what the model explains the variance with) and a line chart of the next 30 days (expected catch rate, with the top 5 dates highlighted in emerald). R² values are reported honestly — most are slightly negative, which means catch rate is mostly noise at the fishery-day grain. Treat the bars as a directional signal, the dates as a "where to look first" hint, not a tip.

Byskeälven

Model R² = -0.30 · RMSE = 0.273 · trained on 564 days, held out 142.Note: R² < 0 means the model is barely better than predicting the mean.

What matters

Generated 2026-05-30 · regenerates Mon 04 UTC

Next 30 days

Generated 2026-05-30 · regenerates Mon 04 UTC

Kalixälven

Model R² = -0.31 · RMSE = 0.386 · trained on 132 days, held out 33.Note: R² < 0 means the model is barely better than predicting the mean.

What matters

Generated 2026-05-30 · regenerates Mon 04 UTC

Next 30 days

Generated 2026-05-30 · regenerates Mon 04 UTC

Lögdeälven

Model R² = -0.49 · RMSE = 0.225 · trained on 288 days, held out 73.Note: R² < 0 means the model is barely better than predicting the mean.

What matters

Generated 2026-05-30 · regenerates Mon 04 UTC

Next 30 days

Generated 2026-05-30 · regenerates Mon 04 UTC

Mörrumsån

Model R² = -0.15 · RMSE = 0.146 · trained on 423 days, held out 106.Note: R² < 0 means the model is barely better than predicting the mean.

What matters

Generated 2026-05-30 · regenerates Mon 04 UTC

Next 30 days

Generated 2026-05-30 · regenerates Mon 04 UTC

Ätran

Model R² = -0.02 · RMSE = 0.363 · trained on 1,102 days, held out 276.Note: R² < 0 means the model is barely better than predicting the mean.

What matters

Generated 2026-05-30 · regenerates Mon 04 UTC

Next 30 days

Generated 2026-05-30 · regenerates Mon 04 UTC
a01

Catch calendar (top 5 rivers)

0 of 5 tests significant(after BH-FDR α=0.05)

Top 5 rivers by total catches: Ätran (4137), Mörrumsån (2110), Byskeälven (1270), Kalixälven (328), Lögdeälven (184)

  • WhatWhen does each river peak across the season? Surfaces the seasonal timing pattern per river, year by year.
  • DataTop 5 rivers by total catches (Ätran, Mörrumsån, Byskeälven, Kalixälven, Lögdeälven). One row per year, columns are ISO weeks 14–39 — the salmon season window.
  • MethodPer (river × year × week), sum reported catches. Heatmap intensity scales against the per-river maximum so each river is comparable to itself across years.

Ätran

202120222023202420252026Apr 3May 1May 29Jun 26Jul 24Aug 21Sep 18Sep 25

Mörrumsån

202120222023202420252026Apr 3May 1May 29Jun 26Jul 24Aug 21Sep 18Sep 25

Byskeälven

202120222023202420252026Apr 3May 1May 29Jun 26Jul 24Aug 21Sep 18Sep 25

Kalixälven

2023202420252026Apr 3May 1May 29Jun 26Jul 24Aug 21Sep 18Sep 25

Lögdeälven

2023202420252026Apr 3May 1May 29Jun 26Jul 24Aug 21Sep 18Sep 25
Show metric table (5 tests)
Testr / Hp (raw)BH-FDRneffect
Ätran4,137descriptive
Mörrumsån2,110descriptive
Byskeälven1,270descriptive
Kalixälven328descriptive
Lögdeälven184descriptive
TakeawayA stripe that repeats across years is the river's natural peak. Gaps reveal off-years (low effort, poor conditions, or genuinely weak runs). Current year sits in the bottom row — compare it against the pattern above.
a02

Catch rate by temperature bucket

1 of 1 tests significant(after BH-FDR α=0.05)

Rows with temp + catch_rate present: 3,194 of 3,363

  • WhatDoes air temperature affect catch rate? Tests the classic "13–16 °C is optimal" finding from Severn studies on Swedish rivers.
  • Data3,175 fishery-days with both temperature and catch_rate. Buckets: cold / cool / optimal (13–16 °C) / warm / hot.
  • MethodBucket each day by daily mean air temperature, then compare catch_rate distributions across buckets with Kruskal-Wallis (non-parametric — catch_rate is a heavily skewed 0–1 ratio).
Show metric table (1 test)
Testr / Hp (raw)BH-FDRneffect
global (temp bucket Kruskal)69.9152.4e-143,194small
TakeawayThe "cold" bucket actually edges out "optimal" on this data (0.40 vs 0.37 mean catch_rate). Spring catches in cold water seem to outweigh the high-summer optimum. Effect is small but statistically real after FDR correction.
a03

Catch rate by flow regime

1 of 1 tests significant(after BH-FDR α=0.05)

Rows with flow_regime + catch_rate present: 1,110

  • WhatDoes the amount of water moving through a river predict catches? Tests the "sweet spot" hypothesis around normal flow.
  • Data1,092 fishery-days with paired flow regime + catch_rate. Each day classified by per-river flow percentiles (drought / low / normal / high / flood).
  • MethodPer-river flow percentiles avoid one big river dominating the buckets. Kruskal-Wallis tests whether catch_rate distributions differ across regimes.
Show metric table (1 test)
Testr / Hp (raw)BH-FDRneffect
global (flow regime Kruskal)13.7268.2e-31,110negligible
TakeawayFlood ranks slightly highest (0.31), drought lowest (0.24) — but the spread is narrow. Big water events seem to fire fishing days more reliably than dry spells. Effect is small in absolute terms but survives FDR.
a04

Pressure change (24 h) vs catch rate

0 of 4 tests significant(after BH-FDR α=0.05)

Rows with Δp_24h + catch_rate: 3,130

  • WhatThe folklore: pressure dropping = fish are biting. Test against real data per river.
  • Data3,111 fishery-days with 24-hour pressure change and catch_rate. Top 3 rivers shown individually plus global summary.
  • MethodPearson r between Δpressure_24h and catch_rate. 95% CI via Fisher z-transform. Each river tested independently — folklore could be local.
Show metric table (4 tests)
Testr / Hp (raw)BH-FDRneffect
global0.0029.2e-13,130negligible
Ätran0.0332.3e-11,312negligible
Byskeälven0.0127.4e-1686negligible
Mörrumsån-0.0039.5e-1459negligible
TakeawayGlobal signal: zero (r ≈ 0). Only Mörrumsån shows a weak rising-pressure → higher-catch link (r = +0.13, opposite to folklore). For the other rivers, the pressure-folklore is statistically indistinguishable from noise.
a05

Method (fly vs spin) × conditions

1 of 1 tests significant(after BH-FDR α=0.05)
  • WhatDo fly and spin anglers catch in different conditions? Tests whether method choice and weather are independent.
  • Data4,998 reported catches with both method and temperature recorded (fly: 4,005 / spin: 993). Fly is the dominant method.
  • MethodChi-square test of independence on the (method × temperature bucket) contingency table. Cramér's V scales the effect size.
Show metric table (1 test)
Testr / Hp (raw)BH-FDRneffect
method × temp bucket (chi-square)372.9791.9e-795,745medium
TakeawayDistribution genuinely differs (χ² = 277, p ≪ 0.001, V = 0.24 — medium effect). Both peak in "cool" but fly's share widens at warmer temperatures. Practical read: at warmer water choose fly; spin holds its share in cool/cold.
a06

Year-over-year catches (top 3 rivers)

0 of 3 tests significant(after BH-FDR α=0.05)
  • WhatWhere in the calendar does each river peak? Multi-year overlay shows whether peak timing is stable or drifts.
  • DataAll catches 2021–2026 for top 3 rivers (Ätran, Mörrumsån, Byskeälven). Each year drawn as a separate line.
  • MethodSum catches per day-of-year, smooth with a 7-day rolling mean to suppress noise. Display weeks 60–300 of the year (early March to late October) so off-season zeros don't flatten the curve.

Ätran YoY

Mörrumsån YoY

Byskeälven YoY

Show metric table (3 tests)
Testr / Hp (raw)BH-FDRneffect
Ätran YoY4,137descriptive
Mörrumsån YoY2,110descriptive
Byskeälven YoY1,270descriptive
TakeawayÄtran peaks ≈ Sep 20, Mörrumsån ≈ Sep 26, Byskeälven ≈ Aug 24. Lines bunch around these dates year after year — the river system, not weather, sets the calendar of when to be there.
a07

Migration vs catches (same day)

1 of 2 tests significant(after BH-FDR α=0.05)

Aggregated (river, day) rows: 1,191

  • WhatWhen a fish is counted at the migration camera, is it caught upstream the same day?
  • Data1,187 (river, day) pairs across Ätran and Byskeälven — the two rivers where camera and fishery data overlap.
  • MethodSpearman ρ (non-parametric, robust to outlier spike days) between same-day migration_count and caught_count totals per river.
Show metric table (2 tests)
Testr / Hp (raw)BH-FDRneffect
Byskeälven-0.0226.8e-1371negligible
Ätran0.2551.2e-13820small
TakeawayÄtran: moderate same-day link (ρ = +0.26 across 816 days). Byskeälven: effectively zero (ρ ≈ 0). Different river dynamics — Ätran is short, fish reach the fishery quickly; Byskeälven needs days (see a09 lag analysis).
a08

Drivers of migration (Spearman)

11 of 23 tests significant(after BH-FDR α=0.05)

Bars: green = positive ρ, red = negative. Annotation: *** p<0.001, ** p<0.01, * p<0.05, · n.s. Significance after BH-FDR correction is in findings.json.

  • WhatWhich environmental signals correlate with migration count? Ranks candidate drivers per river.
  • DataPer-river daily metrics × 12 candidate drivers (temperatures, flows, pressure, humidity, wind, clouds, precipitation, season position, moon phase). ~370–800 days per river.
  • MethodSpearman ρ between each driver and migration_count, computed independently per river. Bars sorted by |ρ| so the strongest signal sits at the top.

Byskeälven

Ätran

Show metric table (23 tests)
Testr / Hp (raw)BH-FDRneffect
Byskeälven: pressure-0.0453.9e-1371negligible
Byskeälven: precipitation0.0463.8e-1371negligible
Byskeälven: clouds-0.0463.7e-1371negligible
Byskeälven: flow (SMHI)0.0683.4e-1198negligible
Byskeälven: Δpressure 24h-0.0781.3e-1371negligible
Byskeälven: flow (camera)0.0908.3e-2371negligible
Byskeälven: humidity-0.0911.3e-1279negligible
Byskeälven: air temp (SMHI)0.1024.9e-2371small
Byskeälven: moon phase0.1582.3e-3371small
Byskeälven: wind speed-0.1671.3e-3371small
Byskeälven: water temp (camera)0.2722.1e-7352small
Byskeälven: season position-0.4433.0e-19371medium
Ätran: moon phase-0.0088.1e-1820negligible
Ätran: Δpressure 24h-0.0392.7e-1791negligible
Ätran: wind speed-0.0676.8e-2742negligible
Ätran: flow (camera)0.0928.8e-2342negligible
Ätran: clouds0.2313.2e-11803small
Ätran: humidity0.2533.8e-13803small
Ätran: pressure-0.3023.1e-18793medium
Ätran: precipitation0.3032.3e-17749medium
Ätran: season position0.3674.6e-27803medium
Ätran: water temp (camera)0.4112.1e-26615medium
Ätran: air temp (SMHI)0.4402.3e-39803medium
TakeawayStrongest drivers differ by river. Ätran: air temperature (ρ = +0.44) — warmer days = more fish. Byskeälven: season position (ρ = −0.44) — earlier in the run = more fish. No universal driver; build the local mental model per river you fish.
a09

Lag correlation: migration → catches

25 of 30 tests significant(after BH-FDR α=0.05)
  • WhatAfter a fish passes the camera, how many days before it reaches the fishery upstream? Cross-correlation by lag.
  • DataPer-river paired daily totals (migration upstream + catches downstream), lag tested 0–14 days.
  • MethodFor each lag N, compute Spearman ρ between today's catches and migration N days ago. Plot the curve.
Show metric table (30 tests)
Testr / Hp (raw)BH-FDRneffect
Byskeälven: lag 0d-0.0226.8e-1371
Byskeälven: lag 1d-0.0711.7e-1370
Byskeälven: lag 2d-0.0463.8e-1369
Byskeälven: lag 3d-0.1015.2e-2368
Byskeälven: lag 4d-0.1133.0e-2367
Byskeälven: lag 5d-0.1572.7e-3366
Byskeälven: lag 6d-0.1681.3e-3365
Byskeälven: lag 7d-0.1981.5e-4364
Byskeälven: lag 8d-0.2095.8e-5363
Byskeälven: lag 9d-0.2384.9e-6362
Byskeälven: lag 10d-0.2251.6e-5361
Byskeälven: lag 11d-0.2385.1e-6360
Byskeälven: lag 12d-0.2077.8e-5359
Byskeälven: lag 13d-0.2059.4e-5358
Byskeälven: lag 14d-0.2059.6e-5357
Ätran: lag 0d0.2551.2e-13820
Ätran: lag 1d0.2221.3e-10819
Ätran: lag 2d0.1932.8e-8818
Ätran: lag 3d0.1691.2e-6817
Ätran: lag 4d0.1869.0e-8816
Ätran: lag 5d0.2044.3e-9815
Ätran: lag 6d0.1869.3e-8814
Ätran: lag 7d0.1406.3e-5813
Ätran: lag 8d0.1178.1e-4812
Ätran: lag 9d0.1169.1e-4811
Ätran: lag 10d0.1014.0e-3810
Ätran: lag 11d0.0822.0e-2809
Ätran: lag 12d0.1224.9e-4808
Ätran: lag 13d0.0851.6e-2807
Ätran: lag 14d0.1131.4e-3806
TakeawayÄtran best lag = 0 (immediate translation, ρ = +0.26) — short river. Byskeälven best lag = 4 days (long-river delay). Practical: time your trip to follow the wave, don't just react to camera spikes.
a10

Seasonal totals YoY — migration vs catches

0 of 2 tests significant(after BH-FDR α=0.05)

Camera counts cover the whole calendar year while catch reports are season-skewed — totals are comparable per river over time but the absolute migration/catch ratio is not a literal 'catch share'.

  • WhatDo big-migration years coincide with big-catch years? Yearly totals comparison.
  • DataCamera totals vs catch totals per (river, year). 5–6 years per river — small-n by design.
  • MethodSpearman ρ on yearly totals. With ≤6 data points per river this is exploratory only — no robust statistical claim possible.

Byskeälven

Ätran

Show metric table (2 tests)
Testr / Hp (raw)BH-FDRneffect
Byskeälven-0.5003.9e-15small-sample
Ätran-0.2007.0e-16small-sample
TakeawayNo reliable co-movement at yearly scale on this data. Variance from in-season weather, angler effort, access changes — the migration-to-catch ratio is not a literal "share" so a "big year for the camera" doesn't guarantee a "big year for catches".
a11

Wind direction × catches per river

0 of 3 tests significant(after BH-FDR α=0.05)

Normalised by number of fishery-days per direction → corrects for wind prevalence bias. Proper head/tail/cross decomposition requires river flow orientation (geojson linestring) — deferred.

  • WhatDo specific wind directions correlate with productive days per river?
  • DataTop 3 rivers × 8 cardinal directions (N, NE, E, SE, S, SW, W, NW). Day-counts vary per direction per river.
  • MethodNormalise catches by number of fishery-days in each direction (corrects for the prevalence bias — a common wind direction would otherwise dominate). Kruskal-Wallis tests whether the per-direction distribution differs.
Show metric table (3 tests)
Testr / Hp (raw)BH-FDRneffect
Ätran (wind dir Kruskal)5.6735.8e-11,224negligible
Mörrumsån (wind dir Kruskal)3.3428.5e-1467negligible
Byskeälven (wind dir Kruskal)6.8584.4e-1670negligible
TakeawayÄtran tops on NW (4.9 fish per day vs SE 1.2 — 4× spread). Mörrumsån prefers SE; Byskeälven prefers N. None survives BH-FDR — likely too few day-direction combinations. Proper head/tail/cross-wind analysis would need per-river orientation data.
a12

Moon phase distribution (catches + migration)

0 of 5 tests significant(after BH-FDR α=0.05)

ephem.Moon.phase returns % illumination only — waxing and waning are not distinguished here. For tide-relevant analyses (Mörrum / Ätran estuaries) a full lunar-day model would be needed.

  • WhatDo lunar phases line up with catch peaks? Especially relevant for sea trout and estuarial salmon.
  • DataTop 4 rivers × moon phase buckets (new / waxing-waning / gibbous / full). ~150–1,400 fishery-days per river.
  • MethodSpearman ρ between moon illumination (0–1) and catch_rate per river. Grouped bar chart for mean catches per (river × phase).
Show metric table (5 tests)
Testr / Hp (raw)BH-FDRneffect
Ätran0.0039.2e-11,378negligible
Mörrumsån0.0542.1e-1529negligible
Byskeälven0.0551.4e-1706negligible
Kalixälven0.0029.8e-1165negligible
Moon phase × river (descriptive)8,067descriptive
TakeawayNo statistical signal on this data — all four rivers ρ ≈ 0, none survive BH-FDR. Moon-phase folklore mostly applies to tidal/brackish-water systems; freshwater catch rate doesn't track illumination. A proper tide-aware analysis would need lunar-day modelling beyond illumination.
a13

Precipitation as primary signal

0 of 12 tests significant(after BH-FDR α=0.05)

Buckets: dry/light/medium/heavy. Lag-1 tests the 'fresh-water push' hypothesis: yesterday's rain triggers an upstream run today.

  • WhatDoes rain trigger upstream runs? Test "fresh-water push" hypothesis — yesterday's rain → today's catch.
  • Data~150–1,250 fishery-days per river with 24-hour precipitation totals. Buckets: dry / light / medium / heavy.
  • MethodSpearman ρ on (precipitation vs catch_rate) at lag 0 (same day) and lag 1 (yesterday). Plus Kruskal-Wallis across rain buckets to check if heavy-rain days are systematically different.
Show metric table (12 tests)
Testr / Hp (raw)BH-FDRneffect
Ätran (same-day)0.0516.9e-21,254negligible
Ätran (1-day lag)0.0263.5e-11,254negligible
Mörrumsån (same-day)0.0582.1e-1464negligible
Mörrumsån (1-day lag)-0.0492.9e-1464negligible
Byskeälven (same-day)-0.0422.8e-1668negligible
Byskeälven (1-day lag)-0.0314.2e-1668negligible
Kalixälven (same-day)0.1545.2e-2159small
Kalixälven (1-day lag)0.1151.5e-1159small
Ätran (rain bucket Kruskal)8.1734.3e-21,257negligible
Mörrumsån (rain bucket Kruskal)2.2075.3e-1466negligible
Byskeälven (rain bucket Kruskal)2.6244.5e-1670negligible
Kalixälven (rain bucket Kruskal)5.9101.2e-1160small
TakeawayNo river survives BH-FDR. Kalixälven shows hint of same-day positive (ρ = +0.15, p ≈ 0.05 raw) — typical of upstream-river precipitation triggering runs. Effect inconsistent across rivers; what fires a fresh-water push on one stream may do nothing on another.