Repository navigation
UK: extended-hours usage draw (mean ~15 of 30) leaves free early-years spending at £5.8bn vs DfE £9.9bn #1126
Description
Summary
On the certified UK national release, policyengine-uk's spending on the three free early-years entitlements (universal 15 hours, working-parent extended hours, targeted 2-year-old offer) in 2026-27 is £5.81bn. DfE's illustrative 2026-27 total is £9.90bn, a ratio of 0.59.
Most of the £4.09bn gap comes from one Microcosm input: the benefit-unit draw maximum_extended_childcare_hours_usage ~ clip(N(15.019, 4.972), 0, 30) in take_up_contract.json. Its mean is about 15 of the 30 weekly hours. Because the draw caps a family's total weekly extended hours, a 3- or 4-year-old on the working-parent entitlement gets on average about 15 hours, the same as the universal offer. DfE funds about 28.5.
#834 froze this draw "because it is underidentified without an independent extended-spending observation; replacing it needs evidence on hours actually used". DfE's funding-formula technical note provides that evidence: it states the additional (working-parent) hours actually funded for 3- and 4-year-olds, from the January 2025 census, in part-time equivalents.
Data and versions
- Dataset:
policyengine/populace-uk-privatemicrocosm_uk_2024_25.h5, revisionf9d1922cddab6b54a0dd37794a9bac74e3780c88(releasemicrocosm-uk-2024-25-national-20261002T230158Z-5c6b3f68), sha256aa31bdf67c977927ea2b325567d1cf7a79d94381239bc79918a0a0fc9c9588af - policyengine 6.2.1, policyengine-uk 2.102.3, fiscal year 2026-27
- Official figure: DfE, 2026 to 2027 early years national funding formulae: technical note, illustrative totals: 3-4s £4.2bn + 2-year-olds £2.7bn + under-2s £3.0bn = £9.9bn. Each total is rate × PTEs × 15 × 38, so one PTE is 15 hours a week for 38 weeks.
Decomposition (2026-27, £bn)
By age, model against DfE
| Age | Model | DfE | Gap | Model PTEs | DfE PTEs |
|---|---|---|---|---|---|
| Under 2 (model: age 1 only) | 1.44 | 3.0 | 1.56 | ~212k | 441.6k (forecast) |
| 2 | 1.50 | 2.7 | 1.20 | ~300k (202k extended + 98k targeted) | 533.8k (part forecast) |
| 3-4 | 2.87 | 4.2 | 1.33 | ~808k | 1,101.5k (759.5k universal + 342.0k additional) |
| Total | 5.81 | 9.9 | 4.09 |
At ages 3-4, the model's universal-hours volume is about right: about 806k children receive at least the universal hours, against DfE's 759.5k universal PTEs. The surplus is roughly the 4-year-olds in reception that the model still funds. The model has almost none of DfE's 342.0k additional-hours PTEs, because a mean draw of about 15 total hours leaves nothing above the universal 15. At the 2026-27 rate, 342k PTEs × 15 × 38 × £6.61 ≈ £1.29bn, which is essentially the whole 3-4 gap.
One factor at a time, each from the central run (the factors overlap, so they do not add up)
| Factor | Owner | Effect on 2026-27 spending |
|---|---|---|
| Hours-usage draw set to the full 30 hours | Microcosm (take_up_contract.json) |
+£3.90bn (→ £9.71bn) |
| Universal hours switched off for extended-eligible families: 3-4s floored at their universal 15 hours | policyengine-uk, already policyengine-uk#1930 | +£0.11bn (87k children) |
| Same, if the draw applied only to the hours above the universal 15 | policyengine-uk#1930 | +£0.54bn |
| Model hourly rates (2024-25 uprated by CPI: £11.89 / £8.78 / £6.23) set to DfE's 2026-27 averages (£12.04 / £8.90 / £6.61) | policyengine-uk parameters | +£0.21bn |
| Under-1s: whole-year ages, so 9-11-month-olds never qualify (DfE: 29,200 registered in January 2025, 30,700 in January 2026) | policyengine-uk (age) | about +£0.45bn if a quarter of age-0 children in eligible families qualify (rough) |
| 4-year-olds in reception still funded | policyengine-uk (compulsory school age) | negative, a few hundred £m |
Once the draw is full usage, the universal floor has no further effect. The rates, under-1s and reception effects partly cancel. The draw is the main driver.
The evidence #834 asked for
- DfE's January 2025 census: 341,988.09 additional-hours PTEs for 3- and 4-year-olds (technical note).
- DfE's January 2025 count: 379,000 3- and 4-year-olds registered for the working-parent entitlement (Education provision: children under 5, 2025).
- That gives 0.902 additional PTEs per child, or 13.5 hours a week above the universal 15. Mean total weekly hours for a working-parent 3- or 4-year-old are therefore ≈ 28.5 hours.
This is an observed figure, not a forecast. The under-2 and 2-year-old PTEs in the note are partly forecast (the 30-hour offer for those ages began in September 2025), so only the 3-4 figure is used as the anchor.
Holding sd = 4.972 and the [0, 30] clip, a clipped mean of 28.535 needs mean = 31.141. 59% of draws then sit at 30, and almost none fall below 15.
Check without a rebuild. I took the release's own draws, inverted them through N(15.019, 4.972) to recover the identity-keyed uniforms, mapped those through N(31.141, 4.972), clipped to [0, 30], and set the result as input. Results for 2026-27:
| Model now | Re-mapped draw | DfE | |
|---|---|---|---|
| Total | 5.81 | 9.30 | 9.9 |
| Under 2 | 1.44 | 2.58 | 3.0 |
| 2 | 1.50 | 2.58 | 2.7 |
| 3-4 | 2.87 | 4.14 | 4.2 |
| 3-4 additional-hours PTEs | ~0 | 359k | 342.0k |
The remaining £0.6bn gap is about the size of the rates gap (+£0.21bn) plus the under-1s, both on the policyengine-uk side.
Why not a spending calibration target
The draw is per benefit unit and does not depend on the weights. A funded-hours spending target would make the calibrator reweight households to make up for too few hours per child, which would distort the caseloads that #834 already matches (621,500 working-parent children and others). The fix belongs in the draw's parameters.
Reproduction
# HF_HUB_OFFLINE=1, policyengine 6.2.1 / policyengine-uk 2.102.3
import numpy as np
from huggingface_hub import hf_hub_download
from policyengine.tax_benefit_models.uk import managed_microsimulation
path = hf_hub_download("policyengine/populace-uk-private", "microcosm_uk_2024_25.h5",
revision="f9d1922cddab6b54a0dd37794a9bac74e3780c88",
repo_type="dataset", local_files_only=True)
sim = managed_microsimulation(dataset=str(path), allow_unmanaged=True)
y = 2026
w_bu = sim.calculate("benunit_weight", y).values
w_p = sim.calculate("person_weight", y).values
total = ((sim.calculate("extended_childcare_entitlement", y).values * w_bu).sum()
+ (sim.calculate("universal_childcare_entitlement", y).values * w_p).sum()
+ (sim.calculate("targeted_childcare_entitlement", y).values * w_p).sum())
print(total / 1e9) # 5.81
u = sim.calculate("maximum_extended_childcare_hours_usage", y)
print(np.average(u.values, weights=w_bu)) # ~15Proposed fix
Make the draw a sourced contract entry: mean 31.141, sd 4.972, clip [0, 30], status sourced_administrative_derived, with the derivation and both DfE sources recorded. The sd is kept because no source identifies it. Two follow-ups:
- The extended take-up rate is fitted jointly with the hours through the engine's mutual exclusions, so the fitter (
tools/fit_uk_childcare_takeup.py) should be re-run once the draw changes. - The policyengine-uk factors (universal switch-off, #1930; rates; under-1s; reception-age 4-year-olds) stay with policyengine-uk.
Activity
juaristi22 commentedon Oct 16, 2026
Fixed by #1299 (merged 16 October). It carries Vahid's #1127 commit with his authorship (
88e355305): the extended-hours usage draw becomes Normal(31.141, 4.972), clipped to 0–30, from DfE's January 2025 additional-hours PTEs. #1299 also allocates targeted and universal hours from working-parent hours in the take-up fitter (pe-uk#2177) and refits the four childcare take-up rates on policyengine-uk 2.132.6; the receipts are inexperiments/1095-uk-data-ports-5-receipts.md. uk-data#546's registered-hours anchor stays tracked in #1095.