Context
We currently materialize only two CPS current health coverage flags in policyengine-us-data (NOW_MRK -> has_marketplace_health_coverage and NOW_GRP -> has_esi). After reviewing the CPS ASEC health insurance structure, this is too narrow for a clean PolicyEngine model.
Census structures current coverage as multiple independent NOW_* flags rather than a single mutually exclusive status. Multiple current coverages are possible, so we should not collapse these into one enum at the data layer.
What to add
Import and expose person-level reported current-coverage inputs from CPS as independent booleans, using explicit reported_..._at_interview naming. Likely minimum set:
reported_has_employer_sponsored_health_coverage_at_interview (NOW_GRP)
reported_has_direct_purchase_health_coverage_at_interview (NOW_DIR)
reported_has_marketplace_health_coverage_at_interview (NOW_MRK)
reported_has_subsidized_marketplace_health_coverage_at_interview (NOW_MRKS)
reported_has_unsubsidized_marketplace_health_coverage_at_interview (NOW_MRKUN)
reported_has_medicare_health_coverage_at_interview (NOW_MCARE)
reported_has_medicaid_health_coverage_at_interview (NOW_CAID / NOW_MCAID as appropriate in CPS naming)
reported_has_chip_health_coverage_at_interview (NOW_PCHIP)
reported_has_other_means_tested_health_coverage_at_interview (NOW_OTHMT)
reported_has_tricare_health_coverage_at_interview (NOW_MIL)
reported_has_champva_health_coverage_at_interview (NOW_CHAMPVA)
reported_has_va_health_coverage_at_interview (NOW_VACARE)
reported_has_indian_health_service_coverage_at_interview (NOW_IHSFLG)
Derived data-layer summaries that are also reasonable to publish:
reported_has_private_health_coverage_at_interview
reported_has_public_health_coverage_at_interview
reported_has_multiple_health_coverage_at_interview
reported_is_insured_at_interview
reported_is_uninsured_at_interview
Important modeling boundary
These should remain reported survey facts. They should not be overwritten or reconciled away in the data layer if they conflict with modeled eligibility.
Relationship to take-up
The intent is to match the existing SSI/SNAP pattern more closely, not to bypass take-up calibration.
In other words, these reported current-coverage variables should be imported as raw survey facts, but then used as an input/anchor for enrollment assignment in the same spirit as snap_reported and ssi_reported are used in add_takeup().
For ACA / Medicaid, the desired behavior is closer to:
- keep
reported_*_at_interview as raw inputs
- use them to prioritize or inform take-up / enrollment assignment
- still allow the take-up layer to shift people around to hit enrollment targets
- avoid treating reported current coverage as immutable final truth when it conflicts with modeled eligibility or aggregate enrollment targets
So this issue is about adding the reported inputs and preserving them, but not about replacing the target-matching take-up machinery.
Why this matters
- avoids collapsing multi-coverage into an enum too early
- gives
policyengine-us enough raw inputs to compute effective/canonical health coverage separately
- keeps reported survey state separate from simulated take-up state
- sets us up to detect report-model conflicts instead of silently erasing them
Sources
- CPS ASEC API variables:
NOW_* current coverage fields
- Census health insurance programming guidance: current coverage is not modeled as a single exclusive status
Context
We currently materialize only two CPS current health coverage flags in
policyengine-us-data(NOW_MRK -> has_marketplace_health_coverageandNOW_GRP -> has_esi). After reviewing the CPS ASEC health insurance structure, this is too narrow for a clean PolicyEngine model.Census structures current coverage as multiple independent
NOW_*flags rather than a single mutually exclusive status. Multiple current coverages are possible, so we should not collapse these into one enum at the data layer.What to add
Import and expose person-level reported current-coverage inputs from CPS as independent booleans, using explicit
reported_..._at_interviewnaming. Likely minimum set:reported_has_employer_sponsored_health_coverage_at_interview(NOW_GRP)reported_has_direct_purchase_health_coverage_at_interview(NOW_DIR)reported_has_marketplace_health_coverage_at_interview(NOW_MRK)reported_has_subsidized_marketplace_health_coverage_at_interview(NOW_MRKS)reported_has_unsubsidized_marketplace_health_coverage_at_interview(NOW_MRKUN)reported_has_medicare_health_coverage_at_interview(NOW_MCARE)reported_has_medicaid_health_coverage_at_interview(NOW_CAID/NOW_MCAIDas appropriate in CPS naming)reported_has_chip_health_coverage_at_interview(NOW_PCHIP)reported_has_other_means_tested_health_coverage_at_interview(NOW_OTHMT)reported_has_tricare_health_coverage_at_interview(NOW_MIL)reported_has_champva_health_coverage_at_interview(NOW_CHAMPVA)reported_has_va_health_coverage_at_interview(NOW_VACARE)reported_has_indian_health_service_coverage_at_interview(NOW_IHSFLG)Derived data-layer summaries that are also reasonable to publish:
reported_has_private_health_coverage_at_interviewreported_has_public_health_coverage_at_interviewreported_has_multiple_health_coverage_at_interviewreported_is_insured_at_interviewreported_is_uninsured_at_interviewImportant modeling boundary
These should remain reported survey facts. They should not be overwritten or reconciled away in the data layer if they conflict with modeled eligibility.
Relationship to take-up
The intent is to match the existing SSI/SNAP pattern more closely, not to bypass take-up calibration.
In other words, these reported current-coverage variables should be imported as raw survey facts, but then used as an input/anchor for enrollment assignment in the same spirit as
snap_reportedandssi_reportedare used inadd_takeup().For ACA / Medicaid, the desired behavior is closer to:
reported_*_at_interviewas raw inputsSo this issue is about adding the reported inputs and preserving them, but not about replacing the target-matching take-up machinery.
Why this matters
policyengine-usenough raw inputs to compute effective/canonical health coverage separatelySources
NOW_*current coverage fields