Skip to content

Export parent_1_id / parent_2_id from CPS PEPAR1 / PEPAR2 #1185

Open

Description

@MaxGhenis

What happens

policyengine-us can link a child to their parents through parent_1_id and parent_2_id. SSI parental resource deeming uses these links (20 CFR 416.1202(b), PolicyEngine/policyengine-us#10040), and so does the Medicaid parent logic. The certified default (populace-us-2024-spm-20260915) carries the raw CPS parent line numbers, PEPAR1 and PEPAR2, but not the normalized ids.

Without them, microsimulations fall back to a tax-unit proxy over is_parent. That proxy:

  • cannot tell a grandparent or another adult marked as a parent from the child's own parent;
  • misses a co-resident parent who files in a different tax unit.

Suggested fix

Map PEPAR1 and PEPAR2 (person line numbers within the CPS household) to the frame's person_ids, and export them as parent_1_id and parent_2_id. Leave them unset when the parent is not in the household.

Support rows that clone a CPS person need the ids remapped to the clone's household.

Acceptance

  • Every non-missing PEPAR maps to a co-resident person.
  • The linked parent's age is plausible.
  • has_parent_ids holds for the children who have a CPS parent link.

Activity

  1. PavelMakarchuk commented on Oct 16, 2026

    @PavelMakarchuk
    Contributor

    Another consumer of these ids: Medicaid non-filer households. PolicyEngine/policyengine-us#9406 (merged 2026-10-07, fixes policyengine-us#9404) builds the 42 CFR 435.603(f)(3) household from parent_1_id / parent_2_id. When the ids are 0, it falls back to the family-wide is_parent proxy, so a co-resident grandparent counts as a child's second parent. The child then takes on the grandparent's income and can lose coverage, or a non-filer couple counts grandchildren in its household size.

    In the PolicyEngine–PRD comparison (enhanced CPS, 2025, aligned view) this is the second-largest PolicyEngine-side gap: $659K of the Medicaid difference across 158 tax units (cause medicaid.pe_family_household). The dataset the comparison runs has no parent ids, so #9406 does not change these units yet. A certified dataset that carries the ids, mapped as described above, would close it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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