PolicyEngine / PolicyEngine/microcosm

populace_us_2024 under-1 geography: CA carries 21.7% of US infants (~1.9x its population share), MI 1.0% (a third of its share)

Open
#520 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
0
Forks
4
Avg merge
1d 3h
Merged PRs (30d)
94

Description

Found while adjudicating analysis-notebooks#135 (MI under-age-1 reproducer). The state-file undercount that issue reported was fixed upstream (policyengine-us-data 1.115.4-patch promotion re-uploaded states/*.h5 on 2026-05-20; states/MI.h5 now totals 10.12M ≈ Census), but rerunning the reproducer surfaced a different, current defect on the populace side: the default national dataset's under-age-1 population has a badly miscalibrated state distribution.

Artifact

policyengine-us ≥1.78x DEFAULT_DATASET:
hf://datasets/policyengine/populace-us/populace_us_2024.h5@populace-us-2024-c86a631-6e1bcd0271a5-20260619T002242Z
(measured with policyengine-us 1.782.0, 2026-07-23).

Measured (2024 base year)

State Total pop (share of US) Under-1 (share of US under-1) Share ratio
US 339,778,816 4,022,936
CA 39,305,184 (11.6%) 874,630 (21.7%) 1.9x
TX 31,305,984 (9.2%) 320,918 (8.0%) 0.87x
MI 10,139,983 (3.0%) 39,552 (1.0%) 0.33x
NY 19,884,002 (5.9%) 316,235 (7.9%) 1.34x
FL 23,396,240 (6.9%) 256,417 (6.4%) 0.93x

The 2026 layer has identical shares (CA 21.7%, MI 1.0%) — this is the base artifact's geography, not the multi-year projection.

from policyengine_us import Microsimulation
sim = Microsimulation()  # default = populace_us_2024 pin above
age = sim.calculate("age", 2024).values
w = sim.calculate("person_weight", 2024).values
sc = sim.calculate("state_code", 2024, map_to="person").values
# w[(age < 1) & (sc == "MI")].sum() -> 39,552 ; sc=="CA" -> 874,630

Why this is wrong

  • National total is roughly right: 4.02M under-1 vs 3,596,017 US births in 2023 (NCHS, Births: Final Data for 2023) — +12%, fine at this altitude. The distribution is not.
  • Implied crude birth rates: CA 22.3/1,000 vs MI 3.9/1,000 — a 5.7x spread across large states (in-dataset US average 11.8/1,000). Real state fertility differentials are tens of percent, not multiples.
  • External anchor for MI: ~104K births/year (MDHHS, receipts in analysis-notebooks#135) vs 39.6K modeled under-1s (−62%).
  • Cross-artifact disagreement: the us-data per-state file states/MI.h5 (1.115.4-patch) puts MI under-1 at 61,938 — itself low vs births, but 1.5x the populace national slice for the same state/year.

Downstream

Any under-1/infant-targeted analysis inherits 2–3x state-level errors: baby-bonus and newborn-credit scoring, under-1 poverty on the child-poverty dashboard (its state audit carries pe_pop_under_1 per state), and MT/other newborn provisions. CA-targeted infant analyses run ~2x hot; MI ~3x cold.

Question for the calibration surface

Is single-year age 0 (or any age-by-state cut finer than under-5) in the target surface for populace_us_2024? If under-1 is uncontrolled per state, this is the expected failure mode; a state-level under-1 (or births) target would pin it.

Reproducer notebook: us/poverty/michigan_under_age_1.ipynb in analysis-notebooks (PR link to follow in first comment).

🤖 Generated with Claude Code

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 running the reproducer in us/poverty/michigan_under_age_1.ipynb and comparing the default populace_us_2024 output with the states/MI.h5 artifact. Then trace the DEFAULT_DATASET calibration surface to determine whether age-by-state targets are controlled; done should include an agreed correction or calibration decision for the under-1 state distribution.

Written by the indexing model from the issue text.

Assessment

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.