SNAP#

The Supplemental Nutrition Assistance Program (SNAP) is a program that provides food assistance to low-income families. Eligibility depends on household size, state, and income, before and after a series of deductions involving earnings and various costs such as shelter and childcare.

Examples#

California currently provides emergency allotments for the Covid-19 pandemic. This tops up every eligible household to the maximum allotment for their household size, or $95 per month, whichever is larger.

These examples show SNAP allotments for a sample household, depending on their characteristics, both with (Full) and without (Normal) the emergency allotment.

How earnings affect a one-person household’s SNAP allotments#

Consider a single person household in California with $1,000 monthly earned income and $600 monthly rent. They would be eligible for $145 per month in SNAP allotments, or a top-up to the full $250 with the emergency allotment. Since the top-up is $105, less than the $95 emergency allotment minimum, they would not receive more than the maximum allotment.

from policyengine_us import IndividualSim
import pandas as pd
import plotly.express as px

sim_emp = IndividualSim(year=2022)
sim_emp.add_person(name="person", employment_income=1000 * 12)
sim_emp.add_spm_unit(
    name="spm_unit", members=["person"], housing_cost=600 * 12
)

print(
    "SNAP normal allotment: ",
    round(sim_emp.calc("snap_normal_allotment")[0] / 12),
)
print(
    "SNAP emergency allotment: ",
    round(sim_emp.calc("snap_emergency_allotment")[0] / 12),
)
print("Total SNAP: ", round(sim_emp.calc("snap")[0] / 12))
SNAP normal allotment:  159
SNAP emergency allotment:  99
Total SNAP:  258

What if their earnings change? They receive the maximum allotment of $250 per month until they reach $720 in monthly earnings, plus the $95 emergency allotment, coming to $345. When their income hits $980 per month, their normal allotment falls to $155, at which point their total allotment stabilizes at $250. The normal allotment then continues to fall until their earnings reach $1,350, at which point their continue to receive the $20 minimum monthly allotment until they reach $2,150 per month, 200% of the poverty line. At 200% of the poverty line, both their normal and full allotment fall to $0.

sim_emp.vary("employment_income", max=2500 * 12, step=120)

import plotly.express as px

LABELS = dict(
    employment_income="Monthly employment income",
    dividend_income="Monthly dividend income",
    income="Monthly income",
    income_source="Income source",
    housing_cost="Monthly housing cost",
    snap="Monthly SNAP allotment",
    mtr="Marginal tax rate from SNAP",
    housing_subsidy_rate="Housing subsidy rate from SNAP",
    allotment="SNAP allotment",
)

emp_df_full = pd.DataFrame(
    dict(
        employment_income=sim_emp.calc("employment_income")[0],
        allotment="Full",
        snap=sim_emp.calc("snap")[0],
        mtr=-sim_emp.deriv("snap", "employment_income"),
    )
)
emp_df_normal = pd.DataFrame(
    dict(
        employment_income=sim_emp.calc("employment_income")[0],
        allotment="Normal",
        snap=sim_emp.calc("snap_normal_allotment")[0],
        mtr=-sim_emp.deriv("snap_normal_allotment", "employment_income"),
    )
)
emp_df = pd.concat([emp_df_full, emp_df_normal])
emp_df[["employment_income", "snap"]] = (
    emp_df[["employment_income", "snap"]] / 12
).round()

fig = px.line(
    emp_df,
    "employment_income",
    "snap",
    color="allotment",
    labels=LABELS,
    title="SNAP allotment for a one-person household in California with $600 monthly housing costs",
)
fig.update_layout(xaxis_tickformat="$,", yaxis_tickformat="$,")
fig.show()