-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
344 lines (331 loc) · 16 KB
/
Copy pathindex.html
File metadata and controls
344 lines (331 loc) · 16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>populace — a synthetic population, built in the open</title>
<meta name="description" content="populace is an open-source stack for building weighted synthetic populations from survey and administrative data. A sampling frame as a first-class datatype, with operators for building its support and calibrating its weights." />
<meta property="og:title" content="populace" />
<meta property="og:description" content="A weighted synthetic population, built in the open." />
<meta property="og:type" content="website" />
<link rel="icon" type="image/svg+xml" href="/assets/policyengine-mark.svg" />
<meta name="theme-color" content="#FFFFFF" /><!-- --background -->
<link rel="stylesheet" href="/vendor/fonts/fonts.css" />
<link rel="stylesheet" href="/vendor/ui-kit-tokens.css" />
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<div class="grain" aria-hidden="true"></div>
<canvas id="field" aria-hidden="true"></canvas>
<header class="nav">
<a class="brand" href="#top">
<span class="brand-dot" aria-hidden="true"></span>populace
</a>
<nav class="nav-links">
<a href="#idea">the idea</a>
<a href="#stack">the stack</a>
<a href="#sources">sources</a>
<a href="#releases">releases</a>
<a href="#result">evidence</a>
<a href="#commons">the commons</a>
<a href="/papers">papers</a>
<a class="nav-gh" href="https://github.com/PolicyEngine/populace" aria-label="GitHub"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5"/></svg></a>
</nav>
</header>
<main id="top">
<section class="hero">
<div class="hero-inner">
<p class="eyebrow reveal" style="--d:0">open-source population infrastructure</p>
<h1 class="reveal" style="--d:1">
A nation is <em>millions</em> of households.
<br />We build a synthetic one that stands in for them all.
</h1>
<p class="lede reveal" style="--d:2">
<strong>populace</strong> 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.
</p>
<div class="hero-cta reveal" style="--d:3">
<a class="btn btn-primary" href="#idea">How it works</a>
<a class="btn btn-ghost" href="https://github.com/PolicyEngine/populace">Read the code</a>
<a class="btn btn-ghost" href="/papers">Read the papers</a>
</div>
<p class="hero-foot reveal" style="--d:4">
<span class="mono">every point above is a synthetic household · brightness ∝ survey weight</span>
</p>
</div>
</section>
<section id="idea" class="band">
<div class="band-head">
<span class="kicker mono">01 — the idea</span>
<h2>The sampling frame, made executable.</h2>
</div>
<div class="prose">
<p>
Every population estimate rests on a <em>frame</em>: 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.
</p>
<p>
populace makes the frame a <strong>first-class datatype</strong>. 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.
</p>
</div>
</section>
<section id="stack" class="band band-stack">
<div class="band-head">
<span class="kicker mono">02 — the stack</span>
<h2>Six strategies, one frame.</h2>
</div>
<div class="prose" style="margin-bottom: 36px;">
<p>
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 <code class="mono">/paper</code> as the
stable citation target.
</p>
</div>
<div class="strategy-grid">
<a class="strategy-card" href="/support">
<header><span class="card-id mono">support</span><span class="tag tag-live">shipped</span></header>
<h3>The support</h3>
<p>
Which records exist and what they carry: a spine of observed survey
records with donor channels, completed by sequential zero-inflated
quantile-regression-forest draws from the population's conditional
distribution.
</p>
<span class="strategy-paper-link mono">read the strategy →</span>
</a>
<a class="strategy-card" href="/calibration">
<header><span class="card-id mono">calibration</span><span class="tag tag-live">shipped</span></header>
<h3>The totals</h3>
<p>
Weights that hit administrative facts: gradient descent against
thousands of hierarchical targets on a capped relative-error loss,
with hard weight-ratio bounds against landmines.
</p>
<span class="strategy-paper-link mono">read the strategy →</span>
</a>
<a class="strategy-card" href="/sparsity">
<header><span class="card-id mono">sparsity</span><span class="tag tag-live">shipped</span></header>
<h3>The economy</h3>
<p>
The same target surface on a fraction of the records: Hard Concrete
gates select which candidate records survive into a deployable file
while the weights fit the full surface.
</p>
<span class="strategy-paper-link mono">read the strategy →</span>
</a>
<a class="strategy-card" href="/evaluation">
<header><span class="card-id mono">evaluation</span><span class="tag tag-live">shipped</span></header>
<h3>The referee</h3>
<p>
Any candidate population, scored on two currencies: fidelity to
held-out survey views (the popdgp harness) and administrative
target attainment, in-fit and held out.
</p>
<span class="strategy-paper-link mono">read the strategy →</span>
</a>
<a class="strategy-card" href="/composition">
<header><span class="card-id mono">composition</span><span class="tag tag-wip">in progress</span></header>
<h3>The interactions</h3>
<p>
The support and the weights each pass their own single-operator
checks; composition asks what happens when both run on the same
file — realized landmines, repairability, and the target-vs-survey
trade-off.
</p>
<span class="strategy-paper-link mono">read the strategy →</span>
</a>
<a class="strategy-card" href="/dynamics">
<header><span class="card-id mono">dynamics</span><span class="tag tag-wip">design stage</span></header>
<h3>Time</h3>
<p>
Trajectory-weighted calibration and transitions as conditional models,
under a scoring protocol where every claim resolves, backtests, or
computes exactly from statute. First domain: U.S. Social Security.
</p>
<span class="strategy-paper-link mono">read the strategy →</span>
</a>
</div>
<p class="stack-note">
<span class="mono">the support · the totals · the economy · the referee · the interactions · time</span>
</p>
</section>
<section id="applications" class="band band-applications">
<div class="band-head">
<span class="kicker mono">03 — an application, not a seventh strategy</span>
<h2>The stack, put to work on a geography without its own file.</h2>
</div>
<div class="prose" style="margin-bottom: 30px;">
<p>
The six strategies above build and validate <strong>one</strong>
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.
</p>
</div>
<div class="strategy-grid" style="grid-template-columns: 1fr;">
<a class="strategy-card" href="/anywhere" style="max-width: 620px;">
<header><span class="card-id mono">anywhere</span><span class="tag tag-wip">paper in progress</span></header>
<h3>Open microsimulation anywhere</h3>
<p>
Most countries' household microdata is restricted; rules engines
are no longer the bottleneck to modeling their tax and benefit
systems, data access is. Recalibrating the open US support to a new
geography's published totals — validated against the UK's held-out
survey microdata, deployed in Belgium where no comparable microdata
exists.
</p>
<span class="strategy-paper-link mono">read the application →</span>
</a>
</div>
</section>
<section id="sources" class="band">
<div class="band-head">
<span class="kicker mono">04 — the sources</span>
<h2>Where every layer comes from.</h2>
</div>
<div id="sources-diagram"></div>
<p class="mono" id="sources-note" style="margin-top: 20px; max-width: 64ch; font-size: 13px; line-height: 1.55; color: var(--paper-faint);"></p>
</section>
<section id="releases" class="band">
<div class="band-head">
<span class="kicker mono">05 — releases</span>
<h2>The current data, read live.</h2>
</div>
<div class="prose">
<p>
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: <strong>latest</strong>
is the newest published build; <strong>certified</strong> is the build
pinned as the policyengine.py default.
</p>
</div>
<div class="release-rows">
<div class="release-row" id="release-row-latest" hidden>
<span class="tag tag-live">latest</span>
<span class="release-id" data-slot="id"></span>
<span class="release-meta" data-slot="meta"></span>
</div>
<div class="release-row" id="release-row-certified" hidden>
<span class="tag tag-cert">certified</span>
<span class="release-id" data-slot="id"></span>
<span class="release-meta" data-slot="meta"></span>
</div>
</div>
<p class="research-link mono">
<a href="/calibration">Browse every target on the calibration strategy page</a>
· <a href="https://huggingface.co/datasets/policyengine/populace-us/tree/main">releases on Hugging Face</a>
</p>
</section>
<section id="result" class="band band-result">
<div class="band-head">
<span class="kicker mono">06 — evidence</span>
<h2>It already matches the data it aims to replace.</h2>
</div>
<div class="prose">
<p>
PolicyEngine's enhanced Current Population Survey is the microdata behind
millions of US policy calculations. The published populace-US release —
built <strong>entirely from primary sources</strong> (the incumbent is
the benchmark, never an input), with full variable parity —
<strong>beats it on training, held-out, and full-surface
loss</strong> in the matched-sample, symmetric-refit comparison.
</p>
</div>
<div class="metrics">
<div class="metric">
<span class="metric-label mono">training loss</span>
<span class="metric-val">0.18<span class="metric-vs">vs 1.09</span></span>
<span class="metric-note">lower is better</span>
</div>
<div class="metric">
<span class="metric-label mono">held-out loss</span>
<span class="metric-val">0.04<span class="metric-vs">vs 0.32</span></span>
<span class="metric-note">739 unseen targets</span>
</div>
<div class="metric">
<span class="metric-label mono">full-surface loss</span>
<span class="metric-val">0.21<span class="metric-vs">vs 1.41</span></span>
<span class="metric-note">all 3,704 targets</span>
</div>
</div>
<p class="caveat">
<span class="mono">build populace-us-2024-5da5a95 · 2026-06-11 · matched 41,314 households, symmetric refit.</span>
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 <a href="/calibration">calibration strategy page</a>. 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.
</p>
<p class="research-link mono">
<a href="/sparsity/paper">Read the sparsity (L0) paper</a>
·
<a href="/dynamics/paper">Read the dynamics design paper</a>
·
<a href="/papers">Browse every paper</a>
</p>
</section>
<section id="commons" class="band band-commons">
<div class="band-head">
<span class="kicker mono">07 — the commons</span>
<h2>Toward one faithful record per person.</h2>
</div>
<div class="prose">
<p>
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: <strong>records</strong> as new strata,
<strong>conditional models</strong> trained on data a contributor holds, and
<strong>facts</strong> as calibration targets.
</p>
<p>
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.
</p>
</div>
<ul class="commons-rails">
<li><span class="rail-n mono">→</span> records · a new stratum at honest weights</li>
<li><span class="rail-n mono">→</span> conditionals · certified P(y | x), never microdata</li>
<li><span class="rail-n mono">→</span> facts · targets with standard errors</li>
</ul>
</section>
<section class="band band-cta">
<h2>Built in the open. Read it, break it, contribute.</h2>
<div class="hero-cta">
<a class="btn btn-primary" href="https://github.com/PolicyEngine/populace">github.com/PolicyEngine/populace</a>
<a class="btn btn-ghost" href="https://github.com/PolicyEngine/populace/blob/main/DESIGN.md">The design charter</a>
</div>
</section>
</main>
<footer class="foot">
<div class="foot-row">
<span class="brand"><span class="brand-dot" aria-hidden="true"></span>populace</span>
<a class="foot-pe" href="https://policyengine.org" aria-label="PolicyEngine"><img src="/assets/policyengine.svg" alt="PolicyEngine" /></a>
</div>
<p class="mono foot-fine">
A weighted synthetic population for public policy. Open source · MIT · a PolicyEngine project.
</p>
</footer>
<script src="./field.js" defer></script>
<script src="./sources.js" defer></script>
<script src="./releases.js" defer></script>
<script src="/reveal.js" defer></script>
</body>
</html>