Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/medicare-noninstitutional-spending.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Scale Medicare spending per enrollee to enrollees who do not live in nursing homes in medicare_gross_cost, medicare_cost, cbo_medicare_benefit and qmb_cost_sharing, since the survey data exclude nursing home residents.
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
description: PolicyEngine multiplies Medicare spending per enrollee by this ratio of Medicare spending per enrollee who is not a long-stay nursing home resident to Medicare spending per enrollee, because the household survey data exclude people living in nursing homes.
metadata:
unit: /1
period: year
label: Medicare noninstitutionalized spending ratio
reference:
# Medicare spending per enrollee (per_capita_cost) averages over every
# enrollee, including nursing home residents, whom the Current Population
# Survey does not sample. In 2022, among beneficiaries in fee-for-service
# Medicare, annual Part A and Part B program spending averaged $31,200 for
# long-stay nursing home residents and about $11,300 for other
# beneficiaries (June 2025, file page 9), and long-stay residents were 1.7
# percent of beneficiaries (October 2024, file page 5; 1.7 percent again in
# 2023, June 2025, file page 8). A long-stay resident had been in a nursing
# home for more than 90 days in at least one month of the year. So spending
# per other beneficiary relative to spending per beneficiary is
# 1 / (1 + 0.017 * (31_200 / 11_300 - 1)) = 0.971.
#
# The ratio is measured for fee-for-service Parts A and B and applied to
# all Medicare spending per enrollee, including Medicare Advantage, Part D
# and administration. With fee-for-service enrollment shares instead (62
# percent of long-stay residents, 53 percent of others, July 2023, file
# page 13) it is 0.966; pricing Medicare Advantage at the long-stay
# residents' risk score ratio (2.12 / 1.01, October 2024, file page 5) gives
# about 0.975. The long-stay share was 2.6 percent in 2013 (June 2025, file
# page 8), but relative spending is published for 2022 only, so the 2022
# ratio applies to every year from 2013, the first year of per_capita_cost.
#
# The Current Population Survey has never sampled institutional group
# quarters such as nursing homes. The Medicare Current Beneficiary Survey's
# long-term care facilities also include assisted living, retirement homes
# and personal care homes, which are not institutional group quarters;
# excluding all of their residents gives a larger gap (community residents'
# benefit payments per capita were 0.91 to 0.93 of the average in
# 2006-2013, Table 4.1 over Table 1.1).
- title: Medicare Payment Advisory Commission, Report to the Congress, June 2025, Chapter 5, Medicare beneficiaries in nursing homes
href: https://www.medpac.gov/wp-content/uploads/2025/06/Jun25_Ch5_MedPAC_Report_To_Congress_SEC.pdf#page=9
- title: Medicare Payment Advisory Commission, Medicare beneficiaries in nursing homes, October 2024 public meeting
href: https://www.medpac.gov/wp-content/uploads/2023/10/Beneficiaries-in-Nursing-Homes-MedPAC-Oct-2024-SEC.pdf#page=5
- title: U.S. Bureau of Labor Statistics, Handbook of Methods, Current Population Survey, Design
href: https://www.bls.gov/opub/hom/cps/design.htm
- title: Centers for Medicare and Medicaid Services, Characteristics and Perceptions of the Medicare Population, 2013, Table 4.1
href: https://www.cms.gov/research-statistics-data-and-systems/research/mcbs/downloads/2013_characteristics_and_perceptions.zip
# CBO likewise removes institutionalized enrollees' benefits before
# assigning Medicare's average cost to survey respondents (file page 46),
# with the institutional share held at its 2012 level from 2013 (file page
# 52).
- title: Congressional Budget Office, Working Paper 2018-07, How CBO Adjusts for Survey Underreporting of Transfer Income in Its Distributional Analyses
href: https://www.cbo.gov/system/files/2018-07/54234-workingpaper.pdf#page=46
values:
2013-01-01: 0.971
23 changes: 15 additions & 8 deletions policyengine_us/tests/core/test_cbo_medicare_benefit_series.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
CBO counts Medicare in household income at the government's average cost
per enrollee, net of premiums paid by enrollees, and counts the Part D
low-income subsidy separately. ``cbo_medicare_benefit`` takes CMS Medicare
spending per enrollee (``calibration.gov.hhs.medicare.per_capita_cost``) and
subtracts four series under ``calibration.gov.hhs.medicare``, each an
aggregate from the 2026 Medicare Trustees Report over Table V.B3's total
enrollment (people with Part A and/or Part B):
spending per enrollee (``calibration.gov.hhs.medicare.per_capita_cost``) less
the low-income subsidy, scales it to enrollees outside nursing homes
(``noninstitutionalized_spending_ratio``), and subtracts the premium series.
All four series under ``calibration.gov.hhs.medicare`` are aggregates from
the 2026 Medicare Trustees Report over Table V.B3's total enrollment (people
with Part A and/or Part B):

- ``premium_income_per_enrollee.part_a``: Table III.B4 premiums from
voluntary enrollees.
Expand Down Expand Up @@ -34,8 +36,10 @@
standard premium times Part B enrollment plus Table V.E3's aggregate
income-related premiums reproduces it within 0.5 percent, while the
standard premium alone falls more than 5 percent short.
5. Bounds: every series is positive, and net Medicare spending per enrollee
stays between 0 and gross spending, in every year from 2015 to 2200.
5. Bounds: every series is positive, and net Medicare spending per enrollee,
(spending - low-income subsidy) x the noninstitutionalized ratio -
premiums, stays between 0 and scaled gross spending, in every year from
2015 to 2200.
6. Extension: from 2036 to 2100 each series grows with Medicare spending
per enrollee, so each keeps its 2035 share of spending; later years hold
the 2100 value.
Expand All @@ -57,6 +61,7 @@
"lis": f"{MEDICARE}.part_d_low_income_subsidy_per_enrollee",
}
SPENDING = f"{MEDICARE}.per_capita_cost"
RATIO = f"{MEDICARE}.noninstitutionalized_spending_ratio"
FIRST_YEAR, LAST_PROJECTED_YEAR, END_YEAR = 2015, 2035, 2100
YEARS = range(FIRST_YEAR, LAST_PROJECTED_YEAR + 1)

Expand Down Expand Up @@ -193,9 +198,11 @@ def test_part_b_premium_income_includes_income_related_premiums():

@given(st.integers(FIRST_YEAR, END_YEAR + 100))
def test_series_are_positive_and_net_spending_is_between_zero_and_gross(year):
deductions = sum(_value(series, year) for series in SERIES)
ratio = _read(RATIO, f"{year}-01-01")
premiums = sum(_value(series, year) for series in SERIES if series != "lis")
net = (_spending(year) - _value("lis", year)) * ratio - premiums
assert all(_value(series, year) > 0 for series in SERIES)
assert 0 < _spending(year) - deductions < _spending(year)
assert 0 < net < _spending(year) * ratio


@pytest.mark.parametrize("series", SERIES)
Expand Down
14 changes: 9 additions & 5 deletions policyengine_us/tests/core/test_medicare_cost_part_d_premium.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
"""The expected Part D premium that ``medicare_cost`` subtracts.

CMS Medicare spending per enrollee (``calibration.gov.hhs.medicare.
per_capita_cost``) covers Parts A through D, gross of the premiums that
finance it. No variable records Part D enrollment, so ``medicare_cost``
subtracts an expected Part D premium:
per_capita_cost``, scaled by ``noninstitutionalized_spending_ratio`` to
enrollees outside nursing homes) covers Parts A through D, gross of the
premiums that finance it. No variable records Part D enrollment, so
``medicare_cost`` subtracts an expected Part D premium:

enrollment_share x (premiums_per_enrollee + Part D IRMAA)

Expand Down Expand Up @@ -35,7 +36,7 @@
the Trustees' five-year enrollment points the share holds the earlier one.
6. Consumer (Hypothesis, differential): ``medicare_cost`` equals a reference
implementation, max(gross - Part A - Part B - share x (premium + IRMAA),
0), for any year and premiums; it lies in [0, ``medicare_gross_cost``],
0) with gross = per_capita_cost x the ratio, for any year and premiums; it lies in [0, ``medicare_gross_cost``],
which does not change with the Part D premium; and it does not rise with
the person's Part D IRMAA.
"""
Expand Down Expand Up @@ -226,7 +227,10 @@ def _enrollee(year, part_a, part_b, irmaa):


def _reference_medicare_cost(year, part_a, part_b, irmaa):
gross = _read("calibration.gov.hhs.medicare.per_capita_cost", f"{year}-01-01")
date = f"{year}-01-01"
gross = _read("calibration.gov.hhs.medicare.per_capita_cost", date) * _read(
"calibration.gov.hhs.medicare.noninstitutionalized_spending_ratio", date
)
part_d = _share(year) * (_premium(year) + irmaa)
return max(gross - part_a - part_b - part_d, 0)

Expand Down
Loading