Skip to content

Calculate local SPM thresholds for congressional district-level analysis #449

@MaxGhenis

Description

@MaxGhenis

Problem

When reweighting CPS records to congressional district targets, SPM thresholds remain attached to records from their original geography. This causes:

  1. Reduced geographic variation - California records reweighted to Iowa still carry California's ~20% higher threshold
  2. Biased poverty estimates - Low-cost areas get overstated poverty (thresholds too high)
  3. Invalid local policy analysis - SPM-based eligibility calculations become unreliable

Background: SPM Threshold Components

The SPM threshold has three components (Census methodology):

  1. Base threshold - From BLS Consumer Expenditure Survey, 83% of median spending on food, clothing, shelter, utilities, telephone, and internet (FCSUti)
  2. Housing tenure adjustment - Three tenure groups: renters, owners with mortgage, owners without mortgage
  3. Geographic adjustment (GEOADJ) - Based on median gross rent index from ACS 5-year data

The GEOADJ formula: GEOADJ = (local_median_rent / national_median_rent) * 0.492 + 0.508

Geographic variation ranges from ~0.84 (West Virginia) to ~1.27 (Hawaii) - roughly 50% variation that we're currently losing when cloning records.

Proposed Solution

Fully calculate SPM thresholds from source data:

  1. Base threshold from CE Survey - Use rolling 5-year Consumer Expenditure Survey to calculate 33rd percentile FCSUti by tenure (follows BLS methodology, enables proper forecasting)
  2. District GEOADJ from ACS - Calculate geographic adjustment for each of 435 congressional districts using ACS Table B25031 (median 2-bedroom rent)
  3. Apply during district reweighting - threshold = base × equiv_scale × district_geoadj

Implementation Components

New module: policyengine_us_data/spm/

  1. ce_threshold.py - Download CE Survey PUMD, calculate 33rd percentile FCSUti by tenure
  2. district_geoadj.py - Generate GEOADJ lookup table from ACS median rents by congressional district
  3. local_threshold.py - Calculate local thresholds: base × equiv_scale × district_geoadj

Updates to Enhanced CPS

Ensure these SPM unit variables are passed through (some already extracted but unused):

  • NUMADULTS, NUMKIDS - Family composition
  • TENMORTSTATUS - Housing tenure status
  • EQUIVSCALE - Equivalence scale
  • GEOADJ - Original geographic adjustment (for validation)

Benefits

  • Proper geographic variation in poverty thresholds (~50% range from WV to HI)
  • Rolling 5-year CE data enables accurate forecasting (replaces simple CPI-U uprating)
  • Modular components can be updated independently
  • Full control over methodology

Acceptance Criteria

  • CE Survey threshold calculator matches BLS published values within 2% (2024 reference: $39,430 renter, $39,068 owner w/ mortgage, $32,586 owner w/o)
  • District GEOADJ ranges from ~0.84 to ~1.27
  • National aggregate SPM threshold matches Census totals
  • State-level poverty rates within reasonable range of Census SPM estimates

References

Related Issues

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