Skip to content

Move legacy-benefit reporters onto Universal Credit at Move to UC claim rates - #534

Draft
MaxGhenis wants to merge 1 commit into
mainfrom
uc-managed-migration-takeup
Draft

MaxGhenis wants to merge 1 commit into
mainfrom
uc-managed-migration-takeup

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #492

Summary

Every working-age legacy means-tested benefit has closed or is closing, but would_claim_uc is drawn without regard to legacy receipt. A legacy reporter whose draw came out false lost its legacy award at the closure and got no Universal Credit.

This PR draws would_claim_uc_at_legacy_closure, which PolicyEngine/policyengine-uk#2119 reads once DWP moves a family off its legacy benefits (legacy_benefits_closed). The draw uses DWP's Move to Universal Credit claim rates for the family's combination of legacy benefits. would_claim_uc is untouched, so 2024-25 legacy receipt is unchanged.

Option (b), not (a)

The issue offered two routes. Only (b) keeps 2024-25 and 2025-26 legacy receipt intact:

  • policyengine-uk copies every dataset input into each later year (extend_single_year_dataset).
  • The Housing Benefit continuing award and Child Tax Credit both require ~would_claim_uc.
  • Income Support, income-based JSA, income-related ESA and Working Tax Credit do not read it at all.

Option (a), setting would_claim_uc true for legacy reporters, would therefore:

  • move Housing Benefit and Child Tax Credit receipt onto Universal Credit in the survey year;
  • pay Income Support, JSA, ESA and Working Tax Credit on top of Universal Credit;
  • shift the 2025-26 calibration year.

Option (b) needs a model input and switch, which #2119 adds. This PR is the data half.

Change

  • parameters/take_up/uc_managed_migration.yaml: households sent a migration notice, by legacy benefit combination, from Stat-Xplore ("Households invited to Move to Universal Credit", table MtUC Households 3; GB, notices to end of March 2026, retrieved 2026-10-03). The table has all 19 combinations DWP reports and the all-households row. Rate = claimed / (claimed + did not claim); the 538 households still in progress are left out. The headline matches DWP's 12 May 2026 release: 1.82m notices, 87% claimed.
  • utils/takeup.py: legacy_benefit_combination and assign_uc_claim_at_legacy_closure.
    • A unit reporting legacy benefits but not Universal Credit claims with its combination's rate. Combinations DWP does not report, such as ESA with Income Support, take the all-households rate.
    • Units reporting Universal Credit, and units with no legacy benefit, are true, the model's default. So the column changes nothing outside the legacy cohorts.
  • create_frs: draws the flag with its own generator (seed 492), right after would_claim_uc. The seed=100 sequence behind every other take-up flag is unchanged. require_variable fails the build if policyengine-uk lacks the input.
  • impute_income: stage 2 rewrites the SPI-synthetic rows' benefit receipt, so their flag is redrawn from the rewritten receipt (seed 493).
  • Dependencies: the hypothesis dev dependency (the same hunk as Map FRS EMPSTATI 11 to OTHER_INACTIVE, not LONG_TERM_DISABLED #526). The policyengine-uk floor and lock bump to the release carrying #2119 follow once it is released; until then CI fails at require_variable, as intended.
Combination (GB) Claim rate
HB only 75.3%
HB and income-related ESA 98.0%
CTC, HB and income-related ESA 98.7%
Income-related ESA only 95.8%
IS only 92.9%
JSA only 94.7%
CTC only 67.4%
WTC only 51.0%
CTC and WTC 74.2%
All households 86.7%

(Every combination is in the YAML.)

Income-related ESA ordering (issue's note)

policyengine-uk has not modelled the income-related ESA end date. That is SI 2025/1148 art 3A, inserted by SI 2026/409, ending remaining awards on 1 July 2026 (NI: SR 2025/176 art 3A from 1 October 2026). PolicyEngine/policyengine-uk#1914 is open with no PR.

How #492 interacts:

  • #2119 ends income-related ESA, with every other legacy award, for each family moved off legacy benefits. So this draw cannot widen the ESA and Universal Credit overlap.
  • Families on income-related ESA alone keep it until #1914 adds ESA to legacy_benefits_closed.
  • The pre-existing overlap (about 137k units paid both because would_claim_uc is true) is untouched. It is #1914's job.

Impact

Two seeded builds were run with production settings (seed 0, one geography clone, shared HTTP cache): main (b45c373) and this branch (2ac3c22). Both used policyengine-uk #2119 (4313fbd3a), which this branch's require_variable guard needs. Aggregates come from #2119's merged head (cf40b021b, policyengine-core 3.32.16), and only aggregates are reported. A placebo, main rebuilt with calibration seed 1, sizes the reweighting noise.

This PR (branch minus main, same model):

2024 2025 2026 2027 Placebo, 2025
Universal Credit, £bn +0.046 -0.004 +0.003 +0.000 -0.050
Benefit units on UC, thousand +6.962 -0.025 +0.000 -0.209 -0.914
Housing Benefit, £bn -0.001 -0.002 -0.002 -0.002 +0.063
Tax credits, £bn -0.035 +0.000 +0.000 +0.000 +0.000
Pension Credit, £bn -0.001 -0.001 -0.001 -0.002 +0.036
Household net income, £bn -0.046 -0.060 -0.049 -0.054 -4.237
People in AHC poverty, thousand +13.076 +3.388 +2.200 +2.913 +6.502
People in BHC poverty, thousand +7.730 -0.071 -0.821 +0.636 -8.926
  • Aggregates do not move beyond the noise. Calibration fits FY 2025-26 to the OBR Universal Credit and Housing Benefit totals, so it re-weights to the same totals. Every change above is smaller than the placebo's. The 2024 differences, where the model changes nothing, are reweighting alone.
  • What changes is who gets Universal Credit.
    • 597k weighted benefit units in legacy cohorts now draw false at DWP's rates, where the model default was true.
    • Among working-age families moved off legacy benefits that do not draw would_claim_uc, closure-claim Universal Credit falls from £0.83bn (48.7k units) to £0.78bn (41.8k) in 2025. The re-weighting makes up the rest.
  • Columns. The person and benefit-unit tables are identical to main's build apart from the new column, so would_claim_uc and every other take-up flag are unchanged, SPI-synthetic rows included. The base FRS file differs only by the new column. Household weights and weight-dependent imputations (energy, fuel, property values) differ.

Context: what these changes do together.

  • #2119 plus this PR vs today's model. On the main build, against policyengine-uk main 325d585e5, they give: Universal Credit +£0.83bn (+48.7k units) in 2025 and +£1.01bn in 2026; Housing Benefit −£0.16bn; Income Support −£0.13bn (2025); income-related ESA −£0.24bn; household net income +£0.26bn (2025) and +£0.56bn (2026); AHC poverty −80k (2025) and −102k (2026). That build's weights were calibrated under #2119. On the released 1.57.4, #2119 alone gives Universal Credit +£0.07bn.
  • Then Abolish working-age Housing Benefit from 1 July 2026 (NI 1 October 2026) policyengine-uk#1910 on this branch's build. That is the working-age Housing Benefit abolition, with abolition-time claims. In 2026 it gives Universal Credit +£0.38bn (+24k units), Housing Benefit −£0.17bn, income-related ESA −£0.22bn (new claimants only) and household net income about £0. Without this PR's draw, those Housing Benefit families would be stranded.

Run files are in the session's review folder: impact/aggregates.py and compare_columns.py, with outputs s1_*, s2_* and s1_columns*.txt.

Invariants

Tested in policyengine_uk_data/tests/test_uc_managed_migration_takeup.py (Hypothesis plus built-dataset checks):

  1. Source. Every combination is a "+"-join of the six legacy benefits in order; each rate is claimed / (claimed + did not claim) in (0, 1); the combinations add up to DWP's total within disclosure-control rounding; spot rates match the table.
  2. Anchors. Every benefit unit reporting Universal Credit is true, and every unit with no legacy benefit is true. This is checked on generated data and on the built FRS and Enhanced FRS.
  3. Exact draw. A legacy reporter not on Universal Credit is true exactly when its uniform draw is below its combination's rate.
  4. Sampling error. Each cohort's share is within 4 standard errors of its rate: 20,000 synthetic units per combination, and the built FRS's unweighted cohorts of 30 or more.
  5. Isolation. The draw is deterministic, uses its own generator, and leaves NumPy's global state alone.

The seeded builds also confirm that would_claim_uc and every other take-up flag are identical to main on FRS-original rows.

Limitations

  • Claim rates count every notified household. That includes those not entitled to Universal Credit. policyengine-uk's means test applies on top, so families entitled to Universal Credit claim at a little less than the observed rate. This matters mostly for the tax credit cohorts.
  • Transitional protection is not modelled (policyengine-uk#1912). That includes the transitional capital disregard (SI 2014/1230 reg 51), which ignores tax credit migrants' capital above £16,000 for up to 12 assessment periods.
  • Northern Ireland uses the GB rates. DfC's table 28 shows the same pattern: ESA and HB 98%, HB only 76%, all 88%.

Release

This is in the d833 uk-data batch. It is reviewed and approved on gates, not merged; it lands with the batch on Max's go. It needs policyengine-uk#2119 released first. PolicyEngine/policyengine-uk#1910 (working-age Housing Benefit abolition) waits for this PR (d837).

🤖 Generated with Claude Code

…im rates

Every working-age legacy means-tested benefit has closed or is closing, but
would_claim_uc is drawn without regard to legacy receipt: a legacy reporter
that drew it false lost its legacy award and got no Universal Credit.

Draw would_claim_uc_at_legacy_closure, which policyengine-uk reads once a
legacy benefit the unit reports has closed, at DWP's Move to Universal
Credit claim rates by combination of legacy benefits (Stat-Xplore table
MtUC Households 3, notices to end of March 2026). Units reporting UC, and
units with no legacy benefit, are true (the model default). The draw has
its own seeded generator, so the seed=100 sequence behind every other flag
is unchanged; SPI-synthetic rows are redrawn after stage 2 rewrites their
receipt. would_claim_uc itself is untouched, so 2024-25 legacy receipt is
unchanged.

Fixes #492.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Move working-age legacy-benefit reporters onto UC at Move to UC claim rates (stranded after HB, tax credit, IS and JSA closure)

1 participant