Skip to content

UK: extended-hours usage draw (mean ~15 of 30) leaves free early-years spending at £5.8bn vs DfE £9.9bn #1126

Closed

Description

@vahid-ahmadi

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-private microcosm_uk_2024_25.h5, revision f9d1922cddab6b54a0dd37794a9bac74e3780c88 (release microcosm-uk-2024-25-national-20261002T230158Z-5c6b3f68), sha256 aa31bdf67c977927ea2b325567d1cf7a79d94381239bc79918a0a0fc9c9588af
  • 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))  # ~15

Proposed 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

  1. juaristi22 commented on Oct 16, 2026

    @juaristi22
    Collaborator

    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 in experiments/1095-uk-data-ports-5-receipts.md. uk-data#546's registered-hours anchor stays tracked in #1095.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions