Skip to content

Count Medicare net of premiums in CBO household income - #10118

Draft
MaxGhenis wants to merge 2 commits into
medicare-cost-part-d-premiumsfrom
cbo-medicare-net-of-premiums
Draft

MaxGhenis wants to merge 2 commits into
medicare-cost-part-d-premiumsfrom
cbo-medicare-net-of-premiums

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #10111 (which is stacked on #10107). Retargets to main once those merge.

Summary

The default CBO household income (cbo_household_income, income before means-tested transfers and federal taxes) counted Medicare with medicare_gross_cost: CMS Medicare spending per enrollee, gross of the premiums that finance it and including the Part D low-income subsidy (LIS). CBO's standard measure counts Medicare at the government's average cost per enrollee, net of premiums paid by enrollees, and counts the LIS separately, as a means-tested transfer.

This PR:

  • adds cbo_medicare_benefit = Medicare spending per enrollee − Part A, B and D premium income per Medicare enrollee − Part D LIS per Medicare enrollee, the same for every enrollee;
  • puts it in gov.household.cbo_social_insurance_benefits in place of medicare_gross_cost;
  • adds the four per-enrollee series from the 2026 Medicare Trustees Report under calibration.gov.hhs.medicare (premium_income_per_enrollee.part_a/part_b/part_d, part_d_low_income_subsidy_per_enrollee);
  • fixes the medicare_gross_cost docstring, which said gross Medicare "matches the gross Medicare benefit concept used in the CBO household-income framework". It matches only CBO's expanded sensitivity measure.

medicare_gross_cost and medicare_cost are unchanged. pe-us has no expanded CBO measure, so no gross variant is needed in the CBO lists.

What CBO does

cbo.gov blocks automated fetches; these were read in a browser on 2026-10-11 (page numbers are PDF file pages).

The three questions

  1. Per person or average? Average. CBO assigns every enrollee the same value. So cbo_medicare_benefit subtracts the average premium income per enrollee, not the person's own premiums. That is why it is a new variable rather than medicare_cost, which subtracts each person's Part A premium and income-related premiums. Under medicare_cost, a 2025 enrollee with 20 quarters of coverage would get $9,135 and a $1 million earner $9,180, against $15,351 for others. Under CBO's method all three get $15,033.
  2. Medicaid-paid (buy-in) premiums. These are netted in the standard measure, which is "net of offsetting receipts". The Trustees' premium income counts premiums paid "by (or on behalf of)" enrollees (file page 88), so it includes buy-ins. The 2026 report's footnote 3, "Some Medicare premiums are paid by Medicaid; those premiums are counted as Medicare spending in this analysis", describes the expanded measure, which adds premiums back.
  3. Part C. It counts, inside Parts A and B. Medicare's payments to Medicare Advantage plans are in NHE Medicare spending (NHEA methodology, file page 16). Medicare Advantage premiums deducted from Social Security pass through the trust funds and are netted. They total $0.64 billion in 2025 (Tables III.B1, III.C1), about $9 per enrollee, and are not modeled. Premiums paid directly to plans are in neither NHE spending nor either CBO measure.

The series

Each series is a Trustees aggregate over Table V.B3's total enrollment ("Number of beneficiaries with HI and/or SMI coverage"), in dollars per Medicare enrollee per year. Every cell was checked on the rendered page.

Series Source (2026 Trustees Report, file page) Notes
Part A III.B4 "Premiums from voluntary enrollees" (64) Paid "by or on behalf of" voluntary enrollees (glossary, 257)
Part B III.C7 incurred premium income (102), 2015–2026; III.C4 cash (96), 2027–2035 III.C4 footnote 7's Dec 31, 2026 credit (174.8 − 173.228 = 1.572) is moved to 2027. Includes income-related premiums: 2019 standard premium × enrollment + V.E3 IRMAA = $99.5B vs $99.4B
Part D III.D3 premium income (116) Footnote 6 credits moved, as in #10111. Includes IRMAA and premiums paid directly to plans
Part D LIS IV.B10 (159); 2015 from the 2025 report's IV.B10 (159)

From 2036 each series carries uprating: calibration.gov.hhs.medicare.per_capita_cost, so it keeps its 2035 share of spending. Part B premium income per enrollee grows 7.3% in 2035; compounding that to 2100 would push premiums toward half of spending.

Year Spending per enrollee (gross) Part A Part B Part D Part D LIS cbo_medicare_benefit Net / gross
2015 11,929 58 1,215 225 461 9,972 83.6%
2020 13,547 64 1,729 250 525 10,980 81.0%
2024 16,779 71 2,054 282 605 13,767 82.0%
2025 17,751 82 2,169 215 251 15,033 84.7%
2026 18,983 98 2,449 281 256 15,900 83.8%
2030 23,789 118 3,179 675 377 19,440 81.7%
2035 31,764 156 4,652 810 432 25,715 81.0%
2050 70,189 345 10,279 1,790 954 56,821 81.0%

The 2025 LIS drop is the Trustees' own figures. 2025 is the first year of the full Inflation Reduction Act benefit redesign (file page 119). That year LIS per subsidy enrollee falls from $2,833 to $1,226 and the direct subsidy rises (IV.B9, file page 158).

Impact

Pending: a base (#10111 head 4024d2e) vs PR (3d8bb6d) microsimulation of cbo_household_income for 2026 on the default dataset is queued on the shared heavy lock.

Invariants and tests

Python, parameter reads only (tests/core/test_cbo_medicare_benefit_series.py, 197 cases, 10.6 s, 1.0 GB peak including the model import, local macOS):

  1. Transcription: every stored value equals the Trustees cells through the stated formula.
  2. Conservation: each series times total enrollment returns its published aggregate.
  3. Differential: the Part D series equals Subtract the expected Part D premium from medicare_cost #10111's part_d.enrollment_share × part_d.premiums_per_enrollee plus V.E4 IRMAA per enrollee. These are two derivations from different cells.
  4. Part B premium income includes IRMAA: checked against the 2019 identity, within 0.5%.
  5. Bounds (Hypothesis, 2015–2200): every series is positive, and 0 < net < gross.
  6. Extension: from 2036 to 2100 each series keeps its 2035 share of spending; after 2100 it holds the 2100 value.
  7. Calendar years: every date reads the January value.

YAML (cbo_medicare_benefit.yaml): 2015, 2025 and 2035 values; not enrolled gives 0. Five people in one household get the same value even though their premiums differ: Part A premium, IRMAA, under 65, not enrolled. cbo_household_income.yaml is updated to the net value.

Known unrelated failure on this stack: test_no_group_variables_in_person_adds.py::test_known_violations_only_shrink. Main fixed it in #10092, after the #10107 base was cut.

Not modeled and follow-ups

  • Part D LIS as a means-tested transfer. pe-us has no LIS model, so CBO income after transfers now lacks the LIS ($18.1B in 2026). Before this PR it was spread over all enrollees as social insurance. Follow-up: Model the Medicare Part D low-income subsidy as a CBO means-tested transfer #10127, stacked on this PR, models LIS and adds it to cbo_means_tested_transfers.
  • Institutionalized enrollees. CBO excludes their costs and counts. per_capita_cost averages all enrollees, and that affects every consumer. Follow-up: Scale Medicare per-enrollee spending to enrollees outside nursing homes #10126, stacked on this PR.
  • States' Part D phased-down contributions and inflation rebates. CBO's budget books these as Medicare offsetting receipts, and the 2021 report says "net of offsetting receipts". The 2026 report says "net of premiums paid by enrollees", and its expanded measure adds back premiums only. This PR nets premiums only. Netting the states' payments too would subtract about $291 per enrollee in 2026 (1.8%). The call is queued for Max.
  • Trustees totals include the territories, while NHE spending per enrollee excludes them. Both are per-enrollee averages.

Sources

Source URL Retrieved sha256
2026 Medicare Trustees Report https://www.cms.gov/oact/tr/2026 2026-10-11 ffa56b9137006872300b0346149eae1613d09a172b6ba118aad48e66dfc48fa8
2025 Medicare Trustees Report https://www.cms.gov/oact/tr/2025 2026-10-11 1b3de7a4faeee5ad42059e10740603182b716a5fa7b53b30d360b45b9e474d95
CBO, Jan 2026 health insurance sensitivity report https://www.cbo.gov/publication/61910 2026-10-11 (browser)
CBO, Distribution of Household Income in 2021 https://www.cbo.gov/system/files/2024-09/60341-income.pdf 2026-10-11 (browser)
Habib, CBO WP 2018-07 https://www.cbo.gov/system/files/2018-07/54234-workingpaper.pdf 2026-10-11 (browser)
CBO Medicare baseline, June 2024 https://www.cbo.gov/system/files/2024-06/51302-2024-06-medicare.pdf 2026-10-11 (browser)
NHEA methodology paper, 2024 https://www.cms.gov/files/document/definitions-sources-and-methods.pdf 2026-10-11 9c5755666847a78103016f04da937326744071a9a6736f4e77e91ce9e7af8629

axiom: n/a: CBO distributional income measure (analysis construct), not a statutory provision

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 11, 2026 15:50
CBO's standard household income counts Medicare at the government's
average cost per enrollee, net of premiums paid by enrollees, and counts
the Part D low-income subsidy separately as a means-tested transfer
(CBO, January 2026, publication 61910; Distribution of Household Income
in 2021, Appendix A; Habib 2018, Appendix B). The default list used
medicare_gross_cost, which is gross of premiums and includes the
subsidy.

Add cbo_medicare_benefit: Medicare spending per enrollee less
per-enrollee Part A, B and D premium income and the Part D low-income
subsidy per Medicare enrollee, from the 2026 Medicare Trustees Report.
Every enrollee gets the same value, as CBO assigns the average. Fix the
medicare_gross_cost docstring, which said gross matched CBO.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML: the 2025, 2015 and 2035 values, and five people with different
premiums (Part A premium, income-related premiums, under 65, not
enrolled) who all get the same average. Python, parameters only:
transcription and conservation against the Trustees cells, the Part D
series against #10111's share x premium plus income-related premiums,
Part B premium income including income-related premiums, bounds through
2200, the post-2035 extension keeping each series' share of spending,
and January reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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.

1 participant