Skip to content
Closed
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
50 changes: 50 additions & 0 deletions app/src/data/posts/articles/2025-spm-poverty-prediction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
At 10 am ET on September 15, the Census Bureau published poverty rates for 2025. Our prediction, registered September 11, was that Supplemental Poverty Measure poverty would rise 0.2 points to 13.2 percent of people, rise 0.9 points to 14.3 percent for children, and fall 0.5 points to 14.6 percent for people 65 and over. Census reported 13.1 percent (up 0.1), 13.4 percent for children (down 0.1), and 15.4 percent for people 65 and over (up 0.2). The child prediction missed by a point. The results section at the end grades both this prediction and the prior model's.

We wrote the numbers down before the release. The prediction file, its hash, and an OpenTimestamps proof are in the [spm-threshold-paper repository](https://github.com/PolicyEngine/spm-threshold-paper/blob/master/data/predictions/2025-spm-poverty-rates-2026-09-11.json). If it misses, it stays there.

## How the number is built

The prediction is the Census 2024 rate plus PolicyEngine's modeled change from 2024 to 2025. We do not publish the model's own level as the prediction, because the level differs from Census by construction: the model computes benefits from program rules instead of taking reported amounts, fits its population weights to administrative totals, and projects 2024 households forward rather than surveying 2025 ones. Poverty rates are never among the totals the weights are fitted to. That holdout is what makes the comparison on Tuesday informative.

| Group | Census 2024 | Modeled change, pp | Prediction 2025 |
| --- | ---: | ---: | ---: |
| All people | 13.0 | +0.22 | 13.2 |
| Under 18 | 13.4 | +0.86 | 14.3 |
| 65 and over | 15.1 | −0.52 | 14.6 |

The 2024 anchors are the corrected series in Table 3 of Census's [August working paper](https://www.census.gov/library/working-papers/2026/demo/sehsd-wp2026-17.html), issued after BLS revised the thresholds. On the original series the anchors are 12.9, 13.4 and 15.0, and the predictions round to 13.1, 14.3 and 14.5.

The model serving policyengine.org today would have predicted a fall, to 12.5 percent. It ages the 2024 thresholds by 2.6 percent CPI-U inflation. The thresholds BLS published in August rose 4.4 to 6.3 percent, and the new [spm-calculator](/us/research/introducing-spm-calculator) uses them directly.

The modeled changes come from development runs on policyengine-core 3.30.1. A rerun before the release on the shipping runtime, policyengine-us 2.2.1 with the certified population release, reproduced the all-people and child changes to within 0.001 points. The prediction file commits us to a dated amendment, never an edit, if any group's change moves by 0.05 points or more.

## How PolicyEngine calculates SPM poverty

A person is in poverty when their SPM unit's resources are below its threshold. Three parts feed that comparison.

**Population.** The Microcosm US dataset holds 57,240 Current Population Survey households with 166,321 people. Their weights are fitted to 5,659 administrative targets: IRS income statistics by state and income level, Census population estimates by age and sex, Medicaid and Marketplace enrollment, SNAP participation and benefits, SSI, TANF, state tax collections and national accounts. 2025 values are the 2024 survey values carried forward by the model's uprating parameters for wages, prices and program rules, with household composition held at 2024.

**Thresholds.** spm-calculator supplies each unit's threshold from the published BLS 2025 national values and housing shares, the three-parameter equivalence scale, and a rent index for the unit's metro or nonmetro area. The 2025 rent indices are modeled, since Census had not published 2025 geography when the artifact was built.

**Resources.** Market income from the survey, plus benefits computed from statute for eligible units that the data marks as taking them up (Social Security, SSI, SNAP, WIC, school meals, TANF, unemployment compensation, energy assistance, and housing subsidies capped at the housing portion of the threshold), minus payroll, federal and state income taxes computed from statute, minus child support paid, medical out-of-pocket expenses and capped work and child care expenses.

The full description, with every variable named and linked, is in the [PolicyEngine US methodology documentation](https://github.com/PolicyEngine/policyengine-us/blob/main/docs-quarto/methodology/spm-poverty.qmd). It is maintained with the code.

## What the model does not do

- **Medicaid does not change non-premium medical spending.** The model computes Medicaid eligibility and enrollment, and it computes premiums from rules for Medicare, Marketplace coverage and CHIP (Medicaid expansion premium schedules are encoded for three states but are zero in the current baselines). Non-premium medical spending, which is most of MOOP, is a survey input uprated with CMS per-capita spending. Enrolling someone in Medicaid, or removing their coverage, leaves that spending unchanged, so coverage changes reach poverty only through the premium components.
- **Copays and employer premiums.** Neither is computed from rules; both stay as reported.
- **Levels.** The model's own 2025 level is 13.2 percent for all people, 16.6 for children and 10.9 for seniors. The child and senior levels sit far from Census, in opposite directions, which is why we report changes. Those gaps are open questions for us, not corrections to Census.
- **Local thresholds for 2025** are projections until Census publishes the geography.

## What Census published

*Poverty in the United States: 2025* (P60-290) reports SPM poverty of 13.1 percent for all people, up 0.1 point from 2024; 13.4 percent for children, down 0.1; and 15.4 percent for people 65 and over, up 0.2. In numbers, 44.4 million people and 9.7 million children were below the SPM threshold. The report re-bases 2024 to Vintage 2025 population controls, which puts its 2024 child rate at 13.5 percent rather than the 13.4 we anchored on; the changes below are the ones Census printed. By housing tenure, the renter rate rose 0.8 points to 24.0 percent, the rate for owners with a mortgage fell 0.2 to 6.0, and the rate for owners without a mortgage was unchanged at 11.9.

| Group | Census change, pp | Registered prediction | Miss | Prior model | Miss |
| --- | ---: | ---: | ---: | ---: | ---: |
| All people | +0.1 | +0.2 | +0.1 | −0.5 | −0.6 |
| Under 18 | −0.1 | +0.9 | +1.0 | −0.2 | −0.1 |
| 65 and over | +0.2 | −0.5 | −0.7 | −1.2 | −1.4 |

The registered prediction was closer than the prior model for all people and for people 65 and over. The prior model was closer for children, where the registered change missed by a full point. The public-use microdata says where the miss sits. Recomputing the 2025 SPM from the 2026 CPS ASEC file with the national thresholds held at their 2024 values plus CPI-U (2.6 percent), and everything else as published, gives 12.3 percent for all people, 12.3 for children, and 14.7 for people 65 and over (the full table, the chained-CPI variant and the method are in [2025 SPM poverty at 2024 thresholds](/us/research/2025-spm-poverty-at-2024-thresholds)). Against the 2024 rates that is a fall of 0.7 points overall, 1.2 for children, and 0.4 for seniors before threshold growth; the thresholds rising faster than prices then added 0.8, 1.1, and 0.7 points. The model's threshold effect for children, 1.1 points between the prior run and the new one, matches the data. Its resource-side change did not: the data show child poverty falling 1.2 points at constant real thresholds, and the model had 0.2. The grade goes into the [paper repository](https://github.com/PolicyEngine/spm-threshold-paper) as a dated record, and the child miss is the next thing to take apart.
46 changes: 46 additions & 0 deletions app/src/data/posts/articles/introducing-spm-calculator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
Every SPM poverty rate starts with a threshold: the amount a family of a given size and housing situation needs, in its part of the country, in a given year. Census publishes the rates each September. BLS publishes the national thresholds a few weeks earlier, and the local adjustments arrive with the microdata. Anyone who wants a threshold for a year Census has not reached yet has had to guess.

[spm-calculator 1.0](https://pypi.org/project/spm-calculator/) is our answer to that. It computes a Supplemental Poverty Measure threshold for any family composition, housing tenure, and metro or nonmetro area, for 2022 through 2035. Through 2025 it uses the published BLS values. Beyond that it projects them by the method BLS and Census use, advancing the same data windows they advance. The [calculator app](https://policyengine.org/us/spm-calculator) runs the same artifact in the browser.

## What a threshold is made of

BLS sets the national threshold for a reference family of two adults and two children from five years of Consumer Expenditure Survey data. It takes families between the 47th and 53rd percentiles of spending on food, clothing, shelter, utilities, telephone and internet, multiplies that spending by 1.2, swaps the sample's average shelter and utilities for the tenure group's own, and takes 82 percent of the result. The 2025 renter threshold is $41,700.56; owners with a mortgage $41,322.71; owners without $34,326.00. Census then scales for family size with the three-parameter equivalence scale and adjusts the housing share by a local rent index built from five years of American Community Survey rents.

The calculator carries each of those pieces separately, with its own status. A 2025 national threshold is published. A 2025 local threshold combines that published base with a rent index the calculator models, because Census had not published 2025 geography by the artifact's information date of September 9, 2026. The result tells you which is which.

## Forecasting by moving the window, not the price level

The usual way to extend a threshold is to age it with the CPI. That assumes real spending near the poverty line stays flat and that the estimation window stands still. Neither holds. BLS's 2025 thresholds rose 4.4 to 6.3 percent over 2024, against 2.6 percent CPI-U inflation, because the five-year window dropped 2019 spending and picked up 2024.

spm-calculator projects a future year by projecting the observations the window would contain: each missing CE quarter borrows the latest observed quarter of the same season, scaled by a price path and a real-spending assumption. Two scenarios ship in the artifact. `ce_trend` carries forward half of the fitted real-spending trend; `zero_real` holds real spending at the anchor. Missing ACS rent years copy the 2024 cohort at zero real rent growth under both scenarios, so local factors change only as the five-year window turns over. The price path is CBO's February 2026 CPI-U forecast, pinned by hash.

We tested the method before we relied on it. On August 7 we [committed](https://spm-threshold-paper.vercel.app/) a 2025 threshold nowcast with a timestamp proof. BLS published the actual 2025 thresholds on August 24. Across the three tenures the amended nowcast's mean absolute error was 1.17 percent, and the original nowcast's 0.98 percent; CPI-U aging would have been 2.58 percent. Renters were the miss, at 2.27 percent low. The retrospective 2020 to 2024 backtest is in the [paper](https://spm-threshold-paper.vercel.app/).

## What changed from the old package

Two corrections, both ours to own. In July, BLS found errors in its own threshold code and reissued 2019 to 2024 thresholds; the calculator now uses the corrected series at full spreadsheet precision, and keeps the pre-correction series for reproducing older statistics. Benchmarking our replication against both series also surfaced errors in the package's earlier hand-entered thresholds, as large as 5.8 percent for 2019 renters, and four bugs in our replication code. The [correction record](https://policyengine-docs.vercel.app/spm-calculator/bls-2026-correction) lists each one.

The app also lost options. Earlier versions offered county and congressional-district thresholds computed from local rents. Census estimates rents only for metro areas, combined smaller-metro residuals and nonmetro residuals by state, so those finer geographies implied a precision the method does not have. The app now offers the 341 estimation areas Census uses, plus eight nonmetro residuals the calculator models where Census publishes none, and a county is a lookup into that menu.

## What it does not do

The calculator computes thresholds. It does not compute resources, so it does not produce a poverty rate; that is the job of the tax and benefit model, and our [prediction for the 2025 rate](/us/research/2025-spm-poverty-prediction) explains how the two fit together. It validates against BLS's published cells rather than replicating BLS's code. Its forecasts are conditional on the CBO price path and on real spending following one of the two scenarios, and every projected number carries that label.

## Using it

```bash
uv add spm-calculator
```

```python
from spm_calculator import SPMUnit, load_forecast

forecast = load_forecast()
result = forecast.calculate_unit(
SPMUnit("example", num_adults=2, num_children=2, tenure="renter",
year=2025, geography_kind="national")
)
result["threshold"] # 41700.555713
```

The package works offline from bundled inputs. Documentation is at [policyengine-docs.vercel.app/spm-calculator](https://policyengine-docs.vercel.app/spm-calculator/), the code at [github.com/PolicyEngine/spm-calculator](https://github.com/PolicyEngine/spm-calculator), and the artifact's content hash is printed with every result so a number can be traced to the exact inputs that produced it.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading