Stage 1 · Snow-17 · complete

Snow-17 over all of CONUS, learned by backpropagation

A fully differentiable Snow-17 calibrated cell-by-cell against SNODAS snow-water-equivalent across the contiguous US at 0.1°, over 15 water years (2010–2024), driven by ERA5-Land. Parameters are learned by Adam / BPTT — then made physically reasonable with a literature prior, at almost no accuracy cost. This page documents the result, how good it is, and exactly how it was built.

58,265snow cells @ 0.1°
0.61median test-KGE (snowpack)
WY2010–2415-yr record
r 0.71–0.92timing skill by region

Headline

One differentiable model, one 15-year record, one continental parameter field — with an honest read on where it works and why.

What it is

A per-cell Snow-17 parameter set (9 params) that reproduces SNODAS SWE, learned by gradient descent rather than SCE-UA/DREAM. Grid-independent, so it scales toward a global product.

How good

Timing is captured everywhere (r 0.71–0.92). Continental regions reach business-grade skill (KGE 0.60–0.73). The residual is bias, concentrated in maritime deep snow.

Key idea

SWE-only data leaves the melt/retention parameters weakly identified. A physical prior regularizes them to literature values — reasonable and accurate.

Accuracy by region

Evaluated on a held-out temporal test period (last third of the record), over seasonal-snowpack cells (peak SWE ≥ 100 mm). KGE is decomposed into r (timing), α (variability ratio), β (mean/bias ratio).

RegionKGEr (r²)αβ (bias)read
Great Lakes / Upper Midwest0.690.91 (0.82)0.830.85strongest — cold, lake-effect
Northeast / Appalachia0.680.86 (0.73)0.980.91near-unbiased
Mid / South Rockies0.600.83 (0.69)0.991.04best mountains (β≈1)
North Rockies0.600.82 (0.68)0.970.86good
Southwest high0.470.77 (0.60)0.920.91small sample
Wasatch / Great Basin0.410.77 (0.59)1.041.26over-sim, desert margin
Sierra Nevada0.430.76 (0.58)0.810.84hard — maritime deep snow
Cascades0.280.68 (0.47)0.900.73hardest — undercatch
Read: the model gets the accumulation–melt timing right almost everywhere (high r). What varies is bias (β): continental basins sit at β≈0.85–1.05; maritime deep-snow basins under-simulate (β 0.73–0.84). The ceiling is not the calibration — it is forcing/truth representativeness in maritime terrain.
Per-region accuracy: KGE bar chart, sim-vs-obs scatter, region-mean SWE time series
(A) median test-KGE by region; (B/C) sim-vs-SNODAS SWE density scatter; (D) region-mean SWE, observed vs simulated (grey band = temporal test period).
Final CONUS maps of test-KGE and key Snow-17 parameters
Final CONUS product: test-KGE over the seasonal snowpack, plus the calibrated SCF, PXTEMP, MFMAX, MFMIN fields and the applied temperature correction.

Why calibrate at all — default vs learned parameters

Snow-17 ships with Anderson's classic default parameters (MFMAX 1.4, MFMIN 0.3, SCF 1.1, PXTEMP 1.0, …). A fair head-to-head: identical forcing (including the temperature correction), identical model — only the parameters differ.

Regionper-cell median KGE — defaultper-cell median KGE — calibratedΔ
Northeast / Appalachia−0.12+0.83+0.95
Great Lakes / Upper Midwest+0.15+0.79+0.64
Mid / South Rockies+0.10+0.63+0.53
North Rockies+0.14+0.62+0.48
Southwest high+0.19+0.58+0.39
Cascades−0.12+0.49+0.61
Wasatch / Great Basin−0.74+0.48+1.22
Sierra Nevada−0.13+0.45+0.58
Read: with one nationwide default parameter set, half the regions score negative per-cell KGE — worse than predicting the mean seasonal cycle. Backprop calibration lifts every region to +0.45…+0.83 (average gain ≈ +0.6 KGE). Region-mean SWE is more forgiving of defaults (continental dry-snow regions average out to KGE 0.77–0.89 even uncalibrated), but grid-cell-level skill — what a distributed model is for — requires calibration.
Default vs calibrated Snow-17: time series and per-cell KGE bars
Top: region-mean SWE for four regions — SNODAS observations (blue fill), Snow-17 with default parameters (grey dashed; peaks too high, melt-out too late), and backprop-calibrated (red). Bottom: per-cell median KGE by region, default vs calibrated.

Where the regions are, and how each tracks the truth

First: the eight assessment regions on the map. Then, for each region, the region-mean SWE — observed (SNODAS) vs simulated (Snow-17) — split into the training years and the held-out test years, side by side.

Map of the eight assessment regions over CONUS
The eight regions, drawn over SNODAS peak-SWE shading (darker = deeper snow). Boxes are the exact bounding boxes used for every number on this page.
Two different KGE numbers — both honest. The region table above reports the per-cell median KGE (how a typical single cell does — harder, includes per-cell noise). The time-series below report the region-mean KGE (how the aggregated regional snowpack does — noise averages out, so these are higher: 0.54–0.95). Aggregate skill is what matters for basin water supply; per-cell skill is what matters for spatial detail.

Per-region time series — train vs test (split at 2019-12-29)

Northeast SWE train vs test
Northeast / Appalachia — region-mean KGE train 0.90 · test 0.94.
Great Lakes SWE train vs test
Great Lakes / Upper Midwest — KGE train 0.87 · test 0.83.
Mid/S Rockies SWE train vs test
Mid / South Rockies — KGE train 0.80 · test 0.95.
Wasatch SWE train vs test
Wasatch / Great Basin — KGE train 0.86 · test 0.92 (note the mild over-simulation of peaks).
N Rockies SWE train vs test
North Rockies — KGE train 0.71 · test 0.80.
Southwest high SWE train vs test
Southwest high — KGE train 0.76 · test 0.73.
Sierra SWE train vs test
Sierra Nevada — KGE train 0.60 · test 0.73; peaks slightly under-simulated (maritime deep snow).
Cascades SWE train vs test
Cascades — KGE train 0.60 · test 0.54; the hardest region (under-catch + sub-grid orography).

How to read these numbers

Is r² = 0.9 good? For SWE, not by itself. Here is why we lead with KGE.

r² / r — necessary, not sufficient

SWE has a huge, smooth seasonal cycle (0 → peak → 0 each year). Any model that tracks that cycle scores r ≈ 0.8–0.9 automatically. So high r² only confirms timing; it says nothing about whether peak magnitude or total volume is right, and it does not penalize bias.

KGE — the honest metric

KGE = 1 − √[ (r−1)² + (α−1)² + (β−1)² ]

Requires timing (r), the right amplitude (α = σsimobs), and the right mean (β = μsimobs). Cascades has r = 0.68 but KGE only 0.28 — because β = 0.73 (27% under-bias). r² would hide that; KGE surfaces it.

Benchmarks

KGEmeaning
1.00perfect
≥ 0.75good
0.50 – 0.75acceptable / behavioural
> −0.41beats the mean-of-observations benchmark (the true "zero line", not 0)

For a globally-transferable 0.1° product with no per-station tuning, driven by global reanalysis and validated out-of-time, continental KGE 0.6–0.73 with r 0.8–0.92 is a solid, competitive result.

Methods — accurate and reasonable parameters

The order of operations: verify the forcing, diagnose why parameters rail at their bounds, then regularize — not swap inputs blindly.

1 · The forcing is already good

2 · Why parameters railed — a weak-identifiability test

In the baseline fit, MFMAX/MFMIN pinned at their upper bounds and PLWHC at its lower bound. We widened the bounds drastically (MFMAX→5, MFMIN→1.5, SCF→0.4). Result: test-KGE moved only +0.05–0.10 while the parameters ran to the new extremes. Conclusion: the melt/retention parameters are weakly identified under an SWE-only loss — the likelihood surface is flat, so they drift to whatever bound they are given. The bounds were never the limit.

3 · The fix — a physical prior (Tikhonov / MAP)

Where the data cannot constrain a parameter, inject domain knowledge. We add an L2 penalty pulling the weakly-identified parameters toward literature-central values, in normalized units:

L = Ldata(SWE) + 2·Lspatial(smoothness) + λ · Σk mean[ ((θk − targetk)/(hik−lok))² ]
Honesty note: the prior target is the empirical operational value from decades of Snow-17 studies, not a physical law and not the midpoint of the range. It is justified because (a) the parameters are provably weakly identified and (b) the forcing is bias-free, so little compensation is being erased. Under biased forcing this prior would not be appropriate.
Baseline vs physical-prior parameter maps
Baseline (left) vs physical-prior λ=200 (right). MFMAX/MFMIN move from saturated bounds to physical values while keeping spatial structure; TIPM tile-seam artifacts vanish; SCF (data-driven) is unchanged.

4 · Precipitation swap — tested, low yield here

Would a "better" precip product fix the maritime bias? Evidence says no: Sierra ERA5 precip is already ~right (0.96× SNOTEL) yet SWE is under-biased with SCF < 1 (the model is shedding precip, not starved of it). SCF is itself a free per-cell precip scaler, so uniform amount errors are already absorbed — the Rockies undercatch 23% yet sit at β≈1. The residual maritime bias looks like sub-grid orographic representativeness and rain/snow partition, which a precip swap cannot resolve. (IMERG was unusable — the CONUS cube was 98.6% NaN; MSWEP needs manual download.)

Parameters, ranges & priors

The nine Snow-17 parameters, their search ranges, and the prior target (literature-central value) where one is applied.

ParamMeaningRangePrior targetRegularized?Identifiable?
scfprecip / snow correction (undercatch)0.7–1.6/2.5NoYes (strong)
pxtemprain/snow threshold temperature−1–3 °CNoYes
mfmaxmax melt factor (Jun 21)0.5–2.51.2YesWeak
mfminmin melt factor (Dec 21)0.05–0.50.20YesWeak
tipmantecedent temperature index weight0.1–1.00.20YesWeak
nmfmax negative (refreeze) melt factor0.05–0.50.15YesWeak
plwhcliquid-water holding capacity0.02–0.30.04YesWeak
uadjwind / rain-on-snow melt factor0.03–0.190.08YesVery weak
mbasebase melt temperaturefixed 00.0fixed

Technical setup (as run)

Inputs / outputs

TruthSNODAS SWE (NSIDC G02158), ~8-daily, aggregated to 0.1°
ForcingERA5-Land daily T2m + total precip; per-cell temperature correction from SNOTEL bias
ElevationSRTM aggregated to 0.1° (atmospheric pressure term)
Output9 parameter maps + test-KGE + warming + masks → snow17_conus_era5.nc (250×585)

Domain / time / training

GridCONUS 0.1° · 585×250 · 58,265 snow cells
PeriodWY2010-10-01 → 2024-09-30 (15 yr, 5,114 daily steps)
Train / testtemporal holdout — first 66% train, last 34% test
OptimizerAdam + BPTT, two-stage (regional → per-cell), spatial reg λ=2, physical prior λ=200
Computetiled 2.5° · 46 parallel CPU workers · ~2.5 h
Validation is threefold: temporal SNODAS holdout (reported above), snowpack-stratified skill (peak≥100 mm), and independent SNOTEL ground stations held out of the loss.

Limitations & next

Known limits

  • Maritime deep snow (Sierra/Cascades) under-simulates — sub-grid orography + rain/snow partition, not a tuning gap.
  • Melt-out timing vs MODIS fSCA disagrees by ~2 weeks — a real SNODAS/fSCA tension, deferred (needs denser fSCA + more years).
  • Eastern temperature correction is zero (no SNOTEL east); GHCN/COOP would extend it.
  • Prior targets are empirical, not physical law — appropriate only because the forcing is bias-free.

What's next

  • Stage 2 — water balance: port the CREST runoff kernel to a differentiable form, verified against the EF5 C++, then calibrate to basin runoff.
  • Optional: PRISM orographic precip for maritime; GHCN east correction.
  • Global roll-out using the regional-stage parameters + prior as warm-start.