.. _calibration:
Calibration
===========
Calibration/analysis using SPOTPY
---------------------------------
The calibration and sensitivity analyses are performed by the
`SPOTPY package `_.
The links to SPOTPY are provided by hydrobricks so that it can be used directly.
As we might not want to calibrate all parameters, those that can change have to
be specified in the ``parameters`` instance (see :ref:`parameters `):
.. code-block:: python
parameters.allow_changing = ['a_snow', 'k_quick', 'A', 'k_slow_1', 'percol',
'k_slow_2', 'precip_corr_factor']
Then, an instance of the SPOTPY setup can be created by providing the
:ref:`model instance `, the :ref:`parameters `, the
:ref:`forcing `, the observation time series, a warmup duration (period
that will not be used for the evaluation; in days), and the objective function to use:
.. code-block:: python
spot_setup = hb.SpotpySetup(socont, parameters, forcing, obs, warmup=365,
obj_func='mse')
SPOTPY only maximizes the metric value.
Thus, when the metric needs to be minimized, we need to invert the objective function:
.. code-block:: python
spot_setup = hb.SpotpySetup(socont, parameters, forcing, obs, warmup=365,
obj_func='kge_2012', invert_obj_func=True)
Once the setup defined, one can use any
`SPOTPY algorithm `_.
For example, an optimization using the SCE-UA algorithm can be performed:
.. code-block:: python
# Select number of maximum repetitions and run spotpy
sampler = spotpy.algorithms.sceua(spot_setup, dbname='socont_SCEUA', dbformat='csv')
max_rep = 10000
sampler.sample(max_rep)
Similarly, a Monte-Carlo analysis can be performed:
.. code-block:: python
sampler = spotpy.algorithms.mc(spot_setup, dbname='socont_MC', dbformat='csv',
save_sim=False)
sampler.sample(10000)
Then, the SPOTPY results can be loaded for analysis:
.. code-block:: python
# Load the results
results = sampler.getdata()
# Plot parameter interaction
spotpy.analyser.plot_parameterInteraction(results)
plt.tight_layout()
plt.show()
# Plot posterior parameter distribution
posterior = spotpy.analyser.get_posterior(results, percentage=10)
spotpy.analyser.plot_parameterInteraction(posterior)
plt.tight_layout()
plt.show()
Prior distributions
-------------------
The default prior distribution is a uniform distribution in the range provided by the
min/max parameter values.
The prior distribution can be changed before the calibration/analysis using the
``set_prior()`` function on the ``parameters`` instance:
.. code-block:: python
parameters.set_prior('a_snow', spotpy.parameter.Normal(mean=4, stddev=2))
Prebuild parameter distribution functions provided by SPOTPY: Uniform, Normal,
logNormal, Chisquare, Exponential, Gamma, Wald, Weilbull.