Summary
Add ons/household_land_value/{la_code} calibration targets for all 360 UK local authorities, generalising the regional method introduced in #315.
Motivation
targets/sources/mhclg_regional_land.py distributes the ONS National Balance Sheet household land total across the 11 GB regions using dwellings × avg_house_price. There is no equivalent at local-authority level, so:
- The LA reweighting loss (
datasets/local_areas/local_authorities/loss.py) currently has no property- or land-value anchor — its targets cover age, income, UC, tenure and rent only. As a result, per-LA avg household land values from LA-reweighted microdata are compressed at the top end and noisy at the bottom (e.g. Kensington and Chelsea averaging ~£240k, East Renfrewshire below £50k, neither of which matches the UK HPI ordering).
- Downstream analyses that want an LA map of household land value — e.g. a UK LVT blog post using this dataset, or constituency-level reform impacts — currently have to bolt on ad-hoc methods.
Proposed approach
Direct generalisation of the regional formula:
share_la = (households_la × avg_house_price_la) / Σ_LAs
target_la = share_la × HOUSEHOLD_LAND_VALUES[year]
Data sources (all already used elsewhere in the repo):
- HM Land Registry UK HPI — average house price by LA, monthly. Same source used for
regional_land_values.csv, just at LA granularity.
- LA household counts — derived from the existing
storage/local_authority_weights.h5 matrix (sum of each LA's weight row), which keeps household-count semantics consistent with the rest of the LA calibration.
- National anchor —
HOUSEHOLD_LAND_VALUES in targets/sources/_land.py (ONS National Balance Sheet 2025).
The new targets/sources/la_land.py module exports 360 Target objects with geographic_level=GeographicLevel.LOCAL_AUTHORITY, following the mhclg_regional_land.py layout.
Acceptance criteria
Out of scope for this issue
Wiring these targets into datasets/local_areas/local_authorities/loss.py so the LA reweighting actually calibrates against them. That should be a follow-up PR once this one lands.
References
Summary
Add
ons/household_land_value/{la_code}calibration targets for all 360 UK local authorities, generalising the regional method introduced in #315.Motivation
targets/sources/mhclg_regional_land.pydistributes the ONS National Balance Sheet household land total across the 11 GB regions usingdwellings × avg_house_price. There is no equivalent at local-authority level, so:datasets/local_areas/local_authorities/loss.py) currently has no property- or land-value anchor — its targets cover age, income, UC, tenure and rent only. As a result, per-LA avg household land values from LA-reweighted microdata are compressed at the top end and noisy at the bottom (e.g. Kensington and Chelsea averaging ~£240k, East Renfrewshire below £50k, neither of which matches the UK HPI ordering).Proposed approach
Direct generalisation of the regional formula:
Data sources (all already used elsewhere in the repo):
regional_land_values.csv, just at LA granularity.storage/local_authority_weights.h5matrix (sum of each LA's weight row), which keeps household-count semantics consistent with the rest of the LA calibration.HOUSEHOLD_LAND_VALUESintargets/sources/_land.py(ONS National Balance Sheet 2025).The new
targets/sources/la_land.pymodule exports 360Targetobjects withgeographic_level=GeographicLevel.LOCAL_AUTHORITY, following themhclg_regional_land.pylayout.Acceptance criteria
ons/household_land_value/{code}registered viaget_all_targets().HOUSEHOLD_LAND_VALUES[year]for each year in the series (within 1e-6).local_authorities_2021.csv.test_regional_land_value_targets.pystays green (filter byGeographicLevel.REGIONwhere it previously filtered by name prefix only).Out of scope for this issue
Wiring these targets into
datasets/local_areas/local_authorities/loss.pyso the LA reweighting actually calibrates against them. That should be a follow-up PR once this one lands.References