Problem
PolicyEngine-US has Medicare premium variables that are currently not connected to the SPM/MOOP premium aggregation path:
income_adjusted_part_d_premium_surcharge computes the annual Medicare Part D income-related monthly adjustment amount for enrolled Medicare beneficiaries.
base_part_a_premium computes paid Medicare Part A premiums for people who do not qualify for premium-free Part A.
spm_unit_health_insurance_premiums only adds other_health_insurance_premiums, chip_premium, medicaid_premium, marketplace_net_premium, and medicare_part_b_premium.
spm_unit_medical_out_of_pocket_expenses then uses spm_unit_health_insurance_premiums, so these missing Medicare premiums also drop out of SPM expenses.
This means modeled MOOP/SPM expenses include Part B premiums but omit modeled Part D IRMAA and paid Part A premiums.
Evidence in current model
Relevant files:
policyengine_us/variables/gov/hhs/medicare/eligibility/part_d/income_adjusted_part_d_premium_surcharge.py
policyengine_us/variables/gov/hhs/medicare/eligibility/part_a/base_part_a_premium.py
policyengine_us/variables/household/income/spm_unit/spm_unit_health_insurance_premiums.py
policyengine_us/variables/household/income/spm_unit/spm_unit_medical_out_of_pocket_expenses.py
Example output for a 2026 Medicare enrollee with 0 Medicare quarters and high prior-year income:
base_part_a_premium [6780.]
gross_medicare_part_b_premium [4654.8]
medicare_part_b_premium [4654.8]
income_adjusted_part_d_premium_surcharge [423.6]
spm_unit_health_insurance_premiums [4654.8]
spm_unit_medical_out_of_pocket_expenses [4654.8]
The SPM premium total equals only the modeled Part B premium. It excludes the modeled Part A premium and modeled Part D IRMAA surcharge.
Why this matters
This affects household-level SPM resources, poverty measures, and reform analyses that use modeled medical out-of-pocket expenses. It also matters for budget-style analyses if we are using these modeled premium variables to validate or decompose Medicare-related household costs.
CMS states that some Medicare beneficiaries pay a monthly Part A premium when they do not have enough quarters of coverage, and that high-income Part D beneficiaries pay IRMAA in addition to their plan premium:
Possible implementation approach
- Add
income_adjusted_part_d_premium_surcharge to spm_unit_health_insurance_premiums if we intend modeled Part D IRMAA to count as a household premium expense.
- Add
base_part_a_premium, or a net paid Part A premium variable, for Medicare enrollees who owe Part A premiums.
- Consider whether Part D base plan premiums should also be represented separately. The current variable only captures the income-related surcharge, not the underlying plan premium.
- Add regression tests showing that a Medicare enrollee with paid Part A and nonzero Part D IRMAA has those amounts reflected in
spm_unit_health_insurance_premiums and spm_unit_medical_out_of_pocket_expenses.
Related but broader issues include #8089 and #8095. This issue is the narrower Medicare premium wiring gap.
Problem
PolicyEngine-US has Medicare premium variables that are currently not connected to the SPM/MOOP premium aggregation path:
income_adjusted_part_d_premium_surchargecomputes the annual Medicare Part D income-related monthly adjustment amount for enrolled Medicare beneficiaries.base_part_a_premiumcomputes paid Medicare Part A premiums for people who do not qualify for premium-free Part A.spm_unit_health_insurance_premiumsonly addsother_health_insurance_premiums,chip_premium,medicaid_premium,marketplace_net_premium, andmedicare_part_b_premium.spm_unit_medical_out_of_pocket_expensesthen usesspm_unit_health_insurance_premiums, so these missing Medicare premiums also drop out of SPM expenses.This means modeled MOOP/SPM expenses include Part B premiums but omit modeled Part D IRMAA and paid Part A premiums.
Evidence in current model
Relevant files:
policyengine_us/variables/gov/hhs/medicare/eligibility/part_d/income_adjusted_part_d_premium_surcharge.pypolicyengine_us/variables/gov/hhs/medicare/eligibility/part_a/base_part_a_premium.pypolicyengine_us/variables/household/income/spm_unit/spm_unit_health_insurance_premiums.pypolicyengine_us/variables/household/income/spm_unit/spm_unit_medical_out_of_pocket_expenses.pyExample output for a 2026 Medicare enrollee with 0 Medicare quarters and high prior-year income:
The SPM premium total equals only the modeled Part B premium. It excludes the modeled Part A premium and modeled Part D IRMAA surcharge.
Why this matters
This affects household-level SPM resources, poverty measures, and reform analyses that use modeled medical out-of-pocket expenses. It also matters for budget-style analyses if we are using these modeled premium variables to validate or decompose Medicare-related household costs.
CMS states that some Medicare beneficiaries pay a monthly Part A premium when they do not have enough quarters of coverage, and that high-income Part D beneficiaries pay IRMAA in addition to their plan premium:
Possible implementation approach
income_adjusted_part_d_premium_surchargetospm_unit_health_insurance_premiumsif we intend modeled Part D IRMAA to count as a household premium expense.base_part_a_premium, or a net paid Part A premium variable, for Medicare enrollees who owe Part A premiums.spm_unit_health_insurance_premiumsandspm_unit_medical_out_of_pocket_expenses.Related but broader issues include #8089 and #8095. This issue is the narrower Medicare premium wiring gap.