Skip to content

Model the Medicare Part D low-income subsidy as a CBO means-tested transfer - #10127

Draft
MaxGhenis wants to merge 3 commits into
cbo-medicare-net-of-premiumsfrom
medicare-part-d-lis
Draft

MaxGhenis wants to merge 3 commits into
cbo-medicare-net-of-premiumsfrom
medicare-part-d-lis

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

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

Summary

#10118 makes the default CBO household income count Medicare the way CBO does: net of premiums, and without the Part D low-income subsidy (LIS, "Extra Help"). CBO counts the LIS as a means-tested transfer instead. pe-us had no LIS variable, so after #10118, CBO income after transfers lacked the LIS: about $18 billion in 2026, which #10118 removes from Medicare at $255.86 per enrollee.

This PR models the LIS and adds it to gov.household.cbo_means_tested_transfers:

  • part_d_lis_eligible covers Medicare enrollees in the 50 states and DC who either are deemed eligible or pass the income and resource tests. Deemed means Medicaid enrollees, SSI recipients, and people eligible for a Medicare Savings Program.
  • part_d_lis gives each enrollee the Medicare Trustees' average subsidy per LIS enrollee, which is CBO's measure. That is $1,254 in 2026.
  • Six parameters under gov.hhs.medicare.part_d.low_income_subsidy, one calibration series, a programs.yaml entry, and a take-up flag.

The LIS is added to CBO's means-tested list only. household_benefits, household_net_income and healthcare_benefit_value are unchanged. medicare_cost already includes the LIS inside Medicare spending per enrollee.

Why an average, not a computed benefit

Most of the LIS is the cost-sharing subsidy. That depends on each enrollee's drug use, and pe-us has no Part D claims. The premium subsidy depends on the region's benchmark premium and the plan chosen. CBO values the LIS the same way for everyone:

  • Habib 2018, CBO Working Paper 2018-07, file page 46: "CBO removes LIS benefits from its total Medicare benefits and assigns them separately. ... A pool of eligible recipients is created by identifying Medicare recipients who also receive at least one means-tested transfer ... Recipients are chosen at random from that pool until the total LIS population is accounted for, and an average LIS benefit is assigned to each imputed recipient."
  • CBO, January 2026: "LIS benefits are assigned to some Medicare recipients who, CBO estimates, also receive other means-tested transfers." CBO allocates insurance at "the average resource cost, which is total spending divided by the number of recipients."

This PR keeps CBO's average but takes eligibility from the law, not from CBO's pool. The Trustees publish the average directly: Table IV.B9's "Subsidy amount" per LIS enrollee (2026 report, file page 158; the 2025 report for 2015). Enrollment times the amount reproduces Table IV.B10's payments, for example 14.4 million × $1,254 = $18.1 billion in 2026.

Institutionalized enrollees. CBO removes institutionalized LIS recipients and their benefits (Habib 2018, file page 52). Its adjusted totals (file page 51) are:

Year CBO recipients CBO benefits CBO per recipient Trustees IV.B9 per enrollee
2015 10.7 million $22.6 billion $2,112 $2,112
2016 11.1 million $26.5 billion $2,387 $2,126

CBO's 2016 benefits come from its own baseline. Its recipient counts are 88–90% of the Trustees'. So the adjustment shows up mostly as fewer recipients, which the model's noninstitutional microdata already reflects.

Eligibility (law read this session)

Rule Source Code
Medicare enrollee, enrolled in a PDP or MA-PD 42 U.S.C. 1395w-114(a)(3)(A); 42 CFR 423.773(a); 20 CFR 418.3101 defined_for = "medicare_enrolled"; Part D enrollment is folded into take-up
Income below 150% of the poverty guideline for the family size (a)(3)(A)(ii); 423.773(a)(1); POMS HI 03020.055 part_d_lis_income_eligible
Family size: the person, a spouse living with them, and relatives who depend on them for at least half their support 42 CFR 423.772 part_d_lis_family_size: marital unit plus the tax unit's dependents for heads and spouses
Income is SSI income, without in-kind support and maintenance, of the person and the spouse "regardless of whether one or both of you apply or are eligible"; all interest and dividends excluded; the $20, $65 and one-half exclusions apply once to the couple (a)(3)(C)(i); 423.772; 20 CFR 418.3310, 418.3325, 418.3350(d); POMS HI 03020.050 part_d_lis_countable_income (uses _apply_ssi_exclusions)
Resources of the person and spouse ≤ the (E) standard: $10,000 / $20,000 in 2006, CPI-indexed, $16,590 / $33,100 in 2026 (a)(3)(E); 423.773(b)(2)(iii), (d)(2); POMS HI 03030.025 limit/individual.yaml, limit/couple.yaml
Plus $1,500 per person for burial funds, applied unless the applicant says none will be used 20 CFR 418.3425(j); POMS HI 03030.020, .025 burial_exclusion.yaml
Countable resources: liquid resources and non-home real property; life insurance excluded (a)(3)(G); 20 CFR 418.3405 sources.yaml: bank, stock and bond assets, the only inputs pe-us has
Deemed: full-benefit dual eligibles, SSI recipients, QMB/SLMB/QI (a)(3)(B)(v); 423.773(c)(1) part_d_lis_deemed_eligible
50 states and DC only (a)(3)(F); 20 CFR 418.3010(b)(11) ineligible_jurisdictions.yaml

Before 2024, income from 135% to 150% of the guideline, or resources between the lower (D) and the higher (E) limit, gave a partial subsidy. The Inflation Reduction Act (§ 11404) made all of it a full subsidy from 2024. The model uses the outer bound in every year, because CBO and this PR give every recipient the same average.

Enrollment. CMS enrolls Medicaid enrollees and SSI recipients in a plan with the subsidy without an application (423.773(c)(2); 423.34). So part_d_lis_enrolled is automatic for medicaid_enrolled or ssi > 0. Everyone else eligible needs takes_up_part_d_lis_if_eligible, which defaults to True. pe-us models Medicare Savings Program eligibility, not enrollment, so MSP-deemed people go through the flag too. Microcosm does not seed the flag yet, so in the microsimulation everyone eligible takes it up. See Impact.

Values

  • Resource limits. All 21 years, 2006–2026, are transcribed from POMS HI 03030.025. Before 2024 the parameter takes the higher of each pair.
    • The statute's rule reproduces every SSA amount except one: prior year × the September-to-September change in the not-seasonally-adjusted CPI-U, never lowered, rounded to $10. The exception is the 2015 couple limit, where SSA publishes $24,250 and the rule gives $24,260; the parameter keeps SSA's amount.
    • Checked against BLS CUUR0000SA0.
    • pe-us's own gov.bls.cpi.cpi_u holds seasonally adjusted values from 2024, so it does not reproduce 2025–2026. That is filed separately.
  • Per recipient. IV.B9, 2015–2035:
Year LIS enrollees (IV.B9) Per recipient Per Medicare enrollee (#10118)
2015 12.1 million $2,112 $460.52
2020 13.1 million $2,507 $524.75
2024 14.5 million $2,833 $605.29
2025 14.2 million $1,226 $251.12
2026 14.4 million $1,254 $255.86
2030 15.8 million $1,833 $377.29
2035 16.7 million $2,076 $431.59

2025 is the first year of the IRA Part D redesign, which moved spending from the LIS to the direct subsidy (2026 report, file page 119). From 2036 the series grows with calibration.gov.hhs.medicare.per_capita_cost, like the per-enrollee series beside it.

Impact

Pending: a 2026 microsimulation of this branch on the default dataset is queued on the shared heavy lock (24th in line when queued). The base is #10118's head (3d8bb6d), whose output #10118's own run produces.

Invariants and tests

YAML: 47 cases across 9 files in tests/policy/baseline/gov/hhs/medicare/part_d/low_income_subsidy/. They include:

  • the exact boundaries: income at 150% of the guideline fails, and resources at the limit plus the burial exclusion pass while one dollar more fails;
  • Alaska, Puerto Rico and DC;
  • the 2023 partial-subsidy range;
  • households computed from their inputs through MSP deeming and through the LIS's own tests.

cbo_household_income.yaml gains a case where the LIS is the only means-tested transfer, and its list test now includes part_d_lis (and msp, which does not count).

Python, tests/core/test_part_d_lis.py (73 cases, 27 s locally):

  1. Transcription: the per-recipient series equals IV.B9.
  2. Conservation: IV.B9 enrollment × amount reproduces IV.B10 within the cells' rounding.
  3. Differential: the same payments over V.B3 total enrollment equal Count Medicare net of premiums in CBO household income #10118's per-enrollee series, which comes from different cells, within 0.5%.
  4. Indexing: every resource limit follows the statute's CPI rule from the 2006 amounts, with the one labeled SSA exception.
  5. Bounds (Hypothesis, 2015–2100): the amount is positive and below Medicare spending per enrollee, and the limits never fall.
  6. Restated rules: a seeded sample of 300 households (448 adults), each also run with more Social Security, more interest and more assets in one shared simulation. Checked against rules restated in the test, not the formulas:
    • countable income and family size;
    • the income and resource tests, eligibility and enrollment;
    • the benefit is zero or the year's amount.
  7. Interest and dividends never change countable income, eligibility or the benefit.
  8. Monotonicity: more Social Security never makes someone income eligible, and more assets never make someone resource eligible.
  9. Spouses get the same countable income, family size and test results.
  10. Differential against MSP: with no interest or dividends, part_d_lis_countable_income equals 12 × msp_countable_income, a separate implementation of the same SSI exclusions (single and both-Medicare-eligible couples).

The sample reaches every branch: 197 deemed, 100 eligible through the tests alone, 46 eligible but not enrolled, 103 failing only the resource test and 88 failing only the income test. Four mutations were each caught: income limit 1.45, interest counted, <= at the income limit, and one burial exclusion per couple.

Local runs: the Medicare and CBO YAML directories (271 cases), plus test_programs_registry.py, test_aggregate_list_integrity.py, test_spm_integration_contract.py, test_cbo_medicare_benefit_series.py and this file: 1,056 passed.

Not modeled and follow-ups

  • Take-up of non-automatic enrollees. The flag defaults to True. Microcosm should seed it, or count-calibrate it to IV.B9 enrollment (follow-up below).
  • Retirement accounts and non-home real property count as LIS resources (20 CFR 418.3405), but pe-us has no inputs for them.
  • Institutionalized enrollees are discussed above. The average is kept.
  • The premium and cost-sharing subsidy amounts, including the pre-2024 partial subsidy's sliding scale, are not computed per person.

axiom: TheAxiomFoundation/rulespec-us#1681 queued (42 U.S.C. 1395w-114(a)(3) and 42 CFR 423.772–773; corpus has both, but the rulespec pin predates them; 20 CFR 418 ingestion is TheAxiomFoundation/axiom-corpus#818)

Sources

Source URL Retrieved
42 U.S.C. 1395w-114 https://www.law.cornell.edu/uscode/text/42/1395w-114 2026-10-11
42 CFR 423.772, 423.773, 423.34 (eCFR, 2026-10-01) https://www.ecfr.gov/current/title-42/chapter-IV/subchapter-B/part-423 2026-10-11
20 CFR 418 subpart D (eCFR, 2026-10-01) https://www.ecfr.gov/current/title-20/chapter-III/part-418/subpart-D 2026-10-11
SSA interim final rule, 75 FR 81843 (effective 2011-01-01) https://www.federalregister.gov/documents/2010/12/29/2010-32848 2026-10-11
SSA POMS HI 03020.010, .030, .050, .055; HI 03030.020, .025 https://secure.ssa.gov/poms.nsf/lnx/0603030025 2026-10-11
2026 Medicare Trustees Report (sha256 ffa56b91…8fa8) https://www.cms.gov/oact/tr/2026 2026-10-11
2025 Medicare Trustees Report (sha256 1b3de7a4…4d95) https://www.cms.gov/oact/tr/2025 2026-10-11
Habib, CBO WP 2018-07 https://www.cbo.gov/system/files/2018-07/54234-workingpaper.pdf 2026-10-11 (browser)
CBO, January 2026 health insurance sensitivity report https://www.cbo.gov/publication/61910 2026-10-11 (browser, via #10118's notes)
BLS CPI-U, CUUR0000SA0 https://api.bls.gov/publicAPI/v2/timeseries/data/ 2026-10-11

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 11, 2026 16:57
…ans-tested transfer

Adds statutory eligibility for the Part D low-income subsidy (Extra Help):
countable income below 150% of the poverty guideline for the family size,
countable resources within the CPI-indexed limit plus the burial funds
exclusion, and deemed eligibility for Medicaid enrollees, SSI recipients and
Medicare Savings Program enrollees. The subsidy is valued at the Medicare
Trustees' average payment per subsidy enrollee (Table IV.B9), as CBO assigns
it, and joins gov.household.cbo_means_tested_transfers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML tests for every new variable, households computed from their inputs
(Medicare Savings Program deeming, the subsidy's own tests, the pre-2024
partial range, take-up), and the CBO means-tested list. Python invariants:
IV.B9 transcription, IV.B10 conservation, agreement with the per-enrollee
series cbo_medicare_benefit subtracts, the CPI rule behind the resource
limits, Hypothesis bounds, restated eligibility rules over a seeded sample
with income, interest and asset variants, and a differential test against
msp_countable_income.

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

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