From 0493768d2fe59e44f146053587ad4e593a757c42 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 6 May 2026 12:13:51 +0100 Subject: [PATCH] Test equivalisation factors and read scale from parameters (#307) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds YAML coverage for `household_equivalisation_bhc` and `household_equivalisation_ahc` against the HBAI modified-OECD scale (single adult, couple, couple with young/older children, lone parent). Both formulas were hard-coding the scale weights even though matching parameters already exist under `household.demographic.equiv.{bhc,ahc}`. Wired the formulas to read those parameters — values are unchanged, so the existing 1006 policy tests still pass. Co-Authored-By: Claude Opus 4.7 (1M context) --- changelog.d/307.md | 1 + .../household/demographic/equivalisation.yaml | 121 ++++++++++++++++++ .../household_equivalisation_ahc.py | 10 +- .../household_equivalisation_bhc.py | 10 +- 4 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 changelog.d/307.md create mode 100644 policyengine_uk/tests/policy/baseline/household/demographic/equivalisation.yaml diff --git a/changelog.d/307.md b/changelog.d/307.md new file mode 100644 index 000000000..b76aa6564 --- /dev/null +++ b/changelog.d/307.md @@ -0,0 +1 @@ +- Add YAML tests for `household_equivalisation_bhc` and `household_equivalisation_ahc` covering the HBAI modified-OECD scale examples (single adult through couple-with-children), and refactor both formulas to read the scale weights from the existing `household.demographic.equiv.{bhc,ahc}` parameters instead of hard-coded constants. diff --git a/policyengine_uk/tests/policy/baseline/household/demographic/equivalisation.yaml b/policyengine_uk/tests/policy/baseline/household/demographic/equivalisation.yaml new file mode 100644 index 000000000..57f2d881c --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/household/demographic/equivalisation.yaml @@ -0,0 +1,121 @@ +- name: Equivalisation factor — single adult (HBAI modified OECD scale, BHC) + period: 2025 + absolute_error_margin: 0.001 + input: + people: + adult: + age: 40 + benunits: + benunit: + members: [adult] + households: + household: + members: [adult] + output: + household_equivalisation_bhc: 0.67 + household_equivalisation_ahc: 0.58 + +- name: Equivalisation factor — couple, no children + period: 2025 + absolute_error_margin: 0.001 + input: + people: + adult1: + age: 40 + adult2: + age: 40 + benunits: + benunit: + members: [adult1, adult2] + households: + household: + members: [adult1, adult2] + output: + household_equivalisation_bhc: 1.00 + household_equivalisation_ahc: 1.00 + +- name: Equivalisation factor — couple with one young child (under 14) + period: 2025 + absolute_error_margin: 0.001 + input: + people: + adult1: + age: 40 + adult2: + age: 40 + child: + age: 5 + benunits: + benunit: + members: [adult1, adult2, child] + households: + household: + members: [adult1, adult2, child] + output: + household_equivalisation_bhc: 1.20 + household_equivalisation_ahc: 1.20 + +- name: Equivalisation factor — couple with one older child (14+) + period: 2025 + absolute_error_margin: 0.001 + input: + people: + adult1: + age: 40 + adult2: + age: 40 + child: + age: 15 + benunits: + benunit: + members: [adult1, adult2, child] + households: + household: + members: [adult1, adult2, child] + output: + household_equivalisation_bhc: 1.33 + household_equivalisation_ahc: 1.42 + +- name: Equivalisation factor — couple with one young and one older child + period: 2025 + absolute_error_margin: 0.001 + input: + people: + adult1: + age: 40 + adult2: + age: 40 + young_child: + age: 8 + older_child: + age: 16 + benunits: + benunit: + members: [adult1, adult2, young_child, older_child] + households: + household: + members: [adult1, adult2, young_child, older_child] + output: + household_equivalisation_bhc: 1.53 + household_equivalisation_ahc: 1.62 + +- name: Equivalisation factor — lone parent with two young children + period: 2025 + absolute_error_margin: 0.001 + input: + people: + adult: + age: 35 + child1: + age: 6 + child2: + age: 9 + benunits: + benunit: + members: [adult, child1, child2] + households: + household: + members: [adult, child1, child2] + output: + household_equivalisation_bhc: 1.07 + household_equivalisation_ahc: 0.98 diff --git a/policyengine_uk/variables/household/demographic/household_equivalisation_ahc.py b/policyengine_uk/variables/household/demographic/household_equivalisation_ahc.py index 4fbfb5991..6be6286ef 100644 --- a/policyengine_uk/variables/household/demographic/household_equivalisation_ahc.py +++ b/policyengine_uk/variables/household/demographic/household_equivalisation_ahc.py @@ -1,5 +1,4 @@ from policyengine_uk.model_api import * -from policyengine_uk.variables.household.demographic.geography import Region class household_equivalisation_ahc(Variable): @@ -9,6 +8,7 @@ class household_equivalisation_ahc(Variable): definition_period = YEAR def formula(household, period, parameters): + scale = parameters(period).household.demographic.equiv.ahc count_other_adults = max_( household.sum(household.members("is_adult", period)) - 1, 0 ) @@ -19,8 +19,8 @@ def formula(household, period, parameters): household.members("is_older_child", period) ) return ( - 0.58 - + 0.42 * count_other_adults - + 0.42 * count_older_children - + 0.2 * count_young_children + scale.first_adult + + scale.second_adult * count_other_adults + + scale.child_over_14 * count_older_children + + scale.child_under_14 * count_young_children ) diff --git a/policyengine_uk/variables/household/demographic/household_equivalisation_bhc.py b/policyengine_uk/variables/household/demographic/household_equivalisation_bhc.py index 48a1bbf51..a133022af 100644 --- a/policyengine_uk/variables/household/demographic/household_equivalisation_bhc.py +++ b/policyengine_uk/variables/household/demographic/household_equivalisation_bhc.py @@ -1,5 +1,4 @@ from policyengine_uk.model_api import * -from policyengine_uk.variables.household.demographic.geography import Region class household_equivalisation_bhc(Variable): @@ -9,6 +8,7 @@ class household_equivalisation_bhc(Variable): definition_period = YEAR def formula(household, period, parameters): + scale = parameters(period).household.demographic.equiv.bhc count_other_adults = max_( household.sum(household.members("is_adult", period)) - 1, 0 ) @@ -19,8 +19,8 @@ def formula(household, period, parameters): household.members("is_older_child", period) ) return ( - 0.67 - + 0.33 * count_other_adults - + 0.33 * count_older_children - + 0.2 * count_young_children + scale.first_adult + + scale.second_adult * count_other_adults + + scale.child_over_14 * count_older_children + + scale.child_under_14 * count_young_children )