Skip to content

Add Medicare Part D IRMAA surcharge modeling #7949

@MaxGhenis

Description

@MaxGhenis

Problem

policyengine-us currently models Medicare Part A premiums, Part B base premiums, and Part B IRMAA, but it does not expose a Medicare Part D income-related monthly adjustment amount (IRMAA) variable.

That leaves a gap for retirement and household tax/benefit modeling: high-income Medicare beneficiaries can face additional federally set Part D charges even when the underlying Part D plan premium is plan-specific.

Why this matters

Part D base premiums vary by plan, so a fully modeled total Part D premium may require an input variable or plan-specific assumption. But the IRMAA surcharge itself is federally set, depends on filing status and MAGI from two years prior, and can be modeled cleanly today.

Proposed scope

Add a variable for the federally defined Part D IRMAA surcharge, for example:

  • income_adjusted_part_d_premium_surcharge
  • part_d_irmaa_surcharge

Design notes:

  • use MAGI from two years prior, matching existing Part B IRMAA logic
  • use the same filing-status buckets already modeled for Part B (SINGLE, JOINT, HEAD_OF_HOUSEHOLD, SURVIVING_SPOUSE, SEPARATE)
  • return the annual surcharge amount (monthly surcharge × 12)
  • do not imply a total Part D premium unless a separate plan premium input exists

Legal basis

The controlling source is the Social Security Act and implementing regulations.

  • Statute: 42 U.S.C. § 1395w-113(a)(7)
    • This provides that the Part D beneficiary premium is increased for higher-income individuals and ties the threshold / MAGI framework to section 1839(i), codified at 42 U.S.C. § 1395r(i).
  • Regulation: 42 CFR § 423.286(d)(4)
    • This says Medicare Part D enrollees must pay an income-related monthly adjustment amount in addition to the Part D premium.
  • SSA administration / collection rules: 20 CFR Part 418, Subpart C
    • Especially §§ 418.2101, 418.2112, 418.2120, and 418.2125.

Annual values source

The annual 2024 / 2025 bracket thresholds and surcharge amounts themselves come from CMS fact sheets:

Current repo context

Relevant existing code:

  • policyengine_us/variables/gov/hhs/medicare/eligibility/part_b/income_adjusted_part_b_premium.py
  • policyengine_us/parameters/gov/hhs/medicare/part_b/irmaa/*

I plan to open a PR for the surcharge-only variable unless there is a different preferred naming or scope.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions