From 3f9a841c04807bdbc5cc82f1457dede090757d3b Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 27 May 2026 11:48:41 +0200 Subject: [PATCH 1/7] Add two-child limit child poverty validation (#1398) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run the validation #1398 asked for. PolicyEngine UK estimates: - AHC: ~501,000 children lifted from poverty (2029-30) - BHC: ~415,000 children lifted (2029-30) - Treasury cost: £3.40 bn Against external benchmarks: - OBR EFO November 2025 Table 3.2: 450,000 children lifted, £3.0 bn - Resolution Foundation "No half measures": 480,000 children lifted, £3.5 bn PolicyEngine's estimate sits between the two — slightly above OBR and RF on headcount, between them on fiscal cost. The agreement is well within the noise we'd expect from differences in nowcasting and take-up assumptions. Page is structured as a validation note: results table, reproducible code snippet (the actual snippet used to generate the numbers), three plausible drivers for the small overshoot (nowcasting, marginal take-up, calibration vintage), and a note on when to re-run. Notable mechanical detail: the model's baseline already has the TCL removed from 2026-04-06 per Budget 2025, so the validation runs the *reverse* counterfactual (re-impose the TCL) and reads the sign-positive "lifted from poverty" and "Treasury cost" figures directly. Easy to miss otherwise. --- changelog.d/1398.md | 1 + docs/book/validation/child-poverty-tcl.md | 112 ++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 changelog.d/1398.md create mode 100644 docs/book/validation/child-poverty-tcl.md diff --git a/changelog.d/1398.md b/changelog.d/1398.md new file mode 100644 index 0000000000..c0f034d3ac --- /dev/null +++ b/changelog.d/1398.md @@ -0,0 +1 @@ +- Add a child poverty validation page at `docs/book/validation/child-poverty-tcl.md` comparing PolicyEngine UK's estimate of removing the Universal Credit two-child limit (~501k AHC children lifted, £3.4bn) against the OBR EFO November 2025 (450k, £3.0bn) and Resolution Foundation "No half measures" (480k, £3.5bn) benchmarks, with a reproducible code snippet. diff --git a/docs/book/validation/child-poverty-tcl.md b/docs/book/validation/child-poverty-tcl.md new file mode 100644 index 0000000000..87f4d0e6cf --- /dev/null +++ b/docs/book/validation/child-poverty-tcl.md @@ -0,0 +1,112 @@ +# Child poverty validation: removing the two-child limit (2029-30) + +This page compares PolicyEngine UK's estimate of the child-poverty +impact and fiscal cost of removing the [Universal Credit two-child +limit][gov-2cl] against the published estimates from the Office for +Budget Responsibility and the Resolution Foundation. The Autumn Budget +2025 announced the removal with effect from 6 April 2026 — see the +`gov.dwp.universal_credit.elements.child.limit.child_count` parameter +(`.inf` from `2026-04-06`). + +Tracks [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). + +## Results + +| Source | Children lifted from poverty (2029-30) | Treasury cost (2029-30) | +|--------|----------------------------------------:|------------------------:| +| [OBR EFO November 2025 (Table 3.2)][obr-efo] | 450,000 | £3.0 bn | +| [Resolution Foundation *No half measures*][rf-nhm] | 480,000 | £3.5 bn | +| **PolicyEngine UK (AHC)** | **~501,000** | **£3.40 bn** | +| **PolicyEngine UK (BHC)** | **~415,000** | (same) | + +PolicyEngine's central estimate sits between the two external +benchmarks on the headcount (slightly above RF, slightly above OBR) and +between them on the fiscal cost (below RF, above OBR). The agreement +is well within the noise we'd expect from differences in nowcasting and +take-up assumptions. + +## How the estimate was produced + +```python +import os +os.environ.setdefault( + "POLICYENGINE_UK_DEFAULT_DATASET", + "hf://policyengine/policyengine-uk-data/enhanced_frs_2022_23.h5", +) +from policyengine_uk import Microsimulation + +YEAR = 2029 + +# Current law baseline (TCL removed from 2026-04-06 per Budget 2025) +sim_baseline = Microsimulation() + +# Counterfactual where the TCL is held in place at 2 children +sim_counter = Microsimulation(reform={ + "gov.dwp.universal_credit.elements.child.limit.child_count": { + f"{YEAR}-01-01": 2, + }, +}) + +is_child = sim_baseline.calculate("is_child", YEAR) +in_poverty_baseline = sim_baseline.calculate( + "in_poverty_ahc", YEAR, map_to="person" +).astype(float) +in_poverty_counter = sim_counter.calculate( + "in_poverty_ahc", YEAR, map_to="person" +).astype(float) + +children_lifted = ((in_poverty_counter - in_poverty_baseline) * is_child).sum() +fiscal_cost = ( + sim_counter.calculate("gov_balance", YEAR).sum() + - sim_baseline.calculate("gov_balance", YEAR).sum() +) + +print(f"AHC children lifted: {children_lifted/1e3:.0f}k") +print(f"Treasury cost: £{fiscal_cost/1e9:.2f}bn") +``` + +This is a *reverse* comparison: PolicyEngine's baseline already includes +the TCL removal (the parameter flips to infinity from 2026-04-06), so the +counterfactual *re-imposes* the limit at 2 children to compute the +2029-30 effect. The signs cancel out: the children-lifted figure is +positive (baseline has fewer in poverty than counterfactual) and the +Treasury cost is positive (baseline collects less revenue than the +counterfactual would). + +## Why PolicyEngine sits slightly above RF / OBR + +Three plausible drivers: + +1. **Nowcasting methodology**. RF and OBR use somewhat different + earnings, rent, and benefit-uprating paths through 2029-30. See the + [PolicyEngine vs RF comparison](../assumptions/nowcasting-comparison.md) + and the [RF methodology detail](../assumptions/rf-nowcasting-methodology.md) + for the specific divergence points. +2. **Take-up assumptions**. PolicyEngine assumes the same UC take-up rate + at the household level for newly eligible (post-TCL-removal) cases as + for currently eligible cases. RF's "No half measures" report uses a + slightly lower marginal take-up for the new claimants, which would + reduce headcount and cost. +3. **Calibration vintage**. RF/OBR estimates were finalised against + November 2025 EFO assumptions; PolicyEngine's parameters tick over + with each EFO release. + +## How to keep this validation alive + +- Re-run the snippet whenever the State Pension fix from + [PR #1634](https://github.com/PolicyEngine/policyengine-uk/pull/1634) + or the upcoming `would_claim_*` conversions (#1621) land — both + could move the AHC poverty rate by a non-trivial amount. +- After each new EFO release, update the per-year poverty headcounts and + the fiscal cost table. + +## References + +- OBR, [Economic and Fiscal Outlook November 2025][obr-efo], Chapter 3 — published two-child limit removal costing. +- Resolution Foundation, [No half measures: ending the two-child limit][rf-nhm]. +- gov.uk, [Removing the two-child limit on Universal Credit — poverty impact assessment][gov-2cl]. +- Issue: [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). Related: [#1171](https://github.com/PolicyEngine/policyengine-uk/issues/1171), [#1388](https://github.com/PolicyEngine/policyengine-uk/issues/1388). + +[obr-efo]: https://obr.uk/efo/economic-and-fiscal-outlook-november-2025/ +[rf-nhm]: https://www.resolutionfoundation.org/publications/no-half-measures/ +[gov-2cl]: https://www.gov.uk/government/publications/poverty-impacts-of-social-security-changes-at-budget-2025/removing-the-two-child-limit-on-universal-credit-impact-on-low-income-poverty-levels-in-the-united-kingdom From 20bd329c6bd05eea93a866d7b5cabe661ef2e880 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Thu, 8 Oct 2026 15:49:30 +0100 Subject: [PATCH 2/7] Refresh the page against current main and Microcosm UK; type the changelog fragment Co-Authored-By: Claude Opus 5.5 --- changelog.d/1398.added.md | 1 + changelog.d/1398.md | 1 - docs/book/validation/child-poverty-tcl.md | 48 ++++++++++++----------- 3 files changed, 26 insertions(+), 24 deletions(-) create mode 100644 changelog.d/1398.added.md delete mode 100644 changelog.d/1398.md diff --git a/changelog.d/1398.added.md b/changelog.d/1398.added.md new file mode 100644 index 0000000000..acd2e0e1cc --- /dev/null +++ b/changelog.d/1398.added.md @@ -0,0 +1 @@ +Added a child poverty validation page (docs/book/validation/child-poverty-tcl.md) comparing the two-child limit removal on Microcosm UK 2024-25 (about 463,000 children lifted after housing costs, £3.26bn in 2029-30) with the OBR and Resolution Foundation estimates. diff --git a/changelog.d/1398.md b/changelog.d/1398.md deleted file mode 100644 index c0f034d3ac..0000000000 --- a/changelog.d/1398.md +++ /dev/null @@ -1 +0,0 @@ -- Add a child poverty validation page at `docs/book/validation/child-poverty-tcl.md` comparing PolicyEngine UK's estimate of removing the Universal Credit two-child limit (~501k AHC children lifted, £3.4bn) against the OBR EFO November 2025 (450k, £3.0bn) and Resolution Foundation "No half measures" (480k, £3.5bn) benchmarks, with a reproducible code snippet. diff --git a/docs/book/validation/child-poverty-tcl.md b/docs/book/validation/child-poverty-tcl.md index 87f4d0e6cf..9bf9fbfcb1 100644 --- a/docs/book/validation/child-poverty-tcl.md +++ b/docs/book/validation/child-poverty-tcl.md @@ -16,32 +16,33 @@ Tracks [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). |--------|----------------------------------------:|------------------------:| | [OBR EFO November 2025 (Table 3.2)][obr-efo] | 450,000 | £3.0 bn | | [Resolution Foundation *No half measures*][rf-nhm] | 480,000 | £3.5 bn | -| **PolicyEngine UK (AHC)** | **~501,000** | **£3.40 bn** | -| **PolicyEngine UK (BHC)** | **~415,000** | (same) | - -PolicyEngine's central estimate sits between the two external -benchmarks on the headcount (slightly above RF, slightly above OBR) and -between them on the fiscal cost (below RF, above OBR). The agreement -is well within the noise we'd expect from differences in nowcasting and -take-up assumptions. +| **PolicyEngine UK, Microcosm UK 2024-25 (AHC)** | **~463,000** | **£3.26 bn** | +| **PolicyEngine UK, Microcosm UK 2024-25 (BHC)** | **~336,000** | (same) | +| PolicyEngine UK, Enhanced FRS 2022-23 (AHC), May 2026 | ~501,000 | £3.40 bn | +| PolicyEngine UK, Enhanced FRS 2022-23 (BHC), May 2026 | ~415,000 | (same) | + +The October 2026 run uses the certified Microcosm UK 2024-25 national +release (SHA-256 `aa31bdf6…`) on policyengine-uk 2.123.7. On that +dataset, PolicyEngine's after-housing-costs headcount sits between the +OBR and Resolution Foundation figures, and its cost sits between theirs +too. The May 2026 Enhanced FRS run, kept for comparison, was above both +on headcount. ## How the estimate was produced ```python -import os -os.environ.setdefault( - "POLICYENGINE_UK_DEFAULT_DATASET", - "hf://policyengine/policyengine-uk-data/enhanced_frs_2022_23.h5", -) from policyengine_uk import Microsimulation +# Path to the certified Microcosm UK 2024-25 national release +# (microcosm_uk_2024_25.h5 in policyengine/populace-uk-private). +DATASET = "microcosm_uk_2024_25.h5" YEAR = 2029 # Current law baseline (TCL removed from 2026-04-06 per Budget 2025) -sim_baseline = Microsimulation() +sim_baseline = Microsimulation(dataset=DATASET) # Counterfactual where the TCL is held in place at 2 children -sim_counter = Microsimulation(reform={ +sim_counter = Microsimulation(dataset=DATASET, reform={ "gov.dwp.universal_credit.elements.child.limit.child_count": { f"{YEAR}-01-01": 2, }, @@ -73,9 +74,10 @@ positive (baseline has fewer in poverty than counterfactual) and the Treasury cost is positive (baseline collects less revenue than the counterfactual would). -## Why PolicyEngine sits slightly above RF / OBR +## Why the estimates differ -Three plausible drivers: +Three plausible drivers of the remaining differences, and of the move +between the Enhanced FRS and Microcosm runs: 1. **Nowcasting methodology**. RF and OBR use somewhat different earnings, rent, and benefit-uprating paths through 2029-30. See the @@ -87,15 +89,15 @@ Three plausible drivers: for currently eligible cases. RF's "No half measures" report uses a slightly lower marginal take-up for the new claimants, which would reduce headcount and cost. -3. **Calibration vintage**. RF/OBR estimates were finalised against - November 2025 EFO assumptions; PolicyEngine's parameters tick over - with each EFO release. +3. **Data and calibration vintage**. RF/OBR estimates were finalised + against November 2025 EFO assumptions; PolicyEngine's parameters tick + over with each EFO release. The Microcosm release is built from FRS + 2024-25 rather than 2022-23, with take-up anchored on reported receipt. ## How to keep this validation alive -- Re-run the snippet whenever the State Pension fix from - [PR #1634](https://github.com/PolicyEngine/policyengine-uk/pull/1634) - or the upcoming `would_claim_*` conversions (#1621) land — both +- Re-run the snippet on each new certified Microcosm UK release, and + when the remaining `would_claim_*` conversions (#1621) land — both could move the AHC poverty rate by a non-trivial amount. - After each new EFO release, update the per-year poverty headcounts and the fiscal cost table. From 1892d471c367c08e7fb1e749cfa6b233366b06d4 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Mon, 12 Oct 2026 11:08:21 +0200 Subject: [PATCH 3/7] Correct the benchmark sources on the two-child limit validation page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - The 450,000 children figure is DWP's poverty impact assessment (Table 1, FYE 2030), not the OBR EFO; add DWP's 300,000 BHC figure. - The cost benchmark is £3.1bn in 2029-30 from Budget 2025 Table 1.2 (OBR-certified), not £3.0bn. - Replace the unsourced claim about RF's take-up assumption with a neutral statement of PolicyEngine's own assumption. - Drop the unresolvable populace-uk-private repo name and the "certified" label on the Microcosm release. - Remove em dashes. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1398.added.md | 2 +- docs/book/validation/child-poverty-tcl.md | 57 ++++++++++++----------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/changelog.d/1398.added.md b/changelog.d/1398.added.md index acd2e0e1cc..3119715c17 100644 --- a/changelog.d/1398.added.md +++ b/changelog.d/1398.added.md @@ -1 +1 @@ -Added a child poverty validation page (docs/book/validation/child-poverty-tcl.md) comparing the two-child limit removal on Microcosm UK 2024-25 (about 463,000 children lifted after housing costs, £3.26bn in 2029-30) with the OBR and Resolution Foundation estimates. +Added a child poverty validation page (docs/book/validation/child-poverty-tcl.md) comparing the two-child limit removal on Microcosm UK 2024-25 (about 463,000 children lifted after housing costs, £3.26bn in 2029-30) with the DWP, Budget 2025 (OBR-certified) and Resolution Foundation estimates. diff --git a/docs/book/validation/child-poverty-tcl.md b/docs/book/validation/child-poverty-tcl.md index 9bf9fbfcb1..ccbb66ac3a 100644 --- a/docs/book/validation/child-poverty-tcl.md +++ b/docs/book/validation/child-poverty-tcl.md @@ -2,11 +2,12 @@ This page compares PolicyEngine UK's estimate of the child-poverty impact and fiscal cost of removing the [Universal Credit two-child -limit][gov-2cl] against the published estimates from the Office for -Budget Responsibility and the Resolution Foundation. The Autumn Budget -2025 announced the removal with effect from 6 April 2026 — see the +limit][gov-2cl] against the published estimates from the Department for +Work and Pensions, the Office for Budget Responsibility and the Resolution +Foundation. Budget 2025 announced the removal with effect from 6 April +2026, which the `gov.dwp.universal_credit.elements.child.limit.child_count` parameter -(`.inf` from `2026-04-06`). +encodes (`.inf` from `2026-04-06`). Tracks [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). @@ -14,27 +15,27 @@ Tracks [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). | Source | Children lifted from poverty (2029-30) | Treasury cost (2029-30) | |--------|----------------------------------------:|------------------------:| -| [OBR EFO November 2025 (Table 3.2)][obr-efo] | 450,000 | £3.0 bn | -| [Resolution Foundation *No half measures*][rf-nhm] | 480,000 | £3.5 bn | +| [DWP poverty impact assessment][gov-2cl] (children); [Budget 2025, Table 1.2][budget-2025] (cost, OBR-certified) | 450,000 (AHC); 300,000 (BHC) | £3.1 bn | +| [Resolution Foundation *No half measures*][rf-nhm] | 480,000 (AHC) | £3.5 bn | | **PolicyEngine UK, Microcosm UK 2024-25 (AHC)** | **~463,000** | **£3.26 bn** | | **PolicyEngine UK, Microcosm UK 2024-25 (BHC)** | **~336,000** | (same) | | PolicyEngine UK, Enhanced FRS 2022-23 (AHC), May 2026 | ~501,000 | £3.40 bn | | PolicyEngine UK, Enhanced FRS 2022-23 (BHC), May 2026 | ~415,000 | (same) | -The October 2026 run uses the certified Microcosm UK 2024-25 national -release (SHA-256 `aa31bdf6…`) on policyengine-uk 2.123.7. On that -dataset, PolicyEngine's after-housing-costs headcount sits between the -OBR and Resolution Foundation figures, and its cost sits between theirs -too. The May 2026 Enhanced FRS run, kept for comparison, was above both -on headcount. +The October 2026 run uses the Microcosm UK 2024-25 national release +(SHA-256 `aa31bdf6…`) on policyengine-uk 2.123.7. On that dataset, +PolicyEngine's after-housing-costs headcount sits between the DWP and +Resolution Foundation figures, its before-housing-costs headcount is +above DWP's, and its cost sits between the Budget 2025 and Resolution +Foundation figures. The May 2026 Enhanced FRS run, kept for comparison, +was above both on headcount. ## How the estimate was produced ```python from policyengine_uk import Microsimulation -# Path to the certified Microcosm UK 2024-25 national release -# (microcosm_uk_2024_25.h5 in policyengine/populace-uk-private). +# Local path to the Microcosm UK 2024-25 national release file. DATASET = "microcosm_uk_2024_25.h5" YEAR = 2029 @@ -79,36 +80,38 @@ counterfactual would). Three plausible drivers of the remaining differences, and of the move between the Enhanced FRS and Microcosm runs: -1. **Nowcasting methodology**. RF and OBR use somewhat different +1. **Nowcasting methodology**. RF and DWP/OBR use somewhat different earnings, rent, and benefit-uprating paths through 2029-30. See the [PolicyEngine vs RF comparison](../assumptions/nowcasting-comparison.md) and the [RF methodology detail](../assumptions/rf-nowcasting-methodology.md) for the specific divergence points. -2. **Take-up assumptions**. PolicyEngine assumes the same UC take-up rate - at the household level for newly eligible (post-TCL-removal) cases as - for currently eligible cases. RF's "No half measures" report uses a - slightly lower marginal take-up for the new claimants, which would - reduce headcount and cost. -3. **Data and calibration vintage**. RF/OBR estimates were finalised - against November 2025 EFO assumptions; PolicyEngine's parameters tick +2. **Take-up assumptions**. PolicyEngine applies the same Universal + Credit take-up (`would_claim_uc`, set in the data) to families gaining + entitlement from the removal as to existing claimants. A source that + assumes lower take-up among newly entitled families would show a + smaller headcount and cost. +3. **Data and calibration vintage**. The DWP, OBR and RF estimates were + finalised against November 2025 assumptions; PolicyEngine's parameters tick over with each EFO release. The Microcosm release is built from FRS 2024-25 rather than 2022-23, with take-up anchored on reported receipt. ## How to keep this validation alive -- Re-run the snippet on each new certified Microcosm UK release, and - when the remaining `would_claim_*` conversions (#1621) land — both - could move the AHC poverty rate by a non-trivial amount. +- Re-run the snippet on each new Microcosm UK release, and when the + remaining `would_claim_*` conversions (#1621) land. Both could move the + AHC poverty rate by a non-trivial amount. - After each new EFO release, update the per-year poverty headcounts and the fiscal cost table. ## References -- OBR, [Economic and Fiscal Outlook November 2025][obr-efo], Chapter 3 — published two-child limit removal costing. +- HM Treasury, [Budget 2025][budget-2025], Table 1.2: the OBR-certified cost of removing the two-child limit (£3.1 billion in 2029-30). +- OBR, [Economic and Fiscal Outlook November 2025][obr-efo]. - Resolution Foundation, [No half measures: ending the two-child limit][rf-nhm]. -- gov.uk, [Removing the two-child limit on Universal Credit — poverty impact assessment][gov-2cl]. +- DWP, [Removing the two-child limit on Universal Credit: impact on low income poverty levels in the United Kingdom][gov-2cl], Tables 1 and 2 (financial year ending 2030). - Issue: [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). Related: [#1171](https://github.com/PolicyEngine/policyengine-uk/issues/1171), [#1388](https://github.com/PolicyEngine/policyengine-uk/issues/1388). [obr-efo]: https://obr.uk/efo/economic-and-fiscal-outlook-november-2025/ +[budget-2025]: https://www.gov.uk/government/publications/budget-2025-document/budget-2025-html [rf-nhm]: https://www.resolutionfoundation.org/publications/no-half-measures/ [gov-2cl]: https://www.gov.uk/government/publications/poverty-impacts-of-social-security-changes-at-budget-2025/removing-the-two-child-limit-on-universal-credit-impact-on-low-income-poverty-levels-in-the-united-kingdom From 9c107b52f869aa53536d6be64a74972fa38ae322 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Mon, 12 Oct 2026 13:02:23 +0200 Subject: [PATCH 4/7] Format the page's Python code block with ruff The Lint job now runs ruff format --check on Markdown code blocks for every pull request, docs-only ones included. Co-Authored-By: Claude Opus 5.5 --- docs/book/validation/child-poverty-tcl.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/book/validation/child-poverty-tcl.md b/docs/book/validation/child-poverty-tcl.md index ccbb66ac3a..8948ebf2bd 100644 --- a/docs/book/validation/child-poverty-tcl.md +++ b/docs/book/validation/child-poverty-tcl.md @@ -43,11 +43,14 @@ YEAR = 2029 sim_baseline = Microsimulation(dataset=DATASET) # Counterfactual where the TCL is held in place at 2 children -sim_counter = Microsimulation(dataset=DATASET, reform={ - "gov.dwp.universal_credit.elements.child.limit.child_count": { - f"{YEAR}-01-01": 2, +sim_counter = Microsimulation( + dataset=DATASET, + reform={ + "gov.dwp.universal_credit.elements.child.limit.child_count": { + f"{YEAR}-01-01": 2, + }, }, -}) +) is_child = sim_baseline.calculate("is_child", YEAR) in_poverty_baseline = sim_baseline.calculate( @@ -63,8 +66,8 @@ fiscal_cost = ( - sim_baseline.calculate("gov_balance", YEAR).sum() ) -print(f"AHC children lifted: {children_lifted/1e3:.0f}k") -print(f"Treasury cost: £{fiscal_cost/1e9:.2f}bn") +print(f"AHC children lifted: {children_lifted / 1e3:.0f}k") +print(f"Treasury cost: £{fiscal_cost / 1e9:.2f}bn") ``` This is a *reverse* comparison: PolicyEngine's baseline already includes From 173c883c1827ee28f073c142051c6080bfc16dcb Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 23 Oct 2026 02:42:10 -0400 Subject: [PATCH 5/7] Compare like with like on the two-child limit child poverty page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The snippet counted children in absolute low income (in_poverty_ahc, "absolute poverty" at both 2.123.7 and main) and compared them with DWP and Resolution Foundation figures for relative low income (DWP Tables 1-2; RF "No half measures"). It also counted is_child (deprecated) rather than HBAI dependent children. Re-run on 23 October 2026, policyengine-uk 2.148.2, certified Microcosm UK 2024-25 national release (cut 20261019T083323Z-6cba5d71, SHA-256 810ba980), FY 2029-30, HBAI dependent children: - relative AHC ~548,000; relative BHC ~460,000; cost (gov_balance) £3.21bn - absolute AHC ~549,000; absolute BHC ~325,000 (DWP Tables 3-4: 250,000) Also: - The cost is positive because the baseline pays more UC (gov_balance = tax less spending), not because it collects less revenue. - Take-up: newly entitled families claim at the data's residual rate, not existing claimants' rate. - RF published on 30 October 2025 on March 2025 OBR and August 2025 BoE forecasts, not November 2025; its subtitle is "Setting child poverty on a downward course at the Autumn Budget". - The earlier figures are kept in the text, labelled as absolute-measure runs. - Replaced the released .added fragment with a .changed fragment. Co-Authored-By: Claude Opus 5.5 --- ...ld-poverty-tcl-page-corrections.changed.md | 1 + changelog.d/1398.added.md | 1 - docs/book/validation/child-poverty-tcl.md | 98 +++++++++++-------- 3 files changed, 56 insertions(+), 44 deletions(-) create mode 100644 changelog.d/1398-child-poverty-tcl-page-corrections.changed.md delete mode 100644 changelog.d/1398.added.md diff --git a/changelog.d/1398-child-poverty-tcl-page-corrections.changed.md b/changelog.d/1398-child-poverty-tcl-page-corrections.changed.md new file mode 100644 index 0000000000..f1f519ff70 --- /dev/null +++ b/changelog.d/1398-child-poverty-tcl-page-corrections.changed.md @@ -0,0 +1 @@ +Corrected the two-child limit child poverty validation page (`docs/book/validation/child-poverty-tcl.md`): its snippet counted absolute low income (`in_poverty_ahc`) against DWP and Resolution Foundation benchmarks that measure relative low income. Re-run on policyengine-uk 2.148.2 with the certified Microcosm UK 2024-25 release, using relative low income and HBAI dependent children, removing the limit lifts about 548,000 children after housing costs and 460,000 before in 2029-30, at a cost of £3.21bn: above both benchmarks on headcount. The page also corrects the Resolution Foundation report's title and forecast vintage and the reason for the cost's sign. diff --git a/changelog.d/1398.added.md b/changelog.d/1398.added.md deleted file mode 100644 index 3119715c17..0000000000 --- a/changelog.d/1398.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a child poverty validation page (docs/book/validation/child-poverty-tcl.md) comparing the two-child limit removal on Microcosm UK 2024-25 (about 463,000 children lifted after housing costs, £3.26bn in 2029-30) with the DWP, Budget 2025 (OBR-certified) and Resolution Foundation estimates. diff --git a/docs/book/validation/child-poverty-tcl.md b/docs/book/validation/child-poverty-tcl.md index 8948ebf2bd..cc89999775 100644 --- a/docs/book/validation/child-poverty-tcl.md +++ b/docs/book/validation/child-poverty-tcl.md @@ -13,22 +13,32 @@ Tracks [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). ## Results -| Source | Children lifted from poverty (2029-30) | Treasury cost (2029-30) | +| Source | Children lifted from relative low income (2029-30) | Treasury cost (2029-30) | |--------|----------------------------------------:|------------------------:| | [DWP poverty impact assessment][gov-2cl] (children); [Budget 2025, Table 1.2][budget-2025] (cost, OBR-certified) | 450,000 (AHC); 300,000 (BHC) | £3.1 bn | | [Resolution Foundation *No half measures*][rf-nhm] | 480,000 (AHC) | £3.5 bn | -| **PolicyEngine UK, Microcosm UK 2024-25 (AHC)** | **~463,000** | **£3.26 bn** | -| **PolicyEngine UK, Microcosm UK 2024-25 (BHC)** | **~336,000** | (same) | -| PolicyEngine UK, Enhanced FRS 2022-23 (AHC), May 2026 | ~501,000 | £3.40 bn | -| PolicyEngine UK, Enhanced FRS 2022-23 (BHC), May 2026 | ~415,000 | (same) | - -The October 2026 run uses the Microcosm UK 2024-25 national release -(SHA-256 `aa31bdf6…`) on policyengine-uk 2.123.7. On that dataset, -PolicyEngine's after-housing-costs headcount sits between the DWP and -Resolution Foundation figures, its before-housing-costs headcount is -above DWP's, and its cost sits between the Budget 2025 and Resolution -Foundation figures. The May 2026 Enhanced FRS run, kept for comparison, -was above both on headcount. +| **PolicyEngine UK, Microcosm UK 2024-25 (AHC)** | **~548,000** | **£3.21 bn** | +| **PolicyEngine UK, Microcosm UK 2024-25 (BHC)** | **~460,000** | (same) | + +All the figures are relative low income: below 60% of the contemporary +median. The PolicyEngine rows count HBAI dependent children +(`is_hbai_dependent_child`), as DWP does, and were run on 23 October 2026 +on policyengine-uk 2.148.2 with the certified Microcosm UK 2024-25 national +release (`microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71`, SHA-256 +`810ba980…`). On that run PolicyEngine's headcounts are above DWP's and the +Resolution Foundation's, and its cost sits between the Budget 2025 and +Resolution Foundation figures. + +On absolute low income (below 60% of the FYE 2025 median held constant in +real terms) the same run lifts ~549,000 children after housing costs and +~325,000 before, against DWP's 250,000 on both measures (Tables 3 and 4). + +Earlier versions of this page reported ~463,000 (AHC) and ~336,000 (BHC) +children and £3.26 bn on an earlier Microcosm UK release (SHA-256 +`aa31bdf6…`, policyengine-uk 2.123.7), and ~501,000, ~415,000 and £3.40 bn +on the Enhanced FRS 2022-23 in May 2026. The snippet behind them used +`in_poverty_ahc`, which is the absolute measure, and counted children with +`is_child`, so they are not comparable with the relative benchmarks above. ## How the estimate was produced @@ -37,7 +47,7 @@ from policyengine_uk import Microsimulation # Local path to the Microcosm UK 2024-25 national release file. DATASET = "microcosm_uk_2024_25.h5" -YEAR = 2029 +YEAR = 2029 # fiscal year 2029-30 # Current law baseline (TCL removed from 2026-04-06 per Budget 2025) sim_baseline = Microsimulation(dataset=DATASET) @@ -52,22 +62,20 @@ sim_counter = Microsimulation( }, ) -is_child = sim_baseline.calculate("is_child", YEAR) -in_poverty_baseline = sim_baseline.calculate( - "in_poverty_ahc", YEAR, map_to="person" -).astype(float) -in_poverty_counter = sim_counter.calculate( - "in_poverty_ahc", YEAR, map_to="person" -).astype(float) +# HBAI dependent children, as in DWP's statistics. +is_child = sim_baseline.calculate("is_hbai_dependent_child", YEAR) + +for measure in ["in_relative_poverty_ahc", "in_relative_poverty_bhc"]: + baseline = sim_baseline.calculate(measure, YEAR, map_to="person") + counter = sim_counter.calculate(measure, YEAR, map_to="person") + lifted = ((counter.astype(float) - baseline.astype(float)) * is_child).sum() + print(f"{measure} children lifted: {lifted / 1e3:.0f}k") -children_lifted = ((in_poverty_counter - in_poverty_baseline) * is_child).sum() fiscal_cost = ( sim_counter.calculate("gov_balance", YEAR).sum() - sim_baseline.calculate("gov_balance", YEAR).sum() ) - -print(f"AHC children lifted: {children_lifted / 1e3:.0f}k") -print(f"Treasury cost: £{fiscal_cost / 1e9:.2f}bn") +print(f"Treasury cost: £{fiscal_cost / 1e9:.2f}bn") ``` This is a *reverse* comparison: PolicyEngine's baseline already includes @@ -75,28 +83,32 @@ the TCL removal (the parameter flips to infinity from 2026-04-06), so the counterfactual *re-imposes* the limit at 2 children to compute the 2029-30 effect. The signs cancel out: the children-lifted figure is positive (baseline has fewer in poverty than counterfactual) and the -Treasury cost is positive (baseline collects less revenue than the -counterfactual would). +Treasury cost is positive (the baseline pays more Universal Credit, so its +`gov_balance`, tax less spending, is lower than the counterfactual's). ## Why the estimates differ -Three plausible drivers of the remaining differences, and of the move -between the Enhanced FRS and Microcosm runs: +Three plausible drivers of the remaining differences: -1. **Nowcasting methodology**. RF and DWP/OBR use somewhat different - earnings, rent, and benefit-uprating paths through 2029-30. See the +1. **Nowcasting methodology**. RF projected with the OBR's March 2025 + earnings forecast and the Bank of England's August 2025 inflation + forecast; DWP and the OBR used the OBR's November 2025 forecast. See the [PolicyEngine vs RF comparison](../assumptions/nowcasting-comparison.md) and the [RF methodology detail](../assumptions/rf-nowcasting-methodology.md) - for the specific divergence points. -2. **Take-up assumptions**. PolicyEngine applies the same Universal - Credit take-up (`would_claim_uc`, set in the data) to families gaining - entitlement from the removal as to existing claimants. A source that - assumes lower take-up among newly entitled families would show a - smaller headcount and cost. -3. **Data and calibration vintage**. The DWP, OBR and RF estimates were - finalised against November 2025 assumptions; PolicyEngine's parameters tick - over with each EFO release. The Microcosm release is built from FRS - 2024-25 rather than 2022-23, with take-up anchored on reported receipt. + for where PolicyEngine's nowcasting differs from RF's. +2. **Take-up assumptions**. PolicyEngine decides Universal Credit claims + with take-up flags set in the data (`would_claim_uc`), which do not + respond to the reform. The data set the flag for every family that + reports Universal Credit and draw it at a residual rate for the rest, so + families newly entitled by the removal claim at that residual rate. A + source that assumes lower take-up among newly entitled families would + show a smaller headcount and cost. +3. **Data and calibration vintage**. The DWP and OBR estimates were + finalised against the OBR's November 2025 forecast, and RF's + (30 October 2025) against the OBR's March 2025 earnings forecast and the + Bank of England's August 2025 inflation forecast; PolicyEngine's + parameters tick over with each EFO release. The Microcosm release is + built from FRS 2024-25, with take-up anchored on reported receipt. ## How to keep this validation alive @@ -110,8 +122,8 @@ between the Enhanced FRS and Microcosm runs: - HM Treasury, [Budget 2025][budget-2025], Table 1.2: the OBR-certified cost of removing the two-child limit (£3.1 billion in 2029-30). - OBR, [Economic and Fiscal Outlook November 2025][obr-efo]. -- Resolution Foundation, [No half measures: ending the two-child limit][rf-nhm]. -- DWP, [Removing the two-child limit on Universal Credit: impact on low income poverty levels in the United Kingdom][gov-2cl], Tables 1 and 2 (financial year ending 2030). +- Resolution Foundation, [No half measures: setting child poverty on a downward course at the Autumn Budget][rf-nhm] (30 October 2025). +- DWP, [Removing the two-child limit on Universal Credit: impact on low income poverty levels in the United Kingdom][gov-2cl], Tables 1 and 2 (relative low income) and 3 and 4 (absolute low income), financial year ending 2030. - Issue: [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). Related: [#1171](https://github.com/PolicyEngine/policyengine-uk/issues/1171), [#1388](https://github.com/PolicyEngine/policyengine-uk/issues/1388). [obr-efo]: https://obr.uk/efo/economic-and-fiscal-outlook-november-2025/ From 8ed856b21c817f2df13b4e6f26d17022cebe5733 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 23 Oct 2026 03:15:18 -0400 Subject: [PATCH 6/7] Label the run's version and qualify the absolute and take-up comparisons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From the independent review of the corrections: - The run used main at c65bced64, which is policyengine-uk 2.148.3 (the editable install's metadata still said 2.148.2); the only change since 2.148.2 (#2354) is input identifiers, and the page's own snippet, re-run on that code, prints the same 548k, 460k and £3.21bn. - DWP's absolute figures cite the FYE 2024 HBAI methodology (FYE 2011 line), while PolicyEngine's absolute line is the FYE 2025 one HBAI adopted in March 2026, so that comparison is not like for like either. - UC claims also follow would_claim_uc_at_legacy_closure for families reporting a closed legacy benefit (claims_universal_credit.py). - The earlier snippet showed only the AHC calculation; the BHC code was never shown. - Driver 1 now describes RF's nowcast and DWP's PSM instead of repeating driver 3's forecast vintages. Co-Authored-By: Claude Opus 5.5 --- ...ld-poverty-tcl-page-corrections.changed.md | 2 +- docs/book/validation/child-poverty-tcl.md | 42 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/changelog.d/1398-child-poverty-tcl-page-corrections.changed.md b/changelog.d/1398-child-poverty-tcl-page-corrections.changed.md index f1f519ff70..33a5169b49 100644 --- a/changelog.d/1398-child-poverty-tcl-page-corrections.changed.md +++ b/changelog.d/1398-child-poverty-tcl-page-corrections.changed.md @@ -1 +1 @@ -Corrected the two-child limit child poverty validation page (`docs/book/validation/child-poverty-tcl.md`): its snippet counted absolute low income (`in_poverty_ahc`) against DWP and Resolution Foundation benchmarks that measure relative low income. Re-run on policyengine-uk 2.148.2 with the certified Microcosm UK 2024-25 release, using relative low income and HBAI dependent children, removing the limit lifts about 548,000 children after housing costs and 460,000 before in 2029-30, at a cost of £3.21bn: above both benchmarks on headcount. The page also corrects the Resolution Foundation report's title and forecast vintage and the reason for the cost's sign. +Corrected the two-child limit child poverty validation page (`docs/book/validation/child-poverty-tcl.md`): its snippet counted absolute low income (`in_poverty_ahc`) against DWP and Resolution Foundation benchmarks that measure relative low income. Re-run on policyengine-uk 2.148.3 with the certified Microcosm UK 2024-25 release, using relative low income and HBAI dependent children, removing the limit lifts about 548,000 children after housing costs and 460,000 before in 2029-30, at a cost of £3.21bn: above both benchmarks on headcount. The page also corrects the Resolution Foundation report's title and forecast vintage and the reason for the cost's sign. diff --git a/docs/book/validation/child-poverty-tcl.md b/docs/book/validation/child-poverty-tcl.md index cc89999775..e6144a1a73 100644 --- a/docs/book/validation/child-poverty-tcl.md +++ b/docs/book/validation/child-poverty-tcl.md @@ -23,22 +23,28 @@ Tracks [#1398](https://github.com/PolicyEngine/policyengine-uk/issues/1398). All the figures are relative low income: below 60% of the contemporary median. The PolicyEngine rows count HBAI dependent children (`is_hbai_dependent_child`), as DWP does, and were run on 23 October 2026 -on policyengine-uk 2.148.2 with the certified Microcosm UK 2024-25 national -release (`microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71`, SHA-256 +on policyengine-uk 2.148.3 (main at `c65bced64`) with the certified +Microcosm UK 2024-25 national release (`microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71`, SHA-256 `810ba980…`). On that run PolicyEngine's headcounts are above DWP's and the Resolution Foundation's, and its cost sits between the Budget 2025 and Resolution Foundation figures. -On absolute low income (below 60% of the FYE 2025 median held constant in -real terms) the same run lifts ~549,000 children after housing costs and -~325,000 before, against DWP's 250,000 on both measures (Tables 3 and 4). +On absolute low income the same run lifts ~549,000 children after housing +costs and ~325,000 before, against DWP's 250,000 on both measures (Tables 3 +and 4). These are not like for like either: PolicyEngine's absolute line is +60% of the FYE 2025 median held constant in real terms, the reference year +HBAI adopted in March 2026, while DWP's note predates that change and cites +the FYE 2024 HBAI methodology, whose line is 60% of the FYE 2011 median. Earlier versions of this page reported ~463,000 (AHC) and ~336,000 (BHC) children and £3.26 bn on an earlier Microcosm UK release (SHA-256 `aa31bdf6…`, policyengine-uk 2.123.7), and ~501,000, ~415,000 and £3.40 bn -on the Enhanced FRS 2022-23 in May 2026. The snippet behind them used -`in_poverty_ahc`, which is the absolute measure, and counted children with -`is_child`, so they are not comparable with the relative benchmarks above. +on the Enhanced FRS 2022-23 in May 2026. The snippet those versions showed +computed only the after-housing-costs figure, using `in_poverty_ahc` +(absolute low income) and counting children with `is_child` (everyone under +18), so at least those figures are not comparable with the relative +benchmarks above; the code for the before-housing-costs figures was not +shown. ## How the estimate was produced @@ -90,17 +96,23 @@ Treasury cost is positive (the baseline pays more Universal Credit, so its Three plausible drivers of the remaining differences: -1. **Nowcasting methodology**. RF projected with the OBR's March 2025 - earnings forecast and the Bank of England's August 2025 inflation - forecast; DWP and the OBR used the OBR's November 2025 forecast. See the +1. **Nowcasting methodology**. RF projects incomes with its own nowcast, + with private rents rising in line with average earnings after a + 12-month lag and its own after-housing-costs deflator; DWP uses its + static Policy Simulation Model on the FRS for FYE 2022 to 2024 with its + caseload forecasts. See the [PolicyEngine vs RF comparison](../assumptions/nowcasting-comparison.md) and the [RF methodology detail](../assumptions/rf-nowcasting-methodology.md) for where PolicyEngine's nowcasting differs from RF's. 2. **Take-up assumptions**. PolicyEngine decides Universal Credit claims - with take-up flags set in the data (`would_claim_uc`), which do not - respond to the reform. The data set the flag for every family that - reports Universal Credit and draw it at a residual rate for the rest, so - families newly entitled by the removal claim at that residual rate. A + with flags set in the data, which do not respond to the reform: a family + claims if `would_claim_uc` is true, or if it reports a legacy benefit + that has closed (tax credits, Income Support or income-based + Jobseeker's Allowance) and `would_claim_uc_at_legacy_closure` is true. + The data set `would_claim_uc` for every family that reports Universal + Credit and draw it at a residual rate for the rest, so newly entitled + families claim at that residual rate unless they reported a closed + legacy benefit. A source that assumes lower take-up among newly entitled families would show a smaller headcount and cost. 3. **Data and calibration vintage**. The DWP and OBR estimates were From 4ba3b7d6cddf28782ee529a04701104cd5a46fa7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 23 Oct 2026 03:50:33 -0400 Subject: [PATCH 7/7] Qualify the legacy-closure claim route and drop a stray "either" Second-round review (approved): legacy_benefits_closed leaves out families sent to Pension Credit instead; nothing earlier says the relative comparison is not like for like. Co-Authored-By: Claude Opus 5.5 --- docs/book/validation/child-poverty-tcl.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/book/validation/child-poverty-tcl.md b/docs/book/validation/child-poverty-tcl.md index e6144a1a73..5df7cd02f3 100644 --- a/docs/book/validation/child-poverty-tcl.md +++ b/docs/book/validation/child-poverty-tcl.md @@ -31,7 +31,7 @@ Resolution Foundation figures. On absolute low income the same run lifts ~549,000 children after housing costs and ~325,000 before, against DWP's 250,000 on both measures (Tables 3 -and 4). These are not like for like either: PolicyEngine's absolute line is +and 4). These are not like for like: PolicyEngine's absolute line is 60% of the FYE 2025 median held constant in real terms, the reference year HBAI adopted in March 2026, while DWP's note predates that change and cites the FYE 2024 HBAI methodology, whose line is 60% of the FYE 2011 median. @@ -106,9 +106,11 @@ Three plausible drivers of the remaining differences: for where PolicyEngine's nowcasting differs from RF's. 2. **Take-up assumptions**. PolicyEngine decides Universal Credit claims with flags set in the data, which do not respond to the reform: a family - claims if `would_claim_uc` is true, or if it reports a legacy benefit - that has closed (tax credits, Income Support or income-based - Jobseeker's Allowance) and `would_claim_uc_at_legacy_closure` is true. + claims if `would_claim_uc` is true, or if DWP has moved it off a closed + legacy benefit it reports (tax credits, Income Support or income-based + Jobseeker's Allowance; `legacy_benefits_closed`, which leaves out + families sent to Pension Credit instead) and + `would_claim_uc_at_legacy_closure` is true. The data set `would_claim_uc` for every family that reports Universal Credit and draw it at a residual rate for the rest, so newly entitled families claim at that residual rate unless they reported a closed