open-source population infrastructure

A nation is millions of households.
We build a synthetic one that stands in for them all.

populace is a stack for constructing weighted synthetic populations from public survey and administrative data — realistic enough to model tax and benefit policy for everyone, private by construction, and improved in the open.

every point above is a synthetic household · brightness ∝ survey weight

01 — the idea

The sampling frame, made executable.

Every population estimate rests on a frame: the list of units a sample is drawn from, and the weights that scale them back up to a country. In most pipelines that frame is implicit — scattered across data files, weight columns, and convention. When the convention breaks, the numbers break silently.

populace makes the frame a first-class datatype. Entity tables — people, households, tax units — with explicit links, typed weights that can never be silently zeroed, and a record of where every row came from. Imputation, calibration, and policy simulation are operators on that one object. The structure is built once and never re-derived.

02 — the stack

Six strategies, one frame.

Every strategy is an operator on the same weighted sampling frame, or a way of scoring what the operators did to it. Each has its own page — a 30-second explainer, the method, and a nested /paper as the stable citation target.

the support · the totals · the economy · the referee · the interactions · time

03 — the pipeline

How a release is built.

Every stage is an operator on one weighted frame, and the order is load-bearing: observations, then enrichment, then rules, then seeds, then simulation, then weights. Gates between stages make each hand-off refuse silently-broken inputs instead of passing them downstream. Solid edges ship today; dashed edges are the operator reorder tracked in populace#395.

Pipeline stage DAG: harmonize, clone, impute, assemble, derive, seed, materialize, calibrate, select and export, with release gates at the hand-offs. Harmonize sources asec · acs · puf · scf · sipp shared columns · universes PUF clone twins fused tax-detail twins on the asec spine today Cross-source imputations scf wealth · sipp tips on the asec spine today Assemble multispine spine tags: asec_puf · acs_2024_1yr mass allocation across spines ACS 2024 1-yr spine households · geography qrf transfer mass conservation Derivations disability rule · household structure Take-up seeds frame-level draws Materialization policyengine-us engine target measures Calibration gradient descent Selection / export hard concrete gates h5 + manifests calibration diagnostics parity · coverage contract the release registry shipped today roadmap (populace#395): clone + impute on the assembled multispine
Solid edges are the launch build: the PUF clone twins and the SCF/SIPP imputations run on the ASEC spine first, and the ACS spine receives that detail through the labeled QRF transfer at assembly. Dashed edges are the canonical ordering tracked in populace#395 — cloning and imputation as operators on the assembled frame — drawn as roadmap, not as shipped. Diamonds are release gates: mass conservation at assembly, calibration diagnostics after the fit, parity and the coverage contract on the export.
04 — an application, not a seventh strategy

The stack, put to work on a geography without its own file.

The six strategies above build and validate one population. This strip is what happens when the same stack is pointed at a geography that has no comparable file of its own — applying the strategies rather than adding to them.

05 — the sources

Where every layer comes from.

06 — the contract

Every input column, accounted for.

A reform only moves the numbers if the inputs it keys on carry signal. So every release declares a coverage contract: each input column the reference enhanced CPS exports is either present with non-default signal, or carries a reviewed exclusion naming a reason and a tracked issue. A hard release gate enforces it — a reform keyed on a missing input fails the build loudly, instead of silently scoring $0.

07 — releases

The current data, read live.

Every release publishes its manifests, calibration diagnostics, and reform validation next to the data. The rows below read the release registry directly, so this page cannot go stale: latest is the newest published build; certified is the build pinned as the policyengine.py default; local is the newest local-area build — published, not a default.

use it — the certified default in two lines
# pip install policyengine   (or: uv pip install policyengine)
from policyengine.tax_benefit_models.us import managed_microsimulation

sim = managed_microsimulation()   # policyengine_us.Microsimulation on Populace US 2024

managed_microsimulation() is pinned to the policyengine.py release bundle — the same certified build in the row above — so the dataset selection is reproducible, not ad-hoc. It returns a policyengine_us.Microsimulation; call its API directly.

08 — evidence

It already matches the data it aims to replace.

PolicyEngine's enhanced Current Population Survey is the microdata behind millions of US policy calculations. The published populace-US release — built entirely from primary sources (the incumbent is the benchmark, never an input), with full variable parity — beats it on training, held-out, and full-surface loss in the matched-sample, symmetric-refit comparison.

training loss 0.18vs 1.09 lower is better
held-out loss 0.04vs 0.32 739 unseen targets
full-surface loss 0.21vs 1.41 all 3,704 targets

frozen benchmark · build populace-us-2024-5da5a95 · 2026-06-11 · matched 41,314 households, symmetric refit. Per individual target the incumbent still wins more often (2,528 of 3,704 to our 1,127) — we win big where we win and lose narrowly where we lose. Net short-term capital gains land on the signed PUF-anchored target (−$77.4B), and every donor is a primary survey; every remaining gap is itemized on the calibration strategy page. The two populations share an open-source unit-construction engine, so this measures synthesis quality on a partly shared scaffold. We report the gaps, not just the wins. This head-to-head is a fixed comparison as of that date; the current published build is read live under releases above.

09 — the commons

Toward one faithful record per person.

The long-run goal is a communal population that many parties improve — at full scale, one statistically faithful record for every person, carrying no one's private data. Contributions come in three forms, and they are exactly the three operators: records as new strata, conditional models trained on data a contributor holds, and facts as calibration targets.

A contribution merges only if it improves the population's score on held-out, rotating evidence without degrading any protected family. Privacy is enforced by provenance and measurement, not by blurring: public sources can be sharp, private evidence enters only through certified models, and the population must resemble held-out data — never anyone's training data.

Built in the open. Read it, break it, contribute.