Skip to content

Add an intensive-margin hours response for parents in work - #9

Merged
vahid-ahmadi merged 10 commits into
mainfrom
intensive-margin
Sep 2, 2026
Merged

vahid-ahmadi merged 10 commits into
mainfrom
intensive-margin

Conversation

@vahid-ahmadi

Copy link
Copy Markdown
Contributor

Closes #6. Supersedes #8, which GitHub closed when #7's branch was deleted; rebased onto main. Also includes the dashboard copy tightening, the corrected free-hours incentive bullets, the two-switch labour supply control, and the new title.

Max asked for an intensive-margin response using a −0.042 childcare price elasticity of hours worked, derived from Brewer et al. (2020). This adds it.

What it does. For each adult in the responsive population (youngest child 1-4, not excluded by the OBR framework) who is in work with a positive out-of-pocket childcare cost, the proportional change in that cost is multiplied by the elasticity to give a change in hours, and earnings move with hours at a constant wage. Out-of-pocket cost is childcare expenses less Tax-Free Childcare (or the subsidy), less the paid care that new free hours displace, less the realised Universal Credit childcare support — the UC award minus the award with the element's coverage rate set to zero, the same counterfactual the baseline benchmark uses, since the element's face value is mostly withdrawn by the taper for working families. The revenue is not an assumed rate: each leg is rerun with the changed earnings and the revenue is the extra earnings less the rise in household net income. The household gain is allocated back to the adults whose hours produced it and laid over the distribution alongside the participation response, so the Household effects view moves with it. Low and high scale both margins by the same multiplier.

Results, 2027-28 central, UK. Parents in scope (1.26m; 1.02m see a price change) face a 58% mean fall in out-of-pocket cost under both legs together, giving +2.4% hours: 30,565 FTEs, £1.67bn of earnings, £0.67bn back to the exchequer, against £0.02bn from the participation margin. Combined dynamic cost £6.64bn → £5.95bn (10.4% offset; 3.2% low, 21.1% high). Free hours alone: 2,073 FTEs, £0.07bn (only displaced paid care moves the price). Subsidy alone: 29,401 FTEs, £0.63bn. UC families sit in scope with a near-zero price change, because the subsidy leg pays them nothing.

Caveats, recorded in sources.py, the README and on the dashboard. I checked the derivation against the paper. The +0.600 is Table A.3 panel B (file page 41) and is measured over all mothers with zeros for non-workers; 14.319 is Table 1's all-mothers mean (file page 17). So −0.042 is a total-hours elasticity that already contains the participation channel — the paper's own +3.5pp employment effect at part-time hours accounts for most of the +0.6 — and adding it to the extensive margin counts that channel twice. The treatment was also 12.5 extra free hours a week (file page 8), not a 100% price fall. The dashboard says both.

Also in this PR. _build_with_earnings has to call reset_calculations() before set_input: employment_income is a derived variable upstream, and the other order silently left earnings unchanged (revenue came out equal to earnings). Three CostTab strings used --x, a JavaScript decrement that mutated the loaded results by £1 and flipped the displayed sign; now -x. The extended-flag comparison from #7 now compares static costs, since that scenario does not carry the hours margin. Methodology tab, assumptions.margin, the module docstring and the CLI description all now describe both margins.

Tests. Eight unit tests on a stub simulation (price change, rerun earnings, revenue, household allocation for one and two earners, country reconciliation, scale, no-change, the 100% bound, and a tapered-UC family whose price is measured on realised support rather than the element) and an artifact gate that the dynamic cost equals static less both margins, each margin's country split reconciles, and revenue sits strictly between zero and earnings. dynamic_cost.labour_supply_offset_bn keeps its meaning (participation only); hours_offset_bn and total_offset_bn are added beside it.

66 tests pass. Run time is up by about 16 simulations a year for the reruns and UC counterfactuals.

…hodology up to date

Addresses María's review of #8: C1 (the UC childcare element's face value is
mostly withdrawn by the taper, so realised support is the award difference
against an abolition counterfactual), A1 (stale extensive-only text in the
methodology tab and machine-readable assumptions), A2 (file-page references
for the Brewer et al. figures) and S1 (a two-earner allocation test).
The Reform tab's labour supply control is now two checkboxes: the extensive
margin, with its low/central/high elasticity when on, and the intensive
margin, at its one setting. Every combination is emitted by the pipeline so
the household view has an exact block for each, and switching the intensive
margin off returns the figures published before it existed.
… and make the two margins switches

Three bullets misdescribed the free-hours leg's work incentive: the 15 hours
cancel for a non-working family, so their gain to work is unchanged; it falls
for working parents on the 30-hour offer, who would keep 15 hours if they
stopped working. The two-year-old targeted offer is now acknowledged.
@vercel

vercel Bot commented Sep 2, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
free-childcare-reform Ready Ready Preview Sep 2, 2026 12:10pm UTC

Request Review

@vahid-ahmadi
vahid-ahmadi merged commit 5150486 into main Sep 2, 2026
4 checks passed
@vahid-ahmadi
vahid-ahmadi deleted the intensive-margin branch September 2, 2026 12:11

This branch was successfully deployed

1 active deployment
Preview — bf88c921 Deployed Sep 2, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add an intensive-margin hours response for parents in work

1 participant