diff --git a/changelog.d/2708.fixed.md b/changelog.d/2708.fixed.md new file mode 100644 index 0000000000..9d22174d3a --- /dev/null +++ b/changelog.d/2708.fixed.md @@ -0,0 +1 @@ +Corrected the two-child limit full roll-out page: it now describes the modelled exceptions to the limit and uses the FYE 2011 absolute poverty variables instead of overriding the thresholds. diff --git a/docs/book/validation/two-child-limit-full-rollout.md b/docs/book/validation/two-child-limit-full-rollout.md index 7e274ca3c1..b42cc2d703 100644 --- a/docs/book/validation/two-child-limit-full-rollout.md +++ b/docs/book/validation/two-child-limit-full-rollout.md @@ -26,10 +26,16 @@ any child's birth. The same date also preserves the higher Universal Credit child element for a first child born before 6 April 2017, so full roll-out removes that too. IFS full roll-out analysis likewise removes the Child Tax Credit family premium, its legacy equivalent ([IFS, 2024][ifs-2024], Table 6.5). +Tax credits ended on 5 April 2025 (`gov.dwp.tax_credits.active` is false from +6 April 2025), so in 2025-26 Child Tax Credit is zero and only the Universal +Credit settings change the results. -**Take-up.** Universal Credit claiming comes from `would_claim_uc`, set in the -data, and does not respond to the reform. For full take-up, set it to true for -every benefit unit with `set_input` before calculating anything. +**Take-up.** Universal Credit claiming (`claims_universal_credit`) comes from +`would_claim_uc` and, for a family moved off legacy benefits, +`would_claim_uc_at_legacy_closure`. Both are set in the data, and neither +responds to the reform. For full take-up, set `would_claim_uc` to true for +every benefit unit with `set_input` before calculating anything that depends +on it; every benefit unit then claims. **Poverty measure.** The poverty flags are household variables. Count children by mapping them to people and multiplying by `is_hbai_dependent_child`, the @@ -37,33 +43,56 @@ HBAI definition of a child: | Variable | Measure | |---|---| -| `in_poverty_ahc` | Absolute low income, after housing costs | -| `in_poverty_bhc` | Absolute low income, before housing costs | +| `in_poverty_ahc` | Absolute low income on HBAI's current FYE 2025 line, after housing costs | +| `in_poverty_bhc` | The same, before housing costs | | `in_poverty` | Same as `in_poverty_bhc` (via the poverty gap) | +| `in_absolute_poverty_fye2011_ahc` | Absolute low income on the FYE 2011 line, after housing costs | +| `in_absolute_poverty_fye2011_bhc` | The same, before housing costs | | `in_relative_poverty_ahc` | Relative low income (60% of the contemporary median), after housing costs | | `in_relative_poverty_bhc` | Relative low income, before housing costs | -The absolute line is 60% of the FYE 2025 median held constant in real terms, -the reference year HBAI adopted in March 2026. Estimates published before then, +HBAI's absolute line is 60% of a reference year's median held constant in real +terms. Since March 2026 the reference year is FYE 2025, applied from FYE 2022, +and `in_poverty_ahc` and `_bhc` follow it. Estimates published before then, including the IFS comment and DWP's Budget 2025 poverty impact notes, use 60% of -the FYE 2011 median. To use that line, override -`household.poverty.absolute_poverty_threshold_bhc` and `_ahc` for the year, as -below. The snippet approximates the FYE 2011-based line by its FYE 2021 value -in the parameter file (£305.70 a week BHC, £261.92 AHC, for a couple without -children), uprated by the model's CPI index; HBAI uprates by its own CPI -variants, so this is close but not exact. - -**Exceptions.** The model does not apply the statutory exceptions to the limit -(multiple births, adoption, non-parental caring arrangements and non-consensual -conception; [Universal Credit Regulations 2013, Schedule 12][sch12]). DWP -counted 26,300 households with an exception in April 2025, out of about -470,000 affected ([UC two-child limit statistics, April 2025][dwp-2cl]). +the FYE 2011 median. From policyengine-uk 2.155.0, +`in_absolute_poverty_fye2011_ahc` and `_bhc` compare equivalised income with +that line in every year (`poverty_threshold_fye2011_ahc` and `_bhc`, from the +parameters `household.poverty.absolute_poverty_threshold_fye2011_ahc` and +`_bhc`). The parameters hold HBAI's published values up to FYE 2025 and uprate +later years by headline OBR CPI, where HBAI uses its own CPI variants, so the +2025-26 line is close to HBAI's but not exact. + +**Exceptions.** From policyengine-uk 2.161.0 the model applies the statutory +exceptions to the limit: multiple births, adoption, non-parental caring +arrangements, non-consensual conception and the continuation of an earlier +exception ([Universal Credit Regulations 2013, regulation 24A][reg24a] and +[Schedule 12][sch12]; [Child Tax Credit Regulations 2002, regulations 9 to +14][ctc-reg9]). Each is a person-level input that defaults to false: +`child_limit_multiple_birth_exception`, `child_limit_adoption_exception`, +`child_limit_non_parental_caring_exception`, +`child_limit_non_consensual_conception_exception` and +`child_limit_continuation_exception`. In Universal Credit, a third or later +child with the multiple births, non-consensual conception or continuation +exception gets the child element (`uc_child_limit_exception`). An adopted child +or one in non-parental care gets it whatever their place, and is left out of +the order of children that the limit counts (`uc_child_limit_disregarded`). +Child Tax Credit has its own equivalents (`is_CTC_child_limit_exception`). + +The Microcosm release does not supply these inputs. The FRS does not record the +exceptions, so Microcosm leaves all five at their default +([`policyengine_uk_concepts.py`][microcosm-defaults]), and no child in the run +below has one. A child who would have an exception is then subject to the +limit in the baseline, so for those families the run overstates the loss from +the limit and the gain from removing it. DWP counted 26,300 households with an +exception in April 2025, out of about 470,000 affected ([UC two-child limit +statistics, April 2025][dwp-2cl]). ## Code ```python import numpy as np -from policyengine_uk import CountryTaxBenefitSystem, Microsimulation +from policyengine_uk import Microsimulation # Local path to the Microcosm UK 2024-25 national release file. DATASET = "microcosm_uk_2024_25.h5" @@ -76,15 +105,14 @@ CTC = "gov.dwp.tax_credits.child_tax_credit.limit" # removes the higher first-child element, which the same date preserves. FULL_ROLLOUT = {f"{p}.born_before": {WINDOW: 10000101} for p in (UC, CTC)} -# Optional: the FYE 2011-based absolute line used by HBAI before March 2026, -# approximated as its FYE 2021 value uprated by the model's CPI index. -cpi = CountryTaxBenefitSystem().parameters.gov.economic_assumptions.indices.obr -uprate = cpi.consumer_price_index(f"{YEAR}-01-01") / cpi.consumer_price_index( - "2020-01-01" -) -FYE2011_LINE = { - "household.poverty.absolute_poverty_threshold_bhc": {WINDOW: 305.7 * uprate}, - "household.poverty.absolute_poverty_threshold_ahc": {WINDOW: 261.92 * uprate}, +# Absolute low income after and before housing costs, on HBAI's current +# FYE 2025 line and on the FYE 2011 line used before March 2026. +LINES = { + "FYE 2025 line": ["in_poverty_ahc", "in_poverty_bhc"], + "FYE 2011 line": [ + "in_absolute_poverty_fye2011_ahc", + "in_absolute_poverty_fye2011_bhc", + ], } @@ -92,39 +120,50 @@ def child_limit(n): return {f"{p}.child_count": {WINDOW: n} for p in (UC, CTC)} -def run(extra, full_take_up=False): - sim = Microsimulation(dataset=DATASET, reform=extra or None) +def run(reform, full_take_up=False): + sim = Microsimulation(dataset=DATASET, reform=reform or None) if full_take_up: n = len(sim.calculate("benunit_weight", YEAR)) sim.set_input("would_claim_uc", YEAR, np.ones(n, dtype=bool)) child = sim.calculate("is_hbai_dependent_child", YEAR) - benefits = ( - sim.calculate("universal_credit", YEAR).sum() - + sim.calculate("child_tax_credit", YEAR).sum() + # Universal Credit and Child Tax Credit for each benefit unit, and the + # same amounts against each of its members. + benefits, per_person = ( + sim.calculate("universal_credit", YEAR, map_to=entity) + + sim.calculate("child_tax_credit", YEAR, map_to=entity) + for entity in (None, "person") ) poor = { m: (sim.calculate(m, YEAR, map_to="person") * child).sum() - for m in ["in_poverty_ahc", "in_poverty_bhc"] + for measures in LINES.values() + for m in measures } - return benefits, poor + return benefits, per_person, child, poor def compare(setting, full_take_up=False): - base_cost, base_poor = run(setting, full_take_up) + base, base_per_person, child, base_poor = run(setting, full_take_up) for name, n in [("abolish", np.inf), ("three-child limit", 3)]: - cost, poor = run({**setting, **child_limit(n)}, full_take_up) - lifted = {m: (base_poor[m] - poor[m]) / 1e3 for m in poor} + reformed, per_person, _, poor = run({**setting, **child_limit(n)}, full_take_up) + cost = (reformed.sum() - base.sum()) / 1e9 + # Benefit units gaining more than £1 a year, and their children. + units = (reformed > base + 1).sum() / 1e3 + children = ((per_person > base_per_person + 1) * child).sum() / 1e6 print( - f"{name}: cost £{(cost - base_cost) / 1e9:.2f}bn, children lifted " - f"(thousands) AHC {lifted['in_poverty_ahc']:.0f}, " - f"BHC {lifted['in_poverty_bhc']:.0f}" + f"{name}: cost £{cost:.2f}bn; {units:.0f}k benefit units gain, " + f"with {children:.2f}m children" ) + for line, (ahc, bhc) in LINES.items(): + lifted = [(base_poor[m] - poor[m]) / 1e3 for m in (ahc, bhc)] + print( + f" children lifted (thousands), {line}: " + f"AHC {lifted[0]:.0f}, BHC {lifted[1]:.0f}" + ) compare({}) # current law: pre-April 2017 children protected compare(FULL_ROLLOUT) compare(FULL_ROLLOUT, full_take_up=True) -compare({**FULL_ROLLOUT, **FYE2011_LINE}, full_take_up=True) ``` Reform keys use the `YYYY-MM-DD.YYYY-MM-DD` form, which the dictionary and @@ -132,49 +171,93 @@ Reform keys use the `YYYY-MM-DD.YYYY-MM-DD` form, which the dictionary and ## Results, 2025-26 -Run on 23 October 2026 with policyengine-uk 2.147.2 and the Microcosm UK -2024-25 national release `microcosm-uk-2024-25-national-20261023T075039Z-a133f37a` -(SHA-256 `64f83900…`). Cost is the change in Universal Credit and Child Tax -Credit spending. Children lifted are children out of absolute low income. +These results come from running the snippet above on 28 October 2026 with +policyengine-uk 2.162.14 and the Microcosm UK 2024-25 national release +`microcosm-uk-2024-25-national-20261028T061416Z-3c0d11b6` (SHA-256 +`a5ae72ae…`), which was built with that version. Only the `DATASET` path was +changed. The run is nine microsimulations: a baseline and two reforms for each +setting. policyengine.py 6.11.1 certifies policyengine-uk 2.151.0, which has +neither the exception rules nor the FYE 2011 line variables, so this pair is +not a certified one. Cost is the change in Universal Credit and Child Tax +Credit spending. A benefit unit gains if those two rise by more than £1 a year. + +| Setting | Abolish: cost | Abolish: benefit units gaining (their children) | Three-child limit: cost | Three-child limit: benefit units gaining (their children) | +|---|---:|---:|---:|---:| +| Current law (protection for pre-April 2017 children) | £1.91bn | 459k (1.64m) | £1.15bn | 351k (1.13m) | +| Full roll-out | £3.07bn | 639k (2.21m) | £2.13bn | 632k (2.17m) | +| Full roll-out, full UC take-up | £3.56bn | 767k (2.62m) | £2.52bn | 757k (2.57m) | +| IFS, fully rolled out | about £3.6bn | over 800,000 households | about £2.6bn | — | + +Children lifted out of absolute low income, in thousands, after / before +housing costs: -| Setting | Abolish: cost | Abolish: children lifted, AHC / BHC | Three-child limit: cost | Three-child limit: children lifted, AHC / BHC | +| Setting | Abolish: FYE 2025 line | Abolish: FYE 2011 line | Three-child limit: FYE 2025 line | Three-child limit: FYE 2011 line | |---|---:|---:|---:|---:| -| Current law (protection for pre-April 2017 children) | £1.94bn | 217k / 268k | £1.17bn | 137k / 159k | -| Full roll-out | £3.35bn | 439k / 445k | £2.32bn | 289k / 314k | -| Full roll-out, full UC take-up | £3.58bn | 475k / 484k | £2.51bn | 312k / 374k | -| Full roll-out, full UC take-up, FYE 2011-based line | £3.58bn | 455k / 353k | £2.51bn | 293k / 196k | -| IFS, fully rolled out (AHC, FYE 2011-based line) | about £3.6bn | 630,000 | about £2.6bn | 420,000 | +| Current law (protection for pre-April 2017 children) | 209 / 299 | 229 / 235 | 132 / 219 | 194 / 97 | +| Full roll-out | 392 / 417 | 287 / 339 | 267 / 313 | 186 / 178 | +| Full roll-out, full UC take-up | 450 / 496 | 366 / 361 | 294 / 399 | 240 / 184 | +| IFS, fully rolled out | | 630 (after housing costs) | | 420 (after housing costs) | -Under current law, 467,000 benefit units with 1.64 million children gain from +Under current law, 459,000 benefit units with 1.64 million children gain from abolition in 2025-26. DWP's April 2025 statistics count 453,600 households not receiving the child element for at least one child, with 1.61 million children. +Each children-lifted figure comes from between 59 and 196 household records, +out of 21,086 households with children in the release, and no household moves +into absolute low income in any comparison. The ten records that contribute +most make up between 29% and 69% of each figure, and one record contributes up +to 57,000 children, so two figures can differ by that much because of one +household. + ## Why the results differ from the IFS's -- **Roll-out.** Running current law in 2025-26 gives about a third of the IFS - headcount, because most children in large families are still protected. - Full roll-out is the largest single setting. -- **Take-up.** With full roll-out and full take-up, the cost (£3.58bn) and the - number of families gaining (778,000 benefit units, against the IFS's "over - 800,000 households") match the IFS closely. -- **The remaining gap.** Children lifted stay about a quarter to 30% short - of the IFS figures. These checks do not isolate the cause. Plausible - contributors, none of them ruled out: - - *Family size in the data.* At FYE 2025 the Microcosm release has about 10% - fewer children in families with three or more children than HBAI (4.20 - million against 4.64 million, HBAI table 4.5db), and about 21% fewer of - those children in relative low income after housing costs (1.64 million +- **Roll-out.** Under current law, abolition costs £1.91bn and lifts 229,000 + children on the IFS's line (FYE 2011, after housing costs), just over a + third of its 630,000. Full roll-out raises the cost to £3.07bn and the + benefit units gaining from 459,000 to 639,000. For abolition it raises + children lifted on the FYE 2011 line after housing costs from 229,000 to + 287,000, less than on the FYE 2025 line (209,000 to 392,000). For the + three-child limit it lowers them on the FYE 2011 line (194,000 to 186,000). + Full roll-out also removes the higher first-child element, which neither + reform restores, so a family that a reform lifts out of low income under + current law may stay in it at full roll-out. On that line the largest single + record contributes 57,000 children to each current-law figure, but at most + 17,000 to a full roll-out one. +- **Take-up.** With full roll-out and full take-up, the cost (£3.56bn to + abolish, £2.52bn for a three-child limit) is close to the IFS's (about + £3.6bn and £2.6bn), and 767,000 benefit units gain from abolition, against + the IFS's "over 800,000 households". +- **The remaining gap.** On the IFS's line, children lifted are about 42% short + of the IFS figures: 366,000 against 630,000 for abolition, and 240,000 + against 420,000 for a three-child limit. On the higher FYE 2025 line they are + about 30% short (450,000 and 294,000). These checks do not isolate the cause. + Plausible contributors, none of them ruled out: + - *Family size in the data.* At FYE 2025 the Microcosm release has about 13% + fewer children in families with three or more children than HBAI (4.04 + million against 4.64 million, HBAI table 4.5db), and about 20% fewer of + those children in relative low income after housing costs (1.66 million against 2.07 million). See [PolicyEngine/microcosm#1371](https://github.com/PolicyEngine/microcosm/issues/1371). A shortfall in relative low income does not show how many children cross an absolute line after the reform, so this alone cannot size the gap. - - *The poverty line.* The snippet approximates the FYE 2011-based line (see - above), so it is not exactly the IFS line. - - *Exceptions.* The snippet does not apply the statutory exceptions. + - *The poverty line.* The model uprates the FYE 2011 line beyond FYE 2025 by + headline OBR CPI (see above), which may not match the IFS's uprating. - *Take-up.* Full take-up here sets `would_claim_uc` to true for everyone, which is not the IFS adjustment to reported take-up ([IFS, 2024][ifs-2024], Appendix 6B), and this page has not matched that adjustment. - - Attributing the gap to any one of these would need a controlled comparison. + - *Sample size.* The two full take-up figures on the IFS's line come from 185 + and 137 household records, and the ten that contribute most make up 29% and + 38% of them. + - *Exceptions, for the three-child limit.* No child in the release has an + exception, and this can move the three-child figures either way. A family + with three children whose third child has one would already get that + child's element, so the run overstates its gain. A family with four + children whose fourth child has one would have one more child element + before and after the reform than the run gives it, so the run can count it + as lifted out of low income when it would not be, or the reverse. + + For abolition the missing exceptions do not explain the gap: if anything they + raise the abolition figures here. Attributing the gap to any one of these + contributors would need a controlled comparison. - **Data year and method.** The IFS used TAXBEN on FRS 2022-23 and 2023-24, additionally reweighting 2022-23 by number of children, and FRS data as published before HBAI's March 2026 administrative-data linking. PolicyEngine @@ -187,6 +270,7 @@ receiving the child element for at least one child, with 1.61 million children. - DWP, [Universal Credit claimants: statistics on the two-child limit policy, April 2025][dwp-2cl]. - DWP, [Households Below Average Income FYE 2025, background information and methodology][hbai-meth], section 2.3 (absolute reference year). - [Universal Credit Regulations 2013, regulation 24A][reg24a] and [Schedule 12][sch12]. +- [Child Tax Credit Regulations 2002, regulations 9 to 14][ctc-reg9]. [ifs-2025]: https://ifs.org.uk/articles/options-reforming-two-child-limit [ifs-2024]: https://ifs.org.uk/publications/child-poverty-trends-and-policy-options @@ -194,3 +278,5 @@ receiving the child element for at least one child, with 1.61 million children. [hbai-meth]: https://www.gov.uk/government/statistics/households-below-average-income-for-financial-years-ending-1995-to-2025/households-below-average-income-background-information-and-methodology-report-fye-2025#update-to-the-absolute-low-income-reference-year [reg24a]: https://www.legislation.gov.uk/uksi/2013/376/regulation/24A/2025-04-06 [sch12]: https://www.legislation.gov.uk/uksi/2013/376/schedule/12/2025-04-06 +[ctc-reg9]: https://www.legislation.gov.uk/uksi/2002/2007/regulation/9/2025-04-06 +[microcosm-defaults]: https://github.com/PolicyEngine/microcosm/blob/daaf543023b8d3d327798c94a4028bd917a7bd73/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py#L232-L243