Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 62 additions & 8 deletions packages/populace-build/src/populace/build/us/source_stages.json
Original file line number Diff line number Diff line change
Expand Up @@ -521,8 +521,8 @@
},
{
"stage": "snap_take_up",
"survey": "Census CPS ASEC + USDA FNS participation rate estimates",
"source": "https://www.fns.usda.gov/snap/participation-rates",
"survey": "Census CPS ASEC + USDA FNS FY2022 state participation rate estimates",
"source": "https://www.fns.usda.gov/research/snap/state-participation-rates/2022",
"grain": "spm_unit",
"artifacts": [
{
Expand All @@ -534,8 +534,8 @@
{
"kind": "administrative_table",
"format": "published_estimate",
"vintage": "latest_available",
"locator": "USDA FNS SNAP participation-rate estimates (Reaching Those in Need)"
"vintage": "fiscal_year_2022",
"locator": "USDA FNS Reaching Those in Need: Estimates of State SNAP Participation Rates in 2022, Table 1"
}
],
"operations": [
Expand All @@ -546,16 +546,70 @@
{
"kind": "derive_snap_take_up",
"seed_from_build_config": true,
"take_up_rate": {
"value": 0.82,
"source": "https://www.fns.usda.gov/snap/participation-rates"
"state_take_up_rates": {
"fiscal_year": 2022,
"measure": "share_of_eligible_people_participating_in_average_month",
"source": "https://www.fns.usda.gov/sites/default/files/resource-files/ear-snap-Reaching-Those-in-Need-2022.pdf",
"values": {
"01": 0.9,
"02": 0.73,
"04": 0.77,
"05": 0.59,
"06": 0.81,
"08": 1.0,
"09": 0.98,
"10": 0.91,
"11": 1.0,
"12": 0.81,
"13": 0.92,
"15": 0.81,
"16": 0.73,
"17": 1.0,
"18": 0.89,
"19": 0.98,
"20": 0.79,
"21": 0.75,
"22": 0.99,
"23": 0.94,
"24": 0.85,
"25": 1.0,
"26": 1.0,
"27": 0.93,
"28": 0.74,
"29": 0.92,
"30": 0.75,
"31": 0.93,
"32": 0.98,
"33": 0.82,
"34": 0.91,
"35": 1.0,
"36": 0.91,
"37": 0.95,
"38": 0.81,
"39": 0.99,
"40": 0.98,
"41": 1.0,
"42": 1.0,
"44": 1.0,
"45": 0.76,
"46": 0.84,
"47": 0.84,
"48": 0.74,
"49": 0.76,
"50": 0.99,
"51": 0.83,
"53": 1.0,
"54": 0.98,
"55": 1.0,
"56": 0.63
}
}
}
],
"outputs": [
"takes_up_snap_if_eligible"
],
"notes": "Reported recipients (SPM_SNAPSUB > 0) always take up \u2014 survey measurement first. Non-reporting units receive seeded draws at exactly the rate needed for the overall weighted take-up share to land on the cited FNS participation rate; when reporters alone exceed the rate the share is emergent. The flag is assigned across all SPM units and the engine intersects it with modeled eligibility, matching the retired enhanced-CPS pipeline. Draws are keyed by stable source identity so support-channel clones of one source unit always agree. Without this stage the engine defaults every unit to take-up (100% participation), overstating the reach of eligibility-side reforms (populace #243)."
"notes": "Reported recipients (SPM_SNAPSUB > 0) always take up \u2014 survey measurement first. In each state, eligible non-reporting SPM units are ordered by stable source-identity draw and topped up until weighted eligible people (household design weight times modeled snap_unit_size) are closest to the cited FY2022 FNS eligible-person participation rate; when eligible reporters alone exceed the target, the anchor is the floor. The calibrated state draw cutoff also applies to currently ineligible units, so eligibility-expanding reforms expose a plausible state-specific propensity instead of a hard-coded zero. Stable-draw ties are selected together so support-channel clones agree. FNS publishes rounded estimates and caps reported estimates at 100 percent; a reported 100 does not literally establish universal participation. Without this stage the engine defaults every unit to take-up, and the former national top-up preserved CPS state under-reporting (populace #243/#372)."
},
{
"stage": "eligibility_inputs",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@
"value_type": "bool",
"default": true,
"populace_treatment": "out_of_scope",
"scope_owner": "snap_take_up source stage (populace#243, landed in PR #294)",
"rate": {"value": 0.82, "source": "https://www.fns.usda.gov/snap/participation-rates", "agency": "USDA FNS", "status": "sourced_administrative"},
"notes": "SNAP take-up is seeded by the snap_take_up source stage, reported-receipt-anchored on raw ASEC SPM_SNAPSUB and gated by snap_take_up_signal. Not seeded here to avoid duplicating that work; out_of_scope means out of scope for this module's Bernoulli seeding, not unseeded."
"scope_owner": "snap_take_up source stage (populace#243/#372)",
"rate": {"grain": "state", "period": "FY2022", "manifest_parameter": "state_take_up_rates", "measure": "share_of_eligible_people_participating_in_average_month", "source": "https://www.fns.usda.gov/sites/default/files/resource-files/ear-snap-Reaching-Those-in-Need-2022.pdf", "agency": "USDA FNS", "status": "sourced_administrative"},
"notes": "SNAP take-up is seeded by the snap_take_up source stage, reported-receipt-anchored on raw ASEC SPM_SNAPSUB, calibrated at state grain to FNS eligible-person participation rates, and gated by snap_take_up_signal. The state values live once in source_stages.json. Not seeded in the generic Bernoulli module to avoid duplicating that work; out_of_scope means out of scope for that module, not unseeded."
},
{
"variable": "takes_up_tanf_if_eligible",
Expand Down
20 changes: 15 additions & 5 deletions packages/populace-build/src/populace/build/us_runtime/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,10 +247,14 @@
with_us_snap_discretionary_exemption_inputs,
)
from populace.build.us_runtime.snap_take_up import (
US_SNAP_TAKE_UP_ELIGIBILITY_COLUMN,
US_SNAP_TAKE_UP_OUTPUT_COLUMN,
US_SNAP_TAKE_UP_RAW_COLUMN,
US_SNAP_TAKE_UP_STAGE_NAME,
US_SNAP_TAKE_UP_TOLERANCE,
US_SNAP_TAKE_UP_UNIT_SIZE_COLUMN,
derive_us_snap_take_up_from_manifest,
us_snap_take_up_diagnostics,
us_snap_take_up_signal_gate,
us_snap_take_up_stage_spec,
us_snap_take_up_summary,
Expand Down Expand Up @@ -364,10 +368,14 @@
"us_hours_worked_stage_spec",
"us_hours_worked_summary",
"with_us_hours_worked_inputs",
"US_SNAP_TAKE_UP_ELIGIBILITY_COLUMN",
"US_SNAP_TAKE_UP_OUTPUT_COLUMN",
"US_SNAP_TAKE_UP_RAW_COLUMN",
"US_SNAP_TAKE_UP_STAGE_NAME",
"US_SNAP_TAKE_UP_TOLERANCE",
"US_SNAP_TAKE_UP_UNIT_SIZE_COLUMN",
"derive_us_snap_take_up_from_manifest",
"us_snap_take_up_diagnostics",
"us_snap_take_up_signal_gate",
"us_snap_take_up_stage_spec",
"us_snap_take_up_summary",
Expand Down Expand Up @@ -649,13 +657,15 @@ def to_manifest(self) -> dict[str, object]:
),
),
US_SNAP_TAKE_UP_STAGE_NAME: DonorSpec(
survey="Census CPS ASEC + USDA FNS participation rate estimates",
source="https://www.fns.usda.gov/snap/participation-rates",
survey=("Census CPS ASEC + USDA FNS FY2022 state participation rate estimates"),
source=(
"https://www.fns.usda.gov/research/snap/state-participation-rates/2022"
),
notes=(
"SNAP take-up: reported recipients (SPM_SNAPSUB) always take "
"up; non-reporting units drawn to the cited FNS participation "
"rate. Without it the engine defaults every eligible unit to "
"100% take-up."
"up; non-reporting units are calibrated by state to cited FNS "
"eligible-person participation rates. Without it the engine "
"defaults every eligible unit to 100% take-up."
),
),
US_ELIGIBILITY_INPUTS_STAGE_NAME: DonorSpec(
Expand Down
Loading
Loading