Raw ECMWF (no correction)
raw | baseline | x' = x (the uncorrected model; baseline, not a candidate) | yes | no | — | Johnson et al. 2019 |
Linear Scaling
ls | scaling | x' = x * mu_obs / mu_model (multiplicative mean correction; ratio 1 where mu_model < 0.1 mm) | yes | no | {"min_model_mean":0.1} | Lenderink et al. 2007, Teutschbein & Seibert 2012 |
Mean-Variance Scaling (operational)
mvs | scaling | x' = max(0, mu_obs + r (x - mu_model)), r = clip(sd_obs/sd_model, 0.5, 2); r = 1 if sd_model < 1 mm | yes | no | {"ratio_bounds":[0.5,2],"min_model_sd":1} | Torralba et al. 2017, Manzanas et al. 2019 |
Variance Scaling (unbounded)
vs | scaling | Same algebra and the same r = 1 fallback (sd_model < 1 mm) as MVS, without the 0.5-2 ratio limits | yes | no | {"ratio_bounds":null,"min_model_sd":1} | Teutschbein & Seibert 2012 |
Square-root-space Mean-Variance Scaling
sqrt_mvs | scaling | MVS applied to sqrt(x) (r limits 0.5-2; r = 1 if the sqrt-space sd < 0.1), clipped at 0 and squared back (docs/36) | yes | no | {"ratio_bounds":[0.5,2],"min_model_sd":0.1,"space":"sqrt"} | Manzanas et al. 2019 |
Power Transformation
pt | scaling | x' = a x^b: b (0.1-3) matches the coefficient of variation where reachable (bound hits reported), a the mean | yes | no | {"b_bounds":[0.1,3]} | Leander & Buishand 2007, Teutschbein & Seibert 2012 |
Delta Change
dc | change-preserving | Training-year CHIRPS totals times a = forecast ensemble mean / model mean (a in 0.2-5): historical scenarios, not corrected members | no (one value per training year) | yes | {"ratio_bounds":[0.2,5],"min_model_mean":0.1} | Hay et al. 2000, Teutschbein & Seibert 2012 |
Local Intensity Scaling
loci | scaling | Model threshold with the observed frequency of totals above 1 mm, then intensity scaling above it (designed for daily rainfall; here monthly or seasonal totals) | yes | no | {"wet_threshold":1} | Schmidli et al. 2006 |
Empirical Quantile Mapping
eqm | quantile mapping | x' = Q_obs(F_model(x)) with the dry policy; constant-ratio extrapolation outside the training range | yes | no | {"extrapolation":"constant_ratio","wet_threshold":1} | Boé et al. 2007, Themeßl et al. 2011, Gudmundsson et al. 2012 |
Gamma Quantile Mapping
gqm | quantile mapping | x' = G_obs^-1(G_model(x)), G = dry mass (<= 1 mm) + gamma by weighted maximum likelihood, with the dry policy; linear scaling where fewer than 3 wet values | yes | no | {"wet_threshold":1} | Piani et al. 2010 |
Detrended Quantile Mapping
dqm | change-preserving | a * EQM(x / a), a = forecast ensemble mean / model mean (0.2-5): removes and reapplies the bounded ratio; exact preservation of the final mean anomaly is not guaranteed | yes | yes | {"extrapolation":"constant_ratio","ratio_bounds":[0.2,5],"min_model_mean":0.1,"wet_threshold":1} | Cannon et al. 2015 |
Quantile Delta Mapping
qdm | change-preserving | x' = Q_obs(tau) * x / Q_model(tau), tau = rank of x in the forecast ensemble; change capped at 5 and replaced by Q_obs(tau) where Q_model(tau) <= 1 mm (both reported), so preservation is partial there | yes | yes | {"max_ratio":5,"wet_threshold":1} | Cannon et al. 2015 |
Scaled Distribution Mapping
sdm | change-preserving | Switanek et al. (2017) precipitation steps 1-7: gamma fits, recurrence intervals interpolated to the forecast's length, scaled CDF, rain-member count; model climatology with equal-year weights | yes | yes | {"wet_threshold":1} | Switanek et al. 2017 |
CDF-transform
cdft | change-preserving | F_obs,f = F_obs(F_model^-1(F_forecast)); x' = F_obs,f^-1(F_forecast(x)); implementation choices: model and forecast first scaled to the CHIRPS mean, values stay within the scaled forecast range | yes | yes | {"min_model_mean":0.1} | Michelangeli et al. 2009, Vrac et al. 2012 |
MVS with all-zero guard (variant)
mvs_zero_guard | variant | Operational MVS, but corrected totals are 0 mm where every training year has exactly 0 mm (a documented modelling choice, not a physical rule) | yes | no | {"ratio_bounds":[0.5,2],"min_model_sd":1,"zero_guard":true} | Torralba et al. 2017, Manzanas et al. 2019 |