Skip to content

Add federal vs. state budgetary impact to economic_impact_analysis#296

Open
MaxGhenis wants to merge 1 commit intomainfrom
add-federal-state-budgetary-impact
Open

Add federal vs. state budgetary impact to economic_impact_analysis#296
MaxGhenis wants to merge 1 commit intomainfrom
add-federal-state-budgetary-impact

Conversation

@MaxGhenis
Copy link
Copy Markdown
Contributor

Summary

Partitions US reform budgetary impact into federal vs. state shares:

  • BudgetaryImpact (federal/state/total) model added to PolicyReformAnalysis
  • calculate_budgetary_impact(baseline_sim, reform_sim) -> BudgetaryImpact helper
  • Example output in examples/us_budgetary_impact.py

Closes #289.

Formulas

federal = Δ(income_tax) + Δ(payroll_tax) - Δ(federal_benefit_cost)
state   = Δ(state_income_tax)            - Δ(state_benefit_cost)
total   = federal + state

Where federal_benefit_cost and state_benefit_cost are the PE-US aggregates from PolicyEngine/policyengine-us#8076 that sum federal/state shares of Medicaid (FMAP) and CHIP (eFMAP). As more programs gain attribution (SNAP OBBBA FY2028, SSI, etc.), the aggregates grow automatically via the parameter-driven adds list — no changes needed here.

Why here vs. in policyengine-api

The arithmetic is thin sums over microsim outputs. Every consumer — API, notebooks, ad-hoc scripts — needs the same split; putting it behind the .py package means one implementation. The API follow-up (PolicyEngine/policyengine-api#3481) becomes a pass-through.

Test plan

  • pytest tests/test_budgetary_impact.py -v — 4 unit tests pass (federal-tax-cut, Medicaid expansion rollback fed/state split, mixed, zero-reform)
  • CI (will require PE-US pin bump to release containing #8076; policyengine-us >= 1.XXX.Y)

Scope notes

  • Programs that are 100% federal (SSI, LIHEAP, WIC, HCV, school meals) and 100% state (state supplements via household_state_benefits) are not folded in here — this exposes only the shared-funding programs in federal_benefit_cost / state_benefit_cost. Follow-up can add federal_only_benefit_cost and state_only_benefit_cost aggregates if useful; for now users can compute those directly.
  • Tax revenue split assumes state_income_tax is fully state (true) and income_tax + payroll_tax is fully federal (true). Not yet modeled: local income taxes, state-level tax credits that show up under federal variables.

Related

Adds BudgetaryImpact model with federal/state/total fields, exposed on
PolicyReformAnalysis and via a new standalone calculate_budgetary_impact
helper. Federal = change in income_tax + payroll_tax minus change in
federal_benefit_cost; state = change in state_income_tax minus change in
state_benefit_cost.

The arithmetic lives here (not in policyengine-api) so every consumer —
API, analysis notebooks, ad-hoc scripts — reuses a single implementation.

Requires policyengine-us with federal_benefit_cost / state_benefit_cost
aggregates (PolicyEngine/policyengine-us#8076). Pin bump is separate.

Closes #289.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add federal vs. state budgetary impact to economic_impact_analysis

1 participant