PolicyEngine / PolicyEngine/microcosm-dynamics

Replication anchors: DYNASIM-scored reforms and the minimum model surface for each

Open
#74 11 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
1
Forks
1
Avg merge
1h 46m
Merged PRs (30d)
28

Description

Replication anchors: DYNASIM-scored reforms and the minimum model surface for each

The gate-1 program certified an earnings-history generator; the reform-delta diagnostic (#72) showed it reproduces aggregate reform incidence within noise on formula-side reforms. The natural next question is external: can this stack replicate reform analyses that DYNASIM has published? This issue catalogs the published anchors (every number transcribed from a fetched Urban Institute PDF, 2026-07-07), maps each provision to the minimum model components it needs, and proposes the phased build. It is a design issue, not a registration; each phase would lock its own pre-registered gate before its first scored run, exactly as gate 1 did.

The anchor shortlist (ranked by table quality × definition precision × model surface)
Rank Anchor What it gives us Surface needed
1 Mermin (2005), "Benefit Reductions" (Urban 411260, DYNASIM3 run 432) Single provisions — price indexing, progressive price indexing (30th-pctile bend), COLA −0.4pp, NRA→70 — each with clean %-of-scheduled-benefit-by-quintile tables (retirees 62–67 and 80–85, 2050) plus exact 75-yr payroll effects earnings + formula + claiming (+ mortality for 80–85 rows)
2 Smith/Johnson/Favreault (2020), "Five Democratic Approaches" (103050, DYNASIM4 ID980, 2019 TR) Appendix tables A.1–A.5 isolate every provision's actuarial-balance cost — a per-provision Rosetta stone (e.g. $250k donut cap +2.05, CPI-E −0.37, 125%-FPL minimum −1.00, caregiver credit −0.12 to −0.51, 75% survivor −0.12, all % of payroll); Table 15 gives each provision's bottom-quintile share full projection for levels; patterns decomposable
3 Johnson & Smith (2020), Larson vs Johnson (103288, ID980) Median 2065 benefit by 20+ subgroups for two complete named bills (Social Security 2100; Johnson 2016), clean text table; the scheduled-vs-payable baseline discipline full package
4 Steuerle & Smith (2021), "First Things First" (103768) Minimum benefit → aged-poverty step-by-step: current-law scheduled 9.1% / payable 15.2% → poverty-level minimum 1.5% → all six steps 0.4% (2065); cost = +43% of the 2.59%-of-payroll deficit earnings + formula + minimum + household income
5 Favreault & Steuerle (2007), spouse/survivor packages (311436, run 440v2) The only clean marriage/survivor anchor: earnings-sharing and survivor variants with winners/losers by sex × marital status and 2049 poverty by group marriage/survivorship + differential mortality
6 Smith (2015), "Can SS Be Solvent?" (72196) Exact solvency-year deltas: cap to $150k +1yr, elimination +21yr, payroll +1pp +5yr, +2pp +18yr, FRA→72 <1yr revenue + projection (aggregates only)

Cross-model triangulation: SSA OCACT single-provision scores (ssa.gov/oact/solvency/provisions, HTML tables per run) and bill memos (Social Security 2100 baseline −2.84% payroll under the 2018 TR), and SSA MINT Policy Brief 2009-01 on taxable-maximum distributional effects. SSA pages 403 on programmatic fetch; verify manually before publication.

Component requirements per provision

Components: EH earnings histories (certified, gate 1) · SF statutory PIA formula (pinned oracle, cross-validated) · CA claiming ages · M differential mortality · MS marriage/survivorship · FC fertility/caregiving · DI disability · REV payroll/revenue side · LR long-run projection under Trustees assumptions.

Provision EH SF CA M MS FC DI REV LR
Taxable max (benefit side)
Payroll rate
COLA changes (incl. CPI-E)
Price / progressive price indexing (✓)
FRA / ERA increases
Minimum benefits (✓) (✓)
Bend points / PIA factors
Survivor 75% / spousal / earnings sharing
Caregiver credits (✓)
Long-term-beneficiary bonus
Full packages (SS 2100, Johnson, BPC)

(✓) = needed only for poverty/household or subgroup rows, not the core benefit calculation.

Data already staged for the demographic components

All on disk at ~/PolicyEngine/psid-data, label-verified: mh85_23 (marriage histories), cah85_23 (childbirth/adoption histories), MX23REL (person-relationship map), death years in ind2023er — exactly the holdout basis gates.yaml gate 2 already names. External estimation/validation sources: SSA cohort life tables (differential mortality), Statistical Supplement claim-age distributions (claiming), Trustees intermediate assumptions (projection).

Proposed phases (each behind its own pre-registered gate)
  • Phase A — formula mechanics on observed careers (buildable now). Replicate the incidence structure of anchor 1's PI/PPI tables (%-of-scheduled by quintile) and OCACT-style single-provision patterns on completed PSID careers, with the population-concept delta (observed cohorts vs DYNASIM's 2050 retirees) documented rather than hidden.
  • Phase B — claiming + differential mortality. Unlocks the COLA rows, NRA→70, the 80–85 age rows, long-term bonus. Gate: mortality hazards vs SSA cohort life tables + PSID deaths; claim-age distribution vs the Statistical Supplement.
  • Phase C — marriage/survivorship (gate 2 proper). Unlocks anchor 5 (the survivor/earnings-sharing winners/losers tables) — DYNASIM's signature territory. Holdouts: the staged mh85_23/MX23REL files.
  • Phase D — fertility/caregiving. Unlocks caregiver credits (anchor 2's most progressive provision: 52–62% of gains to the bottom lifetime-earnings fifth).
  • Phase E — projection + revenue. Trustees-assumption projection and payroll side; unlocks the actuarial-balance Rosetta stone (anchor 2's A-tables) and full-package scores.
Protocol notes for any replication run
  1. Baseline convention matters: DYNASIM tables use two current-law baselines — scheduled (full formula) and payable (post-exhaustion cut). Every replication must state which denominator it matches.
  2. Replication targets are incidence patterns with documented assumption deltas, not point-forecast matching — per the paper's domains-of-validity doctrine (different Trustees vintages, base data, and behavioral assumptions are named deviations, not failures).
  3. Anchors are PDF tables (no machine-readable versions exist); transcriptions above were made from pdftotext output of the fetched PDFs and should be re-verified against the PDFs when a phase registers its gate.

Full per-provision catalog with transcribed table rows available on request (research pass 2026-07-07); source PDFs archived locally.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reading gates.yaml, especially the gate 2 holdout basis, and review the staged files under ~/PolicyEngine/psid-data. The issue defines a multi-phase replication program rather than a bounded change, so a contributor would need to select and scope one phase before implementation. Done would require a registered gate and documented comparison against the named DYNASIM anchor.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data-engineering
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.