Repository navigation
Add an intensive-margin hours response for parents in work - #9
Merged
Merged
Conversation
…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.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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_earningshas to callreset_calculations()beforeset_input:employment_incomeis 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_bnkeeps its meaning (participation only);hours_offset_bnandtotal_offset_bnare added beside it.66 tests pass. Run time is up by about 16 simulations a year for the reruns and UC counterfactuals.