Repository navigation
SPI income imputation gives every child in a synthetic household employment income (£67bn on under-16s) #504
Description
Every child in an SPI-synthetic household has imputed employment income. In the Enhanced FRS 2024-25 that puts £67bn of employment income (5.9% of the total) on people aged under 16.
Found while fixing PolicyEngine/policyengine-uk#1976 (Universal Credit counted dependants' income, so these earnings were cutting the parents' UC).
Evidence
Enhanced FRS 2024-25 file with sha256 e433e532… (person and household tables read directly; weights are household_weight). Aggregates only.
| Under-16 person records | Records | With employment_income > 0 |
Weighted children | Employment income |
|---|---|---|---|---|
FRS-origin households (household_is_spi_synthetic false) |
12,895 | 0 | 9.45m | £0 |
SPI-synthetic households (household_is_spi_synthetic true) |
7,856 | 7,856 (100%) | 3.63m | £67.2bn |
The same split holds at every age below 16 (ages 0-4, 5-10 and 11-15 are each 100% in synthetic households and 0% in FRS-origin ones). At 16-17 it is 96% against 4%. In the capital-gains clones the pattern is the same, because they copy the rows.
Among these children: none has hours_worked, all have employment_status CHILD, and 69% also have savings interest. Their positive employment income has weighted quartiles of about £7,000, £18,500 and £27,000, against £9,900, £20,600 and £28,700 for people aged 16 to 24.
Synthetic households carry 27% of household weight (8.4m of 31.1m), so this is not a tail.
Mechanism (read on main at b45c373)
policyengine_uk_data/datasets/imputations/income.py:
impute_incomecopies the whole FRS, sets the copy's weight to 0, flags ithousehold_is_spi_syntheticand subsamples it to 10,000 households (lines 261-265). Children stay in the copy.- It then calls
impute_over_incomes(zero_weight_copy, model, IMPUTATIONS)(lines 271-275). That function takesage,genderandregionfor every person in the dataset, runsmodel.predict, and overwrites each income component with the prediction (lines 218-222). There is no age condition. - The model is trained on the SPI. SPI ages are drawn within
AGE_RANGES, whose lowest bound is 16 (datasets/spi.pylines 15-24), so no training row is under 16. A child is scored from age, gender and region alone, so gets the earnings of a young taxpayer. - Nothing later removes them: the second-stage
impute_frs_only_variablesusesemployment_incomeas a predictor, the capital-gains step copies the rows, and calibration gives the synthetic households weight.
The components overwritten are employment, self-employment, savings interest, dividends, private pension and property income, plus Gift Aid and charitable investment gifts. Employment income is the large one for children. The dividend-only pass on FRS-origin rows (lines 295-299) also predicts for every person, children included (3.7% of under-16s in both halves have dividends).
What it does to results
Real policyengine-uk microsimulations for 2026 (policyengine-uk at baff2d793), on the file as built and on a copy with under-16 employment_income set to zero and nothing else changed:
| 2026 | As built | Under-16 earnings zeroed | Change |
|---|---|---|---|
| Employment income of under-16s | £74.0bn (3.67m children, 2.37m households) | £0 | |
| Household net income | £1,764.7bn | £1,701.6bn | −£63.1bn |
| Household tax | £525.9bn | £519.2bn | −£6.7bn (income tax charged on children) |
| Universal Credit | £78.7bn | £82.9bn | +£4.2bn |
| Child poverty, AHC (aged under 18) | 24.0% | 29.3% | +5.3 points |
| Poverty, AHC (all) | 18.8% | 21.0% | +2.3 points |
| Child poverty, BHC | 16.1% | 19.4% | +3.3 points |
This is a sensitivity, not a rebuilt dataset: the weights were calibrated with the children's earnings in place, so a rebuild would move them. It may bear on #487 (median income above HBAI) and #452 (UC caseload below administrative counts).
The UC line is the part policyengine-uk#1976 fixes on the model side: once UC counts only claimants' income, UC is £83.7bn with or without the children's earnings (identical for every benefit unit, 2025 to 2030).
Proposed fix
- In
impute_over_incomes, predict only for people the SPI can describe (aged 16 or over) and leave younger people's incomes at their FRS values. Apply the same condition to the dividend-only pass. - Consider the same check for 16- and 17-year-olds in full-time non-advanced education, who are dependent children in the FRS and 96% of whom get earnings in the synthetic half (4% in the FRS half).
- Add a build test: after
impute_income, no one under 16 has employment, self-employment, pension or property income above their FRS value. - Recalibrate, since the employment income total and the SPI targets were met with these amounts included.
How to verify
- The table above reproduces from the
personandhouseholdtables by grouping under-16 records onhousehold_is_spi_synthetic. - After the fix, weighted under-16 employment income is about zero and income tax paid by under-16s is about zero.
- Compare child poverty and median income with HBAI before and after.
Activity
MaxGhenis commentedon Oct 4, 2026
A second route by which synthetic children get income, found while re-running the impact of PolicyEngine/policyengine-uk#1978 after #1973 merged.
The second-stage QRF (
policyengine_uk_data/datasets/imputations/frs_only.py,FRS_ONLY_PERSON_VARIABLES) replaces the benefit_reportedcolumns on SPI-donor rows for every person. Its predictors are age, gender, region and the six first-stage income components, which children in synthetic households already carry. So some synthetic children are given benefit receipts too.Under-16 person records with a positive reported amount, in the same Enhanced FRS 2024-25 file (sha256
e433e532…):esa_contrib_reporteduniversal_credit_reportedcouncil_tax_benefit_reportedchild_benefit_reportedchild_tax_credit_reportedA child cannot get contributory ESA. In a 2026 microsimulation on main (
8090f1c19), dependants carry £0.36bn ofesa_contrib(123 records, 89 of them under 16), and before #1978 that counted as their parents' Universal Credit unearned income.The fix suggested above covers this too if the second stage, like the first, leaves people under 16 at their FRS values, or if the synthetic copy's children have their incomes and benefits reset before the second stage runs.