PolicyEngine / PolicyEngine/microcosm
Investigate ACA take-up and plan-choice inputs driving high PTC estimates
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 0
- Forks
- 4
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 94
Description
Context
PR #68 fixes several healthcare target-mapping bugs in the fiscal target registry. This issue tracks the remaining ACA data/calibration concerns that are intentionally out of scope for that PR.
What I observed
Using the published 2024 Populace dataset in a PolicyEngine-US microsimulation:
takes_up_aca_if_eligibleis true for every tax unit in the released HDF5.selected_marketplace_plan_benchmark_ratiois1.0for every tax unit in the released HDF5.- Because of those inputs,
assigned_aca_ptc,used_aca_ptc, and rawaca_ptcare identical in the current dataset. - Total PTC is about
$92.10B, and positive PTC returns are about12.95Mtax units.
Compared with the SOI TY2022 all-income PTC targets:
- PTC amount target:
$53.91B; current sim:$92.10B(+70.8%). - PTC returns target:
7.84M; current sim:12.95M(+65.2%). - Average PTC per positive return is not wildly off: target is about
$6.9k, current sim is about$7.1k. So the main issue appears to be too many positive PTC returns, not credits that are too large conditional on receipt.
The excess is concentrated in middle/high AGI bins:
$75k-$100k:1.94Mpositive returns vs0.47Mtarget.$100k-$200k:2.16Mpositive returns vs0.36Mtarget.$200k-$500k:0.31Mpositive returns vs0target.
For contrast, the CMS APTC recipient benchmark looks much better after the PR #68 mapping fix: eligible people with positive assigned PTC are about 20.24M vs the CMS target of 19.74M (+2.5%), with state-level correlation around 0.996.
Marketplace enrollment is still a separate concern. The reported Marketplace coverage input is about 8.77M people vs the CMS target of 21.45M. A direct-purchase union gets closer nationally but looks worse state-by-state, so this should be handled as a data/calibration design question rather than a simple variable-map change.
Why PR #68 does not cover this
PR #68 fixes cases where targets were wired to variables with the wrong semantics. The remaining ACA concern is different: the current dataset appears to have degenerate ACA take-up and selected-plan inputs. Even after mapping targets to assigned_aca_ptc, the model still overstates SOI PTC returns/spending because everyone eligible is effectively assumed to take up ACA coverage and select a benchmark-like plan.
Suggested next steps
- Locate where
takes_up_aca_if_eligibleandselected_marketplace_plan_benchmark_ratioare generated or defaulted; this may be outsidePolicyEngine/populace. - Add a dataset diagnostic or release check that flags degenerate health input columns, especially all-true take-up and all-1.0 plan ratio.
- Reproduce the SOI PTC amount/return diagnostics after PR #68 merges, so target mappings and source data issues are separated cleanly.
- Decide what the CMS marketplace enrollment benchmark should calibrate: reported Marketplace coverage, modeled ACA take-up, direct-purchase coverage, or some combined construct.
- Design an ACA take-up/plan-choice imputation or calibration strategy that jointly considers CMS enrollment, CMS APTC recipients, and SOI PTC amount/return targets.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in PolicyEngine/populace by locating where takes_up_aca_if_eligible and selected_marketplace_plan_benchmark_ratio are generated or defaulted. Reproduce the SOI PTC amount and return diagnostics after PR #68, then define a diagnostic or release check for degenerate inputs and document the agreed ACA take-up and plan-choice calibration strategy.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100