calibration
Define the Calibration class
Classes
| Name | Description |
|---|---|
| Calibration | A class to handle calibration of FPsim objects. Uses the Optuna hyperparameter |
Calibration
calibration.Calibration(
pars,
calib_pars=None,
weights=None,
fit_exposure_age=True,
fit_exposure_parity=True,
fit_spacing_pref=True,
smoothness_weight=0.5,
exposure_age_bounds=None,
exposure_parity_bounds=None,
burn_in=0,
verbose=True,
keep_db=False,
**kwargs,
)A class to handle calibration of FPsim objects. Uses the Optuna hyperparameter optimization library (optuna.org).
Supports calibration of scalar parameters (e.g. exposure_factor, prob_use_intercept, prob_use_trend_par, fecundity bounds) as well as the exposure_age curve — a 13-knot age-specific exposure multiplier fitted with a smoothness penalty to prevent sharp jumps between adjacent knots.
During calibration, the location’s make_calib_pars() is temporarily neutralized so that the optimizer’s trial values take effect instead of being overridden by the location’s existing calibrated parameters.
Note: running a calibration does not guarantee a good fit! You must ensure that you run for a sufficient number of iterations, have enough free parameters, and that the parameters have wide enough bounds. for more information.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| pars (dict) | simulation parameters, should include ‘location’ and ‘n_agents’ | required | |
| calib_pars (dict) | scalar parameters to calibrate, format dict(key=[best, low, high]) | required | |
| weights (dict) | a custom dictionary of weights for each calibration target | required | |
| fit_exposure_age (bool) | whether to calibrate the exposure_age curve (default: True) | required | |
| smoothness_weight (float) | weight of the smoothness penalty for exposure_age (default: 0.5) | required | |
| exposure_age_bounds (dict) | custom bounds per knot age, format {age: (low, high)} (default: EXPOSURE_AGE_BOUNDS) | required | |
| burn_in (int) | number of years from start_year to ignore when computing fit (default: 0) | required | |
| n_trials (int) | the number of trials per worker (default: 100) | required | |
| n_workers (int) | the number of parallel workers (default: maximum CPUs) | required | |
| total_trials (int) | if n_trials is not supplied, calculate by dividing this by n_workers | required | |
| name (str) | the name of the database (default: ‘fpsim_calibration’) | required | |
| db_name (str) | the name of the database file (default: ‘fpsim_calibration.db’) | required | |
| keep_db (bool) | whether to keep the database after calibration (default: false) | required | |
| storage (str) | the location of the database (default: sqlite) | required | |
| verbose (bool) | whether to print details of the calibration | required | |
| kwargs (dict) | additional Optuna configuration | required |
Returns
| Name | Type | Description |
|---|---|---|
| A Calibration object |
Examples::
# Calibrate scalar params + exposure_age curve
calib_pars = dict(
exposure_factor = [1.0, 0.5, 3.0],
prob_use_intercept = [-1.0, -3.0, 0.0],
prob_use_trend_par = [0.0, -0.15, 0.05],
fecundity_low = [0.7, 0.5, 0.9],
fecundity_high = [1.5, 1.0, 2.5],
)
weights = dict(mcpr=3, asfr=3, total_fertility_rate=3, age_first_stats=4)
calib = fp.Calibration(
pars=dict(location='senegal', n_agents=5000),
calib_pars=calib_pars,
weights=weights,
)
calib.calibrate()
# Scalar-only calibration (no exposure_age curve)
calib = fp.Calibration(pars=pars, calib_pars=calib_pars,
weights=weights, fit_exposure_age=False)
calib.calibrate()
Methods
| Name | Description |
|---|---|
| calibrate | Actually perform calibration. Neutralizes the location’s make_calib_pars(), |
| configure_optuna | Update Optuna configuration, if required |
| make_study | Make a study, deleting one if it already exists |
| parse_study | Parse the study into a data frame |
| plot_all | Plot every point: warning, very slow! |
| plot_best | Plot only the points with lowest mismatch |
| plot_stride | Plot a fixed number of points in order across the results |
| plot_trend | Plot the trend in best mismatch over time |
| remove_db | Remove the database file if keep_db is false and the path exists. |
| run_exp | Create and run an experiment |
| run_trial | Define the objective for Optuna. Suggests scalar parameters and optionally |
| run_workers | Run multiple workers in parallel |
| set_optuna_defaults | Create a (mutable) dictionary with default global settings |
| to_json | Convert the data to JSON |
| validate_pars | Ensure parameters are in the correct format. Two formats are permitted: |
| worker | Run a single worker |
calibrate
calibration.Calibration.calibrate(
calib_pars=None,
weights=None,
verbose=None,
**kwargs,
)Actually perform calibration. Neutralizes the location’s make_calib_pars(), runs Optuna optimization, reconstructs the exposure_age array if fitted, and restores the original make_calib_pars() when done.
configure_optuna
calibration.Calibration.configure_optuna(**kwargs)Update Optuna configuration, if required
make_study
calibration.Calibration.make_study()Make a study, deleting one if it already exists
parse_study
calibration.Calibration.parse_study()Parse the study into a data frame
plot_all
calibration.Calibration.plot_all()Plot every point: warning, very slow!
plot_best
calibration.Calibration.plot_best(best_thresh=2)Plot only the points with lowest mismatch
plot_stride
calibration.Calibration.plot_stride(npts=200)Plot a fixed number of points in order across the results
plot_trend
calibration.Calibration.plot_trend(best_thresh=2)Plot the trend in best mismatch over time
remove_db
calibration.Calibration.remove_db()Remove the database file if keep_db is false and the path exists.
run_exp
calibration.Calibration.run_exp(calib_pars, return_exp=False, **kwargs)Create and run an experiment
run_trial
calibration.Calibration.run_trial(trial)Define the objective for Optuna. Suggests scalar parameters and optionally exposure_age knots, exposure_parity knots, and spacing_pref suppression.
run_workers
calibration.Calibration.run_workers()Run multiple workers in parallel
set_optuna_defaults
calibration.Calibration.set_optuna_defaults()Create a (mutable) dictionary with default global settings
to_json
calibration.Calibration.to_json(filename=None)Convert the data to JSON
validate_pars
calibration.Calibration.validate_pars()Ensure parameters are in the correct format. Two formats are permitted: either a dict of arrays or lists in order best-low-high, e.g.::
calib_pars = dict(
exposure_factor = [1.0, 0.5, 1.5],
maternal_mortality_factor = [1, 0.75, 3.0],
)
Or the same thing, as a dict of dicts::
calib_pars = dict(
exposure_factor = dict(best=1.0, low=0.5, high=1.5),
maternal_mortality_factor = dict(best=1, low=0.75, high=3.0),
)
worker
calibration.Calibration.worker()Run a single worker