Equilibrium Labs Docs
v0.1
Changelog GitHub
Menu

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:

PYTHON
from equilibrium import synthetic

report = synthetic.fit_report("household_panel", version="<version>")
report.max_deviation

A 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