diff --git a/changelog.d/mortgage-consumer-debt-imputation.added.md b/changelog.d/mortgage-consumer-debt-imputation.added.md new file mode 100644 index 00000000..10e5dadd --- /dev/null +++ b/changelog.d/mortgage-consumer-debt-imputation.added.md @@ -0,0 +1 @@ +Impute household `mortgage_debt` (gross outstanding mortgage debt, WAS `HMortGR8`) and `consumer_debt` (non-mortgage, non-student-loan borrowing) from the Wealth and Assets Survey, enabling a net wealth measure that can be negative for households whose debts exceed their assets. diff --git a/policyengine_uk_data/datasets/imputations/wealth.py b/policyengine_uk_data/datasets/imputations/wealth.py index 36c5fd4d..ca68e78d 100644 --- a/policyengine_uk_data/datasets/imputations/wealth.py +++ b/policyengine_uk_data/datasets/imputations/wealth.py @@ -57,8 +57,17 @@ "savings", "num_vehicles", "student_loan_balance", + # Liabilities, so a net wealth measure can go negative for households whose + # debts exceed their assets. mortgage_debt is gross outstanding household + # mortgage debt (WAS HMortGR8); consumer_debt is non-mortgage, + # non-student-loan borrowing (personal loans, credit, hire purchase). + "mortgage_debt", + "consumer_debt", ] +# Imputed liabilities, clipped at zero on write (a debt cannot be negative). +DEBT_COLUMNS = {"mortgage_debt", "consumer_debt"} + WAS_RENAMES = { "R8xshhwgt": "household_weight", # Components for estimating land holdings. @@ -88,7 +97,9 @@ # Other columns for reference. "DVLOSValR8_sum": "non_uk_land", "HFINWNTR8_Sum": "net_financial_wealth", + "HFINWNTR8_exSLC_Sum": "net_financial_wealth_exsl", # net of all debt but SLC "DVLUKDebtR8_sum": "uk_land_debt", + "HMortGR8": "mortgage_debt", # gross outstanding household mortgage debt "HFINWR8_SUM": "gross_financial_wealth", "TotalWlthR8": "wealth", "DVhvalueR8": "main_residence_value", @@ -153,6 +164,14 @@ def generate_was_table(was: pd.DataFrame): ] ].sum(axis=1) was["student_loan_balance"] = was["total_loans"] - was["total_loans_exc_slc"] + # All non-mortgage, non-student-loan financial liabilities: personal and + # informal loans, credit and store cards, overdrafts, hire purchase, and + # arrears. WAS does not itemise these on the household file, but they are the + # gap between gross financial wealth and financial wealth netted of every + # liability except student loans. Captures far more than formal loans alone. + was["consumer_debt"] = ( + was["gross_financial_wealth"] - was["net_financial_wealth_exsl"] + ).clip(lower=0) was["region"] = was["region"].map(REGIONS) return was @@ -347,7 +366,10 @@ def impute_wealth(dataset: UKSingleYearDataset) -> UKSingleYearDataset: person=dataset.person, ) continue - dataset.household[column] = output_df[column].values + values = output_df[column] + if column in DEBT_COLUMNS: + values = values.clip(lower=0) # a liability cannot be negative + dataset.household[column] = values.values dataset.validate()