Skip to content

Impute selected_marketplace_plan_benchmark_ratio per household via CPS premium back-out #800

@MaxGhenis

Description

@MaxGhenis

Follow-up to #618 (ACA marketplace bronze-selection target ETL).

Context

#618 adds state-level calibration targets for (a) total APTC-taking marketplace tax units and (b) bronze-plan subset, derived from CMS 2024 state-metal data. That constrains the aggregate distribution of the microsim weights.

What's still missing is a per-household value for selected_marketplace_plan_benchmark_ratio (currently an input variable defaulting to 1.0, meaning "silver benchmark" for everyone). Without a populated per-household ratio, the rules-based marketplace_net_premium (PolicyEngine/policyengine-us#8105) returns the silver-benchmark net premium regardless of which plan a household actually picked. That overstates OOP for bronze pickers (~35% of enrollees) and understates it for gold pickers.

Approach: back-out from CPS reported premium

For Marketplace enrollees in CPS, the reported premium is (approximately) the net premium paid after APTC. The accounting identity:

reported_net_premium = selected_plan_cost − APTC_received
selected_plan_cost   = SLCSP × benchmark_ratio

gives us:

benchmark_ratio = (reported_net_premium + computed_PTC) / SLCSP

Per Marketplace-enrolled CPS record:

  1. Read the CPS reported premium (annualize if monthly).
  2. Compute SLCSP at the household's state, year, and family composition.
  3. Compute PolicyEngine's PTC given income, filing status, ages, and SLCSP.
  4. Set selected_marketplace_plan_benchmark_ratio = (cps_premium + computed_ptc) / slcsp.
  5. Clip to a reasonable window (e.g., 0.5 to 1.5) to handle measurement noise / Marketplace-flag confusion.

Non-Marketplace households keep the default 1.0 (won't affect their computed net premium because selected_marketplace_plan_premium_proxy is zeroed by takes_up_aca_if_eligible gating).

Where it lives

us-data imputation step. Most likely in policyengine_us_data/db/etl_* as a new etl_marketplace_plan_selection.py or as additions to an existing health-coverage ETL.

Caveats

  • Marketplace flag noise — CPS respondents confuse Marketplace with Medicaid, CHIP, employer coverage. Use the cleanest available CPS coverage-source flag (COV_MRK / MRKS style). Clipping catches most false positives.
  • APTC vs reconciled PTC divergence — households receive APTC at enrollment based on projected income and reconcile at tax time against actual. Reported premium may be net-of-APTC, not net-of-reconciled. Minor noise source.
  • CSR silver variants — cost-sharing-reduction silver plans have reduced deductibles/copays but the plan sticker premium is the same as regular silver. The back-out still lands on silver (ratio ≈ 1.0) for these, which is correct for premium purposes even if plan value differs. No adjustment needed here.
  • Non-takers who report $0 premium — their back-out is (0 + 0) / SLCSP = 0. That's fine — silver gating on takes_up_aca_if_eligible will still produce $0 premium; the ratio doesn't matter.
  • Pre-2014 CPS years — no Marketplace existed; ratio imputation should be gated on period ≥ 2014.

Sanity check

After imputation, the weighted distribution of ratios across Marketplace enrollees should approximate CMS effectuated metal-tier shares:

  • ~0.75–0.85 (bronze) for ~30–35%
  • ~0.95–1.05 (silver / silver-CSR) for ~45%
  • ~1.10–1.20 (gold) for ~15%
  • ~1.25+ (platinum / catastrophic) for ~5%

If the distribution is badly skewed, it signals either the Marketplace flag is too inclusive or the PTC back-out is off (wrong SLCSP match, filing-status misalignment, etc.).

Integration with #618

#618's state-level target can be used as a calibration check on the per-household imputation:

Upstream dependency

The corresponding PolicyEngine/policyengine-us work is tracked in PolicyEngine/policyengine-us#8095 (rules-based Marketplace net premium) — marketplace_net_premium already shipped there (PR #8105); this us-data follow-up populates its input.

Acceptance

  • New ETL step populates selected_marketplace_plan_benchmark_ratio on the enhanced CPS microdata for Marketplace-flagged households.
  • Weighted ratio distribution roughly matches CMS metal-tier shares; marketplace_net_premium aggregate (via the new variable from Add marketplace_net_premium variable (Marketplace premium net of PTC) policyengine-us#8105) is within a documented tolerance of CMS effectuated-premium totals.
  • Unit test in tests/unit/ that verifies the back-out identity on a few synthetic households.

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