PolicyEngine / PolicyEngine/microcosm

Assign SNAP take-up state-conditionally: reported receipt + national rate bakes in CPS state underreporting

Open
#372 0 comments 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

Problem

#294 assigns takes_up_snap_if_eligible from reported ASEC receipt topped up to the FNS participation rate. The top-up operates at the national level, so states where CPS SNAP receipt underreporting is worst keep too few taker households, and no amount of reweighting can reach their administrative targets.

Evidence from the current default release (populace-us-2024-buildi-sparse-rmloss100-6e8e929-20260709T034135Z) and a per-state feasibility audit (ceiling = 5 × initial_weight · simulated snap, validated by reproducing the published diagnostics to the digit):

  • CA is the binding case: benefit-dollar target $12.38B, feasibility ceiling $13.71B (ratio 1.11) across only 252 SNAP-positive records. Hitting the target would require pushing nearly every CA taker record to ~4.5× simultaneously; the calibration stalls at $9.35B (−24.5%).
  • CA, IL, NM, and OK undershot in the 224k dense build too (CA −12.3%, IL −23.9%, NM −12.3%, OK −10.5%) — before sparsification, and in IL/NM/OK's case the misses survive both support sizes. The undershoot set flipped from scattered overshoots to systematic undershoots exactly when real take-up replaced the degenerate 100% take-up column, and it concentrates in high-underreporting states.
  • National total: $86.0B vs $93.8B (−8.4%).

Proposal

Condition the take-up top-up on state: top up reported-receipt takers to each state's FNS participation (the state average_monthly_households / average_monthly_persons facts in the ledger usda-snap-fy69-to-current package, and/or FNS state participation-rate estimates). This adds SNAP-carrying mass where it is genuinely missing, so calibration does not have to compensate by overweighting a thin recipient set — which distorts recipient composition (household sizes, hours, ABAWD exposure) even when the dollar total is met.

Relationship to other work

  • #370 / the caseload-targets PR make state caseloads calibration targets; they give the calibrator the objective but cannot create taker mass that is not in the support. This issue supplies the mass.
  • The take-up contract machinery from #315 (engine-asserted take-up inputs) and the participation diagnostics in take_up.py already record participation-vs-administrative surfaces per flag; a state-conditional seed extends that surface from national to state grain.
  • The buildi reselection protect-list (#359) is a complementary lever for keeping state SNAP carriers in sparse supports once they exist in the base.

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 with take_up.py and the existing participation diagnostics, then inspect the usda-snap-fy69-to-current ledger facts for state household and person rates. Define the state-conditional top-up using those facts or FNS estimates, and verify that state and national participation diagnostics and calibration targets improve without relying on a thin recipient set.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.