Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/2708.fixed.md
Original file line number Diff line number Diff line change
@@ -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.
230 changes: 158 additions & 72 deletions docs/book/validation/two-child-limit-full-rollout.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,44 +26,73 @@ 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
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"
Expand All @@ -76,105 +105,159 @@ 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",
],
}


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
`Reform.from_dict` routes read the same way.

## 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
Expand All @@ -187,10 +270,13 @@ 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
[dwp-2cl]: https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025
[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
Loading