pangeo-data / scikit-downscale

Statistical climate downscaling in Python
https://scikit-downscale.readthedocs.io/en/latest/
Apache License 2.0
185 stars 47 forks source link

Add Quantile Delta Mapping (QDM) bias correction method #48

Open dgergel opened 4 years ago

dgergel commented 4 years ago

The QDM bias correction method, developed by Alex Cannon (see Cannon et al 2015) preserves relative changes in quantiles by applying simulated relative changes in quantiles on top of observed historical series. It has three basic steps:

  1. detrend future model outputs by quantile
  2. bias correct to obs by quantile mapping
  3. superimpose model-projected relative changes in quantiles on bias corrected model output

It is also the first step in the Multivariate Bias Correction (MBC) methods (e.g. MBCp, MBCr and MBCn).

cc @kemccusker

dgergel commented 4 years ago

I've been putting some thought into how best to implement QDM in scikit-downscale - which I'm hoping to do over the next few weeks - and it would be great to get your two cents on this, @jhamman!

What I'm roughly envisioning is updating the BcsdBase class to be something like QMBase and then have subclasses for each QM-based bias correction method, e.g. BCSD, QDM, etc. So whatever isn't specific to BCSD and a more general characteristic of QM techniques can be part of the base class. A few things in this category would include the obs climatology pieces and perhaps also fitting quantile mappers though some of that might be method-specific.

I'm also thinking it probably makes more sense not to have specific temperature and precipitation subclasses but to absorb the temperature and precip-specific functionality into the method subclass, or some sort of wrapper function that would account for method differences, considering that we'll want to add functionality for bias correcting other variables as well.

jhamman commented 4 years ago

@dgergel - +1 on adding these methods. I've been also working on some quantile methods here (#42). More importantly though, I think we should discuss #49 before you get too far along as the API changes I'm proposing may fundamentally change the development path for these methods.