Synthetic data
Calibration targets
A calibration target is a versioned set of real-world statistics — moments — that a generator’s output is fit to reproduce. It is not the raw source data itself; it is a summary of that data (deciles, shares, cross-tabulations) plus enough metadata to know exactly which release of which dataset it was computed from.
What’s in a target
For household_panel, the current target (eu-silc-2023-v2) includes income deciles by household type, the household size distribution, employment status shares by region, and a small set of cross-tabulations (household size by income decile, employment status by region) used to preserve realistic correlation structure rather than just marginal distributions. A target is a fixed artifact: eu-silc-2023-v2 will never change under your feet — a new release of the underlying survey produces eu-silc-2024-v1, not a silent update to v2.
Where targets come from
Calibration targets are built from public statistical releases, primarily:
- EU-SILC (EU Statistics on Income and Living Conditions) — household and person-level moments on income, poverty, and living conditions
- Eurostat aggregate tables — regional GDP, unemployment rates, and other national-accounts figures used to cross-check generator output at a coarser level than EU-SILC alone supports
Each target’s changelog entry records the source release, the retrieval date, and the transformation applied to go from raw tabulations to the moments a generator is calibrated against. This chain is also recorded per-run in the provenance manifest.
Measuring fit
Every generator release ships a fit report comparing synthetic sample moments against the calibration target, moment by moment — decile shares, distribution shares, and each cross-tabulation are checked individually and the maximum deviation recorded. Cross-tabulations are reported separately from marginal distributions since they’re harder to hit exactly.
Fit is reported, not asserted. If you need fit numbers for a specific generator version, run:
from equilibrium import synthetic
report = synthetic.fit_report("household_panel", version="<version>")
report.max_deviationA generator that regresses on fit between releases gets flagged in the changelog rather than shipped silently — calibration quality is treated as a tracked property of the release, not a one-time claim.
View source on GitHub