Skip to content

SPI income imputation gives every child in a synthetic household employment income (£67bn on under-16s) #504

Description

@MaxGhenis

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_income copies the whole FRS, sets the copy's weight to 0, flags it household_is_spi_synthetic and 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 takes age, gender and region for every person in the dataset, runs model.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.py lines 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_variables uses employment_income as 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

  1. The table above reproduces from the person and household tables by grouping under-16 records on household_is_spi_synthetic.
  2. After the fix, weighted under-16 employment income is about zero and income tax paid by under-16s is about zero.
  3. Compare child poverty and median income with HBAI before and after.

Activity

  1. MaxGhenis commented on Oct 4, 2026

    @MaxGhenis
    ContributorAuthor

    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 _reported columns 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…):

    Column SPI-synthetic records FRS-origin records
    esa_contrib_reported 89 0
    universal_credit_reported 89 0
    council_tax_benefit_reported 89 0
    child_benefit_reported 43 0
    child_tax_credit_reported 43 0

    A child cannot get contributory ESA. In a 2026 microsimulation on main (8090f1c19), dependants carry £0.36bn of esa_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.

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