PolicyEngine / PolicyEngine/microcosm
UK CGT top-tail age and geography joints inherit from incidence and look off — benchmark against HMRC marginals
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 0
- Forks
- 4
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 94
Description
Health check of the joints the CGT imputation does not condition on, prompted by Nikhil's question in #microcosm-uk. The stage conditions on taxable income only (rank-preserving within the Table 3 bands; the 76 band facts are fenced from calibration per #552, and nothing else is targeted), so age, region, wealth, and income-composition joints inherit from FRS/WAS incidence plus rank ordering. These are weighted aggregates from the signed 2026-08-17 staging artifact (main 1131576b, seed 42).
Age
| age | taxpayers | £2m+ gainers |
|---|---|---|
| <25 | 4,300 | 0 |
| 25–34 | 37,200 | 160 |
| 35–44 | 66,600 | 1,330 |
| 45–54 | 71,300 | 1,750 |
| 55–64 | 91,900 | 1,280 |
| 65–74 | 46,200 | 30 |
| 75+ | 40,400 | 70 |
| total | 357,900 | 4,630 |
The all-taxpayer profile looks sane (peak 55–64; 24% of taxpayers 65+). The top tail does not: 65+ holds 24% of taxpayers but 2% of £2m+ gainers. Mechanism: retirees report pension-sized taxable income, so the proxy files them in low income columns where Table 3 puts small gains, and rank preservation hands the biggest amounts to working-age high earners. If HMRC's age/sex table in the same statistics collection shows top gains skewing older (I expect it does), this is the first candidate for the #552 fence's promotion path as a reviewed target.
Region (£2m+ group)
| region | people | gains £bn |
|---|---|---|
| London | 700 | 6.50 |
| East of England | 430 | 4.00 |
| South East | 370 | 3.83 |
| South West | 660 | 3.62 |
| Yorkshire | 750 | 3.54 |
| West Midlands | 1,090 | 2.75 |
| North West | 350 | 1.47 |
| Wales | 140 | 1.20 |
| East Midlands | 70 | 0.18 |
| Scotland | 50 | 0.37 |
| Northern Ireland | 30 | 0.15 |
Treat this joint as weakly identified: 4,630 weighted people at household weights up to ~9,300 means the smaller cells hold one or two clone households, and West Midlands out-crowding London on counts reads as incidence noise. HMRC's geography table gives the benchmark; second promotion-path candidate.
Income composition
£2m+ group vs all taxpayers: dividends 24% vs 11%; self-employment 30% vs 10%; property 12% vs 7%. Direction sensible (top gainers more business-linked). Whether 24% dividend-receiving runs high enough for a group that should be heavy with share disposals is untestable internally — the FRS records the year's flows, and a founder in their exit year may report zero dividends.
Suggested work
- Pin HMRC's age/sex and geography CGT tables (same collection as Table 3) as fingerprinted source artifacts and compute the comparison.
- Where the inherited joints fail the benchmark, adjudicate promotion to reviewed targets via the #552 fence's promotion path — in the rebuild ordering of #704 (imputations before calibration), so the weights can carry the correction.
- Reproduction:
~/microcosm-gated-builds/uk-cgt-676/gains_interactions.jsonlocally; the script loads the staged H5 viaload_uk_national_frameand needs only the artifact.
Refs: #552 (fence + promotion path), #704 (calibration sequencing), #710 (the weight fix behind the signed artifact).
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with gains_interactions.json and the load_uk_national_frame entry point, using the staged H5 artifact referenced in the issue. Obtain and fingerprint HMRC's age/sex and geography CGT tables, then compare their marginals with the generated £2m+ groups. Done means documented comparisons and an evidence-based decision on promotion through the #552 path, respecting #704 ordering.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- analytics, data
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100