Skip to content

Let a dataset supply each benefit unit's own Pension Credit capital - #2018

Merged
juaristi22 merged 2 commits into
mainfrom
pc-reported-capital
Oct 2, 2026
Merged

juaristi22 merged 2 commits into
mainfrom
pc-reported-capital

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Why

About a third of Family Resources Survey benefit units that report Pension Credit get no modelled entitlement. Most of them fail on deemed income from imputed household capital, which the survey's own record of their capital contradicts.

Measured on the PolicyEngine/policyengine-uk-data#510 build D Enhanced FRS (2024-25 survey, FY2025-26, Great Britain), policyengine-uk main 7b9fc37. These are the original FRS households at survey grossing weights, which reproduces #510's take-up step to within about 2%.

k benefit units
report Pension Credit 1,173
entitled in the model 759
not entitled 415
of which entitled once deemed income from capital is removed 266

For the 415k who are not entitled, the two capital measures disagree:

capital under £6,000 under £16,000 over £100,000 weighted median
model (WAS-imputed household capital, pension-age share) 13% 18% 43% £74,300
FRS derived benefit-unit capital (TOTCAPB3) 83% 96.5% 0.3% £300

The imputation draws a household's wealth from Wealth and Assets Survey households with similar income, household size, tenure and region. Receipt of a means-tested benefit plays no part in that draw. Most of the gap is corporate_wealth, which the current build fills mostly with pension wealth (PolicyEngine/policyengine-uk-data#501 removes it), plus imputed savings and property. The survey's own measure also matches how DWP treats these cases: for 2023-24 it assigned Pension Credit to eligible FRS non-reporters "using the eligibility criteria sourced from survey data, combined with administrative data" (FRS 2023-24 background information and methodology, section 8.3).

What changes

New benefit-unit input pension_credit_reported_capital (default -1):

  • When it is 0 or more, pension_credit_assessable_capital uses it in place of the household proxy and the person-level sources. Pension Credit counts the claimant's capital and, under SPCA 2002 s.5, the partner's. A benefit-unit measure records exactly that, where the proxy spreads household wealth.
  • -1 means none is recorded, and the existing proxy applies unchanged. 0 records no capital.
  • Other benefit units in the household keep their proxy share unchanged, so nothing is double counted or redistributed.
  • It is uprated with savings (per-capita GDP, uprating_indices.yaml), and the sentinel stays negative under uprating.

uc_reported_capital follows the same pattern. Nothing reads the new input until a dataset fills it. PolicyEngine/policyengine-uk-data#513 fills it from FRS TOTCAPB3 and needs this release.

Measured impact (real runs)

  • Unchanged on current data. On build D, pension_credit_assessable_capital, pension_credit_entitlement, housing_benefit, council_tax_reduction and household_net_income are identical to main for all 61,212 benefit units and 52,846 households.
  • With the input filled from FRS TOTCAPB3 (build D plus that one column on original FRS benefit units, otherwise unchanged; GB, 2025-26):
main this PR, reporters only this PR, every benefit unit
reporters not entitled (survey weights) 415k 159k 159k
reporters not entitled (calibrated weights) 380k 127k 127k
GB entitled benefit units (survey weights) 1,344k 1,600k 1,907k
#510 fill probability at 62% GB take-up 0.128 0.000 0.188
GB claims / spending after the fill, before calibration 833k / £3.57bn 1,015k / £4.69bn 1,182k / £5.16bn
scale calibration needs to reach DWP's 1,382k / £6.14bn 1.66x / 1.72x 1.36x / 1.31x 1.17x / 1.19x

Several open PRs close part of the rest, and the counts below include them: #1899 (Savings Credit age test), #1940 (mixed-age saving), #1925 (2025-26 rates) and #2019 (Sch VI earnings disregards, which changes no reporter's entitlement). With all of them, this PR and capital filled for every benefit unit, 88k reporters remain not entitled (7.5%). GB entitled benefit units reach 2,084k, against roughly 2.2m implied by DWP's 1,382k caseload at 62% take-up. Calibration then needs 1.07x claims and 1.02x spending. Build D took reporters from 1,199k to 1,736k (+45%).

Rebuild (build E, real production build by the #510 session)

Build E is #510 plus PolicyEngine/policyengine-uk-data#513 on this PR combined with #2019, #1899, #1940 and #1925. Against D′ (#510 alone on 2.102.5), GB, FY2025-26:

  • Before calibration: 93% of GB reporters are entitled (D′: 64%). The fill reaches 1,341k claims and £6.17bn, against DWP's 1,382k and £6.14bn.
  • After calibration: 1,403k claims and £6.27bn. Reporter upweighting is +10% (D′: +45%). Take-up among the entitled is 60.2% (D′: 73.4%; DWP 62%). National fit is unchanged (median abs(ratio-1) 4.0%).
  • Pensioner relative AHC poverty rises from 17.5% to 18.4%. Running both datasets under both trees gives −0.09pp from the code and +1.13pp from E's weights: entitled pensioners who don't claim are no longer crowded out by inflated reporters. Details are in Add validation chart #513.

Static totals on build D's calibrated weights are not meaningful here. Those weights already inflate reporters to make up for the missing entitlement, so filling capital without recalibrating overshoots DWP's spending (GB £6.24bn becomes £8.17bn). The pre-calibration figures above are the comparison that holds; a rebuild with the data PR gives the final numbers.

Invariants (property tests, tests/test_pension_credit_reported_capital_properties.py)

Hypothesis tests over households of one or two benefit units: ages from 30 to 90, savings, land, corporate wealth, Lifetime ISAs, State Pension, and reported capital that is -1 or between 0 and 60,000.

  1. Override identity. A pension-age unit with reported capital R ≥ 0 has assessable capital R.
  2. Default differential. With nothing reported, assessable capital equals the pre-change proxy, recomputed independently from the inputs.
  3. Locality. Reporting one unit's capital never changes another unit's.
  4. Bounds. Assessable capital is never negative, and it is 0 for a unit with no one over State Pension age.
  5. Monotonicity. Entitlement never rises with reported capital.
  6. Deemed income. It is ceil(max(0, R − 10,000) / 500) pounds a week (SPC Regs 2002 reg 15(6)).
  7. Metadata. Uprating matches savings, and the default is -1.

pension_credit_reported_capital.yaml has nine hand-computed cases. They cover the default proxy, an override above and below the disregard, rounding of a part of £500, zero, a couple, person-level sources replaced, a working-age unit, a two-unit household (locality) and a guarantee credit case (2024-25 rates). The Pension Credit and local authority YAML suites (115 cases) and tests/code_health pass locally.

Coordination

axiom: n/a: microsim input for data-supplied benefit-unit capital; no rule change (SPC Regs reg 15(6) deemed income and SPCA s.5 aggregation are unchanged)

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 1, 2026 15:17
pension_credit_reported_capital (benefit unit, default -1) replaces the
household proxy in pension_credit_assessable_capital when it is 0 or more.
Pension Credit counts the claimant's capital and, under SPCA 2002 s.5, the
partner's. A survey's benefit-unit capital measure records that directly,
where the household proxy spreads imputed household wealth. With the default
every output is unchanged.

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

Copy link
Copy Markdown
Collaborator

Codex review — ready to merge

Reviewed commit 78645523bbaedc5fc47581a28f88a846c1839661. COMPLETE; no blocking findings in the changed implementation and directly affected dependencies.

The benefit-unit STOCK input uses a negative missing sentinel and distinguishes an explicit zero from missing capital. For a pension-age unit, the nonnegative input replaces both the household proxy and person-level capital; the existing pension-age gate and nonnegative floor remain outside that selection. The missing-input branch reproduces the old formula exactly. Other benefit units' existing proxy shares are unaffected. The input is registered with the same uprating index and dataset growth group as savings. Inspected period/entity metadata and the path through deemed income, Pension Credit income, guarantee credit, eligibility, entitlement and take-up.

The changed property and YAML tests cover default behavior, zero/nonzero override, multi-unit locality, couple pooling, person-level capital replacement, working-age exclusion, tariff rounding and entitlement monotonicity. A reviewer-owned two-case YAML diagnostic additionally exercises final payments with demographic/income inputs: for a single pensioner aged 75 in 2024, £9,000 State Pension and £120,000 imputed household savings, reporting £4,000 capital produces £2,343.80 Pension Credit; leaving the sentinel produces £0. No eligibility or intermediate benefit was forced. The expected payment extends the PR's existing 2024 guarantee calculation through the unchanged final-payment formula; this is implementation/composition validation, not a new statutory-rate audit.

Validation: 64 passed, 1 warning in 97.20s (0:01:37), exit 0; wrapper wall time 106.05s. Includes the new property tests, complete Pension Credit YAML directory, and two final-payment cases.

Tests imported this PR's isolated source snapshot using an existing cached Python environment (PolicyEngine Core 3.32.9, NumPy 2.1.3, pandas 2.3.1, microdf-python 1.2.1, Hypothesis 6.168.2 and pytest 8.4.2). This was focused local validation, not a full-suite run or a newly synced lockfile environment. No dependencies were installed. Live check before posting (2026-10-02T10:35:16.614204+00:00): same commit, CLEAN; all reported CI checks pass.

Private survey impact estimates were not rerun and are not used as approval evidence. This recommendation covers the reviewed change; it is posted as a review comment, not a formal GitHub approval vote.

Merge coordination: PRs #1969 and #1896 edit the same capital formula. Preserve this override outside their valuation/claimant-renaming changes when resolving any subsequent merge conflict. The data producer must fill this input before it changes population outputs.

@juaristi22
juaristi22 merged commit 9ef86f4 into main Oct 2, 2026
6 checks passed
@juaristi22
juaristi22 deleted the pc-reported-capital branch October 2, 2026 11:37
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.

2 participants