Skip to content

Subtract the expected Part D premium from medicare_cost - #10111

Draft
MaxGhenis wants to merge 5 commits into
mainfrom
medicare-cost-part-d-premiums
Draft

MaxGhenis wants to merge 5 commits into
mainfrom
medicare-cost-part-d-premiums

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Draft: waiting on the microsim and independent review. Stacked on #10107. That PR sets calibration.gov.hhs.medicare.per_capita_cost to CMS NHE Medicare spending per enrollee, which covers Parts A through D, gross of the premiums that finance it. medicare_cost, the net value of Medicare (a program statistic in policyengine.py's US_PROGRAMS), subtracted only the Part A and gross Part B premiums. So for every Medicare enrollee it overstated Medicare's net value by the Part D premiums that pay for part of that spending.

Change

medicare_cost also subtracts an expected Part D premium:

part_d.enrollment_share × (part_d.premiums_per_enrollee + income_adjusted_part_d_premium_surcharge)

No variable records Part D enrollment, so the premium is weighted by the Part D enrollment share. Both series are new, under calibration.gov.hhs.medicare.part_d, and come from the 2026 Medicare Trustees Report (cites are file pages):

Series Definition Years
premiums_per_enrollee (Table III.D3 premium income − Table V.E4 aggregate Part D IRMAA) ÷ Table V.B3 Part D enrollment, annual $ 2015–2035; 2036–2100 grow at the 2034–2035 rate (3.3%)
enrollment_share Table V.B3 Part D ÷ total ("HI and/or SMI coverage") enrollment 2015–2035 annual, then every fifth year to 2100
Year Premiums per Part D enrollee Share Expected premium per Medicare enrollee, before IRMAA
2015 $277.60 0.7517 $208.67
2024 $307.70 0.8117 $249.76
2025 $220.25 0.8191 $180.41
2026 $289.79 0.8195 $237.48
2030 $637.06 0.8382 $533.98
2035 $722.05 0.8485 $612.66

2025 dips because of the voluntary Part D premium demonstration (page 109). 2030 jumps with the Inflation Reduction Act's reset of the base beneficiary premium percentage (page 152).

medicare_gross_cost is unchanged.

Why this premium, and not the base beneficiary premium

The brief suggested base beneficiary premium × enrollment share + IRMAA. The Trustees Report shows that would overstate what enrollees pay:

  • "The average paid premium has always been lower than the base beneficiary premium." In 2025 the average paid premium was $23.95 a month (pages 216–217), against a $36.78 base beneficiary premium.
  • Low-income subsidy enrollees "pay substantially reduced premium and cost-sharing amounts" (page 219). There were 14.2 million of them among 56.8 million Part D enrollees in 2025 (Table IV.B7, page 153). Medicare's low-income subsidy payments are Part D account expenditures, not enrollee premiums (page 114).
  • So base premium × Part D enrollment comes to $25.0 billion in 2025, against $12.5 billion of premiums net of IRMAA ($14.9 billion including IRMAA, Table III.D1, page 109).

What the series measures, from the sources:

  1. NHE spending is gross of Part D premiums. NHE Medicare spending covers Parts A–D and the plans' non-medical costs (NHEA methodology, pages 15 and 23). The SMI trust fund "is financed through general revenues, premiums (Part B, Part D, and Medicare premium buy-in programs by Medicaid), state phase-down payments, and interest income" (pages 29–30).
  2. Premium income counts every channel. Table III.D3, footnote 1: "Premiums include both amounts withheld from Social Security benefits or other Federal payments, direct payments to the Federal government, and those paid directly to Part D plans." Premiums paid directly to plans finance part of Part D benefits and are included in both income and expenditures (page 110).
  3. IRMAA is inside premium income, so it is taken out and charged per person instead. Part D IRMAA "shall be paid through withholding from benefit payments" (42 U.S.C. 1395w-113(c)(4)(A)) and "is deposited into the Part D account" (footnote 73, page 151). Table V.E4 gives its aggregate. medicare_cost subtracts the person's own income_adjusted_part_d_premium_surcharge, times the share, as it already subtracts the person's own Part B IRMAA.
  4. Timing. Table III.D3 is on a cash basis. Footnote 6 (page 117) credits one January's withheld premiums on December 31 of the prior year: $0.2 billion in 2015, $0.1 billion in 2020 and an estimated $0.2 billion in 2026. Those amounts are moved to 2016, 2021 and 2027.
  5. Identity. share × premiums_per_enrollee = (premium income − IRMAA) ÷ total enrollment. So the uniform part reproduces the Trustees' aggregate per Medicare enrollee. 2025: 0.8191 × $220.25 = $180.41, and $180.41 + $2.4B ÷ 69.289M = $215.04 = $14.9B ÷ 69.289M.
  6. Extension. The premium grows at its own 2034–2035 rate (3.3%), not at per_capita_cost's 5.4%. The Trustees project Part D cost per beneficiary growing 3.1% in 2035 against 5.4% for all of Medicare (Table V.D1, page 210), and Part D near 0.76% of GDP through 2045 (Table III.D6).

Alternatives rejected:

  • One uniform premium that includes IRMAA. It drops the person-level IRMAA that medicare_cost already applies for Part B.
  • Full IRMAA without the share. It assumes every high-income enrollee is in Part D.
  • Modeling Part D or LIS enrollment. That needs a new program model and is out of scope. LIS enrollees pay little or no premium, so the uniform average understates their Medicare value and overstates everyone else's slightly.

medicare_gross_cost stays gross

medicare_gross_cost feeds cbo_household_social_insurance_benefits and is a gross concept by name and docstring, so it stays unchanged. CBO's standard household-income measure, however, counts Medicare "net of premiums paid by enrollees", for Parts A, B and D. "Gross Medicare spending" appears only in CBO's expanded sensitivity measure (CBO, January 2026). Aligning pe-us's default CBO household income with that is a separate change, proposed as its own follow-up session.

Household-level changes (YAML tests)

Case Before After
2025, premium-free Part A, standard Part B $15,531 $15,350.59
2025, single, $500k MAGI (top Part D IRMAA, $1,029.60 a year) $10,204.20 $9,180.45
2021, premium-free Part A $12,511 $12,271.87

New cases cover a 2025 middle IRMAA tier, 2027, the 2030 reset with IRMAA, and the zero floor. Projected-year cases take the Part B premium and Part D IRMAA as inputs, so they hold when #10103's premium projections land.

Microsim impact

Pending: heavy-lock pair (base #10107 head 33a94b4, PR 712abd3), 2026 and 2034, queued 14:57 EDT.

Invariants (tested)

policyengine_us/tests/core/test_medicare_cost_part_d_premium.py:

  1. Transcription. Every value equals its formula applied to the Trustees' published cells, rounded as stored: 21 premium values and 34 share values.
  2. Conservation. Premiums per Part D enrollee × Part D enrollment + aggregate IRMAA returns Table III.D3's premium income in every year from 2015 to 2035.
  3. Bounds (Hypothesis).
    • The share is strictly between 0 and 1, and the premium is positive, in every year from 2015 to 2200.
    • The monthly premium is below the Trustees' average paid premium in 2025 and 2026.
  4. Extension (Hypothesis).
    • 2036–2100 equals the closed form 722.05 × (722.05 / 699.07)^(year − 2035), and later years hold the 2100 value.
    • The rate is within 0.5 points of the Trustees' 2035 Part D cost growth.
  5. Calendar years (Hypothesis).
    • Every date in a year reads the January value.
    • Between the five-year points, the share holds the earlier one.
  6. Consumer (Hypothesis, differential). Over years 2015–2100 and arbitrary Part A, Part B and IRMAA inputs:
    • medicare_cost equals a reference implementation.
    • 0 ≤ medicare_cost ≤ medicare_gross_cost.
    • medicare_gross_cost does not depend on the Part D premium.
    • medicare_cost does not rise with the person's IRMAA.

Mutation checks each failed at least one test:

  • dropping the IRMAA term;
  • dropping the share;
  • dropping the zero floor;
  • a one-digit typo in the 2050 share;
  • removing the extension.

#10107's consumer invariant (test_medicare_per_capita_cost.py) now includes the Part D term.

Sources

Source URL Retrieved sha256
2026 Medicare Trustees Report https://www.cms.gov/oact/tr/2026 2026-10-11 ffa56b9137006872300b0346149eae1613d09a172b6ba118aad48e66dfc48fa8
NHEA methodology paper, 2024 https://www.cms.gov/files/document/definitions-sources-and-methods.pdf 2026-10-11 9c5755666847a78103016f04da937326744071a9a6736f4e77e91ce9e7af8629
42 U.S.C. 1395w-113 https://www.law.cornell.edu/uscode/text/42/1395w-113 2026-10-11 page HTML, in evidence folder
CBO, Sensitivity of the Distribution of Household Income to the Treatment of Health Insurance From 1979 to 2021 https://www.cbo.gov/publication/62544 2026-10-11 read in browser

Interactions

Tests run

Locally: test_medicare_cost_part_d_premium.py (85 passed), test_medicare_per_capita_cost.py + test_part_b_msp_offset.py + test_uprating_extensions.py (113 passed), Medicare YAML directory (212 passed). CI runs once the base is main (after #10107 merges).

axiom: n/a: valuation of Medicare benefits from Trustees aggregates, not a statutory provision

🤖 Generated with Claude Code

MaxGhenis and others added 5 commits October 11, 2026 12:59
Replace KFF's 2021 traditional-Medicare figure and an unsourced $14,500
2025 estimate (held flat for every later year) with CMS National Health
Expenditure Table 17's Medicare spending per enrollee: historical
2013-2024, projected 2025-2034, extended to 2100 at the 2031-2032 rate
so the end of sequestration in 2033 does not compound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Transcription checks against NHE Table 17 (and its spending over
enrollment), a cross-source level check against the Trustees Report's
per beneficiary cost, Hypothesis properties for order, the 2035-2100
closed form and calendar-year steps, and identities for
medicare_gross_cost, medicare_cost and qmb_cost_sharing. Existing
expectations move from $14,500/$11,080 to the CMS values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CMS Medicare spending per enrollee (calibration.gov.hhs.medicare.per_capita_cost,
#10107) includes Part D, which enrollee premiums
partly finance, but medicare_cost subtracted only Part A and Part B premiums.
It now also subtracts the Part D enrollment share times (Part D premiums per
Part D enrollee + the person's Part D IRMAA), both new calibration series from
the 2026 Medicare Trustees Report (Tables III.D3, V.E4 and V.B3).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Transcription from the Trustees' cells, conservation back to Table III.D3
premium income, bounds, the 2036-2100 extension's closed form, and a
Hypothesis differential test of medicare_cost against a reference
implementation (0 <= net <= gross, non-increasing in Part D IRMAA).

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

Copy link
Copy Markdown
Contributor Author

Heads-up from #10115, which charges income_adjusted_part_d_premium_surcharge only to Part D enrollees. It adds medicare_part_d_enrolled, defined for medicare_enrolled and driven by a new takes_up_medicare_part_d_if_eligible input that defaults to true.

This PR subtracts part_d.enrollment_share × (premiums_per_enrollee + income_adjusted_part_d_premium_surcharge). That expected-value form is right while the surcharge reaches every Medicare enrollee. Once microdata set Part D take-up, the surcharge is already zero for non-enrollees, and multiplying it by enrollment_share would count non-enrollment twice.

Options, after both merge:

  • If medicare_part_d_enrolled is known per person, subtract medicare_part_d_enrolled × premiums_per_enrollee + income_adjusted_part_d_premium_surcharge.
  • Otherwise, keep the expected value on the base premium only, and subtract the surcharge as it stands.

With the default input the two PRs give the same numbers today: git merge-tree is clean, and base and #10115 match exactly on the certified file. So this is not blocking. It is a note for whichever PR merges second.

MaxGhenis added a commit that referenced this pull request Oct 11, 2026
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>
Base automatically changed from medicare-per-enrollee-cms to main October 12, 2026 12:21

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