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. Two states are drawn below, both honestly: the pipeline the certified build actually runs — including the machinery its own postmortems condemned — and the operator algebra the open epics land (#395, #449, #463, #469).

shipping today — certified Build M (98bf731)
Today: harmonize, clone, impute, assemble; then derive, seed take-up with SSI-specific count matching, materialize per batch, calibrate, and reconcile SSI in a loop marked for deletion; 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 ssi: greedy count-match removing — #469 Materialization engine per 5,000-hh batch one system per batch — #468 Calibration gradient descent Selection / export h5 + manifests calibration diagnostics ssi take-up reconcile — re-runs the engine every pass 12+ passes at dense scale · deleting: #463 · #469 parity · coverage contract the release registry shipped and staying shipped and condemned — machinery its own postmortems are deleting
The certified build, drawn without flattery. The PUF twins and SCF/SIPP imputations still run on the ASEC spine before assembly; take-up seeding carries SSI-specific count-matching; materialization constructs an engine system per household batch; and the SSI reconcile loop re-materializes target families under fresh weights until its caps say stop. The dashed machinery is condemned by its own measurements — the deletion set of populace#463, #468 and #469.
intended — the operator algebra (#395 · #449 · #463 · #469)
Intended: harmonize and assemble the multispine first; clone and impute as operators on the assembled frame; seed take-up uniformly; run the engine once; calibrate in matrix space; select and export through hardened gates. Harmonize sources asec · acs · puf · scf · sipp shared columns · universes Assemble multispine acs main spine · asec_puf mass allocation across spines Clone operator puf tax-detail twins on the assembled frame Imputation operators scf wealth · sipp tips · esi on the assembled frame mass conservation Derivations rules on the frame Take-up seeds all programs: seeded draws at documented priors Materialize once once per input state telemetry-asserted — #463 Target matrix static columns · incl. district surface (#288) Calibration matrix descent weights only Selection / export sparse + dense arms · h5 + manifests dollar-row fit · tail concentration parity · coverage · the registry every edge solid — no loops, no per-program machinery, engine runs once
The intended algebra. The multispine is assembled first and cloning and imputation become operators on the assembled frame (#395); take-up is seeded uniformly for every program at documented priors (#469); the engine materializes target columns exactly once, asserted by telemetry (#463); calibration is descent on a static matrix that includes the congressional-district surface (#288, #449); and the export answers to the hardened gate set, including the dollar-row fit and tail-concentration gates that certification of the current build motivated (#464).
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.