PolicyEngine / PolicyEngine/microcosm

Calibrate wages by wage band (SSA net compensation or SOI W-2 statistics)

Open
#943 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
0
Forks
4
Avg merge
1d 3h
Merged PRs (30d)
94

Description

Finding

The FUTA dashboard rerun (futa-wage-base-dashboard#2) computes revenue as Σ weight × min(wage, base) × 0.6%, so it depends on the distribution of wages below a cap rather than on total wages. Comparing the certified national file (populace-us-2024-spm-20260915) with the raw ASEC 2025 file at Census weights, income year 2024:

Microcosm Raw ASEC (Census weights)
Wage earners 167.0M 166.7M
Σ min(wage, $7,000) × 0.6% $6.685B $6.765B
Σ min(wage, $43,000) × 0.6% $31.78B $34.74B
Total payroll-tax wages $10.74T $12.07T

The $7,000-capped base matches within 1.2%; the $43,000-capped base is 8.5% lower in Microcosm. Wages are calibrated in aggregate (SOI by AGI band, BEA, CBO) but not by wage band per earner.

Contributing mechanism (computed): the 2024-period wage equals the reported wage for every pooled record, including records from income years 2022 and 2023 (sim ÷ raw wage ratio 1.000 at the 10th, 50th and 90th percentiles across all 166,321 persons). asec_pool.py scales weights by year and does not age dollar amounts, so roughly two thirds of the sample carries 2022 or 2023 nominal wages in the 2024 period, and calibration compensates through weights.

Proposal

Bind an administrative wage-band distribution as a fiscal target. Two candidates, both person-level W-2 wages:

Either gives the min(wage, B) curve at every B. Steps per docs/us-fact-to-target.md: mint the facts in Chronicle, splice the feed, support oracle (every wage earner carries the variable, so support is broad), bind to employment_income_before_lsr or payroll_tax_gross_wages, register, probe, test. Separately decide whether pooled prior-year wages should be aged to the target year before calibration.

FUTA collections should stay a held-out check, not a target: the model's FUTA variable has known mechanical gaps (exempt employers, per-employer caps; see the companion issue), and fitting collections would move weights to absorb them.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with docs/us-fact-to-target.md and asec_pool.py, then compare the proposed SSA and IRS SOI W-2 wage-band sources. Trace how facts are minted in Chronicle, spliced into the feed, bound to employment_income_before_lsr or payroll_tax_gross_wages, registered, probed, and tested. Done means a supported wage-band calibration target is covered by tests, with the prior-year wage-aging decision addressed separately.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.