Linear Scaling

Per-dekad multiplicative mean correction.

Linear Scaling is the simplest correction in the chain: multiply IMERG by a per-dekad, per-pixel factor that brings the long-term mean in line with CPC.

What it does

For each dekad \(d\) and each grid cell \((i, j)\), the LS factor is:

\[ k_{i,j,d} = \frac{\overline{P}^{CPC}_{i,j,d}}{\overline{P}^{IMERG}_{i,j,d}} \]

where \(\overline{P}\) is the long-term mean of all matching days in dekad \(d\). The corrected field is then \(P^{LS} = k \cdot P^{IMERG}\).

Because every value in a pixel is multiplied by the same factor, LS slides the whole distribution along the rainfall axis without changing its shape:

Figure 1: Linear Scaling on real Bali data (January dekad 1, land pixels). Every daily value is multiplied by one per-pixel factor (here a median of 1.15), so the distribution shifts but its shape is unchanged.

What it does not do

LS preserves the shape of the IMERG distribution. If IMERG mis-shapes the upper tail or underestimates light rain, LS will not fix that - it just scales whatever IMERG produced (the two histograms above have the same shape, only rescaled). The EQM stage is what reshapes the distribution to match the gauge - see EQM.

When LS is enough

For long-term climatologies and monthly aggregates over data-sparse regions, LS alone often performs comparably to more elaborate methods. Use it as a sanity check before adding complexity: if LS already produces acceptable seasonal cycles, the marginal value of EQM and DL may not justify the extra fit.

Implementation

src/bias_correction.py - the linear_scaling() function. Driven by the per-dekad call from notebooks/02_lseqmdl_bias_correction.ipynb.

Note

LS is computed on land cells only; the land/sea mask zeroes out ocean before the mean is taken.

Back to top