Skip to content

PUF entity leaves: partnership loss over-imputed (1.20x mass, 1.31x returns), S-corp loss under-imputed (0.71x); decide calibration before Table 1.4 entity legs bind #1265

Open

Description

@MaxGhenis

PR #1261 (#1258) gives the US PUF donor separate partnership and S-corporation leaves. A Modal PUF-support base built with it (run entity-split-1258-base-d239b0f77b7a) shows the two entities' loss legs imputed with opposite errors.

On the PUF-clone half (89.76M weight), imputed against the donor scaled per unit weight (×89.76/161.18), at base weights:

Leaf Net Income mass Loss mass Income returns Loss returns
partnership_income 0.96 1.03 1.20 (+$9.9B) 1.30 1.31
s_corp_income 1.09 1.04 0.71 (−$10.5B) 1.03 1.07
line 32 (P+S) 1.05 1.04 1.00

Line 32's loss mass is right only because the two errors cancel. #1251's single combined leaf ran 1.21 / 1.22 / 1.26.

Neither leaf is in _PUF_TAX_DETAIL_SIGNED_MASS_CALIBRATED_PERSON_OUTPUTS (us_runtime/puf_support.py). The comment above that set describes exactly this pattern: the QRF sign gate over-predicts the rarer leg. The passive subset, which is in the set, matches the donor exactly.

Why it can wait, and when it can't. Nothing binds the entity loss legs today: the pinned feed carries no Table 1.4 partnership or S-corp legs. Once PolicyEngine/chronicle#180 lands, partnership_net_loss_{amount,returns} and s_corporation_net_loss_{amount,returns} bind each entity's own leaf. The weight solve would then have to absorb both errors by reweighting, which distorts other margins.

Options:

  1. Add both entity leaves to the signed-mass calibration set. This pins the per-unit leg masses to the donor and changes base levels. Carry Schedule E line 32 and its passive subset on the US PUF donor #1251's combined leaf was never calibrated, so this is a methodology call.
  2. Calibrate only the loss legs' return counts.
  3. Leave it to the target solve.

Each needs a Modal base before/after. The evidence and scripts are in ~/PolicyEngine/_reviews/puf-entity-split/ (out/compare_bases.json, scripts/modal_compare_bases.py).

Blocked on #1261 merging; decide before chronicle#180's legs enter the pinned feed.

Activity

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