Skip to content

Calibrate pension-age Housing Benefit to DWP's GB figures - #490

Open
MaxGhenis wants to merge 3 commits into
mainfrom
hb-dwp-age-split-targets
Open

MaxGhenis wants to merge 3 commits into
mainfrom
hb-dwp-age-split-targets

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Follows up PolicyEngine/policyengine-uk#1901 (released in policyengine-uk 2.102.5), which lets families whose adults are all over State Pension age make new Housing Benefit claims.

What changes

  1. Build with policyengine-uk 2.102.5. uv.lock pinned 2.93.0, so a data build today would not include #1901.
  2. Targets can name the countries they cover. A new optional Target.countries zeroes the loss-matrix column outside those countries, via restrict_to_countries.
  3. Housing Benefit is calibrated to DWP's GB pension-age figures. The OBR EFO table 4.9 "Housing benefit (not on JSA)" target is replaced by two targets from DWP's Spring 2026 benefit expenditure and caseload tables: GB Housing Benefit spending and claims over Pension Credit qualifying age (£7,114.7m and 1,109k claims in 2025-26).
    • The OBR line is GB-only; the model column summed the UK, including Northern Ireland.
    • The OBR line is also DWP-funded spending only. DWP's age split sums to all Housing Benefit paid, including £0.79bn funded by local authorities, so keeping both targets would ask for two different GB totals.
  4. would_claim_uc is False for benefit units whose adults have all reached State Pension age. They cannot claim Universal Credit. The draw still covers every unit, so the random stream and every other unit's value are unchanged.

The under-Pension-Credit-age figures (£5,778.1m, 460k) are transcribed and tested but not calibrated. The next section gives the evidence.

Age groups

DWP splits by benefit rules, not age alone (tables, Notes, note 5). Its over and under lines equal its Pension Credit + State Pension and ESA + other working-age benefit groups exactly from 2024-25.

Regulation 5 of both Housing Benefit Regulations 2006 (SI 2006/213 and 2006/214) applies the pension-age rules when the claimant or partner has reached Pension Credit qualifying age, unless either is on UC, Income Support, income-based JSA or income-related ESA. The model column therefore counts a benefit unit as over when an adult has reached State Pension age and the unit gets none of those four benefits. That puts mixed-age couples who kept pension-age Housing Benefit after May 2019 in the older group, as DWP's benefit groups do. Stat-Xplore's Housing Benefit "Age of claimant" also uses "the eldest age within that couple".

Results

Four real builds, each with production settings (PE_UK_DATA_OA_CLONES=1, 512 epochs) and the same trained imputation models. Each dataset was then simulated with policyengine-uk 2.102.5.

  • A: published 1.57.4.
  • B: main plus the 2.102.5 lock bump.
  • C: this PR with all four DWP targets.
  • C2: this PR as submitted, pension-age targets only.

GB Housing Benefit, FY 2025-26 (ratio to DWP in brackets):

over PC age £bn claims k under PC age £bn claims k NI HB £bn
DWP Spring 2026 7.11 1,109 5.78 460 0.31 rent HB (DfC accounts)
A: published 1.57.4 12.05 (1.69x) 1,536 (1.39x) 0.18 (0.03x) 28 (0.06x) 1.29
B: main + 2.102.5 11.52 (1.62x) 1,435 (1.29x) 0.15 (0.03x) 24 (0.05x) 1.44
C: all four targets 7.84 (1.10x) 1,144 (1.03x) 5.41 (0.94x) 513 (1.11x) 0.32
C2: this PR 7.86 (1.10x) 1,148 (1.03x) 0.10 (0.02x) 17 (0.04x) 0.47

Weights and side effects, FY 2025-26:

A B C C2
effective sample size of HB recipients 18 22 18 24
effective sample size, under PC age 56 64 3 90
top-10 records' share of HB 65% 61% 70% 57%
largest record's share of HB 18% 16% 25% 14%
effective sample size of all households 1,181 1,245 1,202 1,305
wholly pension-age units with would_claim_uc 40% 52% 0% 0%
UC £bn 75.87 75.24 75.18 75.37
Pension Credit £bn 6.26 6.21 6.21 6.18
relative poverty BHC 20.05% 20.22% 20.09% 20.37%
relative poverty AHC 23.96% 23.58% 23.15% 23.70%
pensioner relative poverty AHC 17.49% 17.78% 16.52% 17.70%

Why the working-age targets are left out. C meets DWP's working-age figure by loading it onto about three effective records. Its effective sample size for under-PC recipients is 3, and one record carries a quarter of all Housing Benefit. Its national fit is no better, and income-related ESA claimants move from 1.06x to 1.15x of target.

The cause is the model, not the target. policyengine-uk pays working-age Housing Benefit only as a continuing award to families that report it and do not claim UC: 267 of the 770 working-age records that report it (2025-26). DWP's working-age total also covers temporary and supported accommodation, £5.2bn together in 2025-26 and not split by age, which the FRS barely samples.

Other measurements:

  • Total GB Housing Benefit falls. 2025-26 goes from £11.67bn (1,459k claims) in B to £7.96bn (1,165k) in C2; DWP's total is £12.89bn. The old total looked close only because pension-age Housing Benefit was 1.6x DWP's. Working-age, temporary and supported-accommodation Housing Benefit remain largely unmodelled. The changelog says this.
  • National fit. Constituency log, final epoch: B median |ratio-1| 4.1% with 84.1% of targets within 10%; C2 4.1% with 84.0%.
  • Calibration year vs saved file. At calibration, C2 puts pension-age Housing Benefit at £7.39bn (1.04x) and 1,155k claims (1.04x). Simulating 2025 from the saved 2024 base-year file gives 1.10x, the round-trip effect described in Rail, bus and fuel calibrations run after base-year materialisation, so the shipped file is not uprate-invertible #479.
  • FY 2026-27. C2 has pension-age Housing Benefit at £8.13bn against DWP's £7.27bn (1.12x); B has £11.81bn (1.62x).
  • Northern Ireland. Housing Benefit is no longer calibrated there. It falls from £1.44bn in B to £0.47bn, closer to the £0.31bn of rent Housing Benefit in DfC's 2025-26 accounts.

Invariants and tests

  • GB/NI partition. For any household column and any country labels, GB-restricted + NI-restricted = UK column. Restriction is idempotent, and no restriction returns the column unchanged. Property test.
  • Age split conserves Housing Benefit. Over + under = all Housing Benefit, in pounds and claims, per household, for random benefit-unit structures. The older group is exactly "adult over SPA and no UC/IS/income JSA/income ESA". Property test.
  • Values against the workbook. All 36 transcribed values were diffed against the DWP workbook. Spending matches to the published 0.1m rounding and caseloads match exactly.
  • Transcription check. The transcribed over + under figures reconcile with DWP's separately transcribed totals (AME within cap + outside cap + LA funded, and total caseload) in every year 2022-2030.
  • Pension-age helper. The wholly-pension-age helper is checked differentially against a per-unit loop, for any unit order.
  • Built dataset. No wholly pension-age unit has would_claim_uc.
  • Differential build check. The base FRS from this branch equals the baseline build in every column of every entity except would_claim_uc. That changed for 2,848 of 5,714 wholly pension-age units, all True to False; no other unit changed.
  • Calibrated columns on the dataset. Both calibrated columns build on the dataset and land within 0.5-2x of target. This guards against the loss matrix silently skipping them.
  • Targeted suites on the C2 dataset. Target registry, ESA/JSA targets, aggregates and reform impacts all pass.

Follow-ups (not in this PR)

  • Other OBR 4.9 and DWP benefit targets have the same scope mismatch: every DWP line is GB, and PIP/DLA, Attendance Allowance, Carer's Allowance and Winter Fuel Payment are England & Wales only. A separate task is queued.
  • Working-age Housing Benefit in policyengine-uk: continuing awards, temporary and specified accommodation, and the 1 July 2026 abolition.
  • Pension-age Housing Benefit take-up for non-reporters, which is reported-only today. DWP puts pensioner take-up at 85% of caseload for FYE 2024. That is a modelling call, queued separately.
  • policyengine-uk Housing Benefit means-test fixes are in flight in other PRs. When they release, a lock bump and rebuild will move these numbers again.

Independent review (Opus 5.5, Subfleet): APPROVE. Its findings were addressed in 2597102: the release note now states the total drop, the mixed-age assumption is marked, the benefit-group equality is dated from 2024-25, the working-age claims figure comes from the calibrated build, a test on the built dataset was added, and a comment now explains the State Pension age dependency.

axiom: n/a: data/calibration-only change

Merging releases data (the push workflow builds and uploads the dataset), so the merge is queued as a decision.

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits September 30, 2026 07:55
Replace the OBR table 4.9 Housing Benefit target, which is GB DWP-funded
spending but was compared with UK-wide modelled Housing Benefit, with DWP
Spring 2026 targets for Housing Benefit spending and claims over Pension
Credit qualifying age in Great Britain. Targets can now name the countries
they cover.

The figures under Pension Credit qualifying age are kept but not
calibrated: the model pays working-age Housing Benefit to too few records
for a target to be met without concentrating it on a handful of them.

Stop drawing would_claim_uc for benefit units whose adults have all
reached State Pension age, keeping every other unit's draw unchanged.

Require policyengine-uk 2.102.5, which lets pension-age families make new
Housing Benefit claims (PolicyEngine/policyengine-uk#1901).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
State in the release note that modelled GB Housing Benefit falls to about
£8.0bn. Mark the mixed-age classification as an assumption, date the
benefit-group equality from 2024-25, and quote the calibrated build's
working-age claims. Add a test that the calibrated columns build on the
dataset, since the loss matrix skips a target whose column raises, and note
that would_claim_uc uses survey-year State Pension age.

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

The create_frs smoke test's fake simulation did not answer the variables
the would_claim_uc rule now reads (person_benunit_id, is_adult, is_SP_age),
which failed CI with KeyError: 'person_benunit_id'.

Pick the claimant-and-partner flag the way the locked policyengine-uk does
for Housing Benefit's pension-age route: is_claimant_or_partner where the
release defines it, otherwise is_adult as in 2.102.5. Both the
would_claim_uc rule and the age-group targets use it. Under 2.102.5 the
base FRS is identical to the previous commit's in every column.

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

Copy link
Copy Markdown
Contributor Author

Interaction with #514. That PR rebuilds would_claim_uc on SPI-synthetic rows (apply_spi_donor_benefit_rules in imputations/frs_only.py) at the take-up rate, instead of inheriting the donor's flag. Whichever of #490 and #514 merges second needs to apply #490's pension-age exclusion (derive_all_claimants_over_state_pension_age) to that redraw too. Otherwise test_built_dataset_has_no_pension_age_uc_claimants fails on SPI units.

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.

1 participant