Skip to content

Commit cf2b0cd

Browse files
MaxGhenisclaude
andcommitted
Add salary sacrifice NI relief as calibration target
Target the actual NI relief from salary sacrifice (£4.1bn from SPP/HMRC data) rather than gross contributions. This uses a counterfactual simulation approach: calculate what NI would be paid if salary sacrifice were converted to employment income, then take the difference. Current FRS data shows £0.63bn relief vs £4.1bn target, so calibration will scale up weights approximately 6.5x to match the external benchmark. Changes: - tax_benefit.csv: Add salary_sacrifice_ni_relief target (£4.1bn for 2023) - loss.py: Calculate NI relief via counterfactual simulation Closes #215 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent dcf8ee7 commit cf2b0cd

4 files changed

Lines changed: 633 additions & 488 deletions

File tree

changelog_entry.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- bump: minor
2+
changes:
3+
added:
4+
- Add salary sacrifice NI relief as calibration target (£4.1bn from SPP/HMRC data)

policyengine_uk_data/storage/tax_benefit.csv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ universal_credit_jobseekers,gbp-bn,obr_march_2024_efo,2.0,3.0,16.6,13.0,9.8,11.1
4141
universal_credit_non_jobseekers,gbp-bn,obr_march_2024_efo,6.2,15.3,21.7,27.6,32.1,41.0,52.2,60.6,67.1,68.6,70.9,73.4
4242
vat,gbp-bn,obr_march_2024_efo,,,,,159.7,168.9,170.3,178.8,186.6,193.9,201.7,209.8
4343
winter_fuel_allowance,gbp-bn,obr_march_2024_efo,2.0,2.0,2.0,2.0,2.0,2.0,0.3,0.3,0.3,0.3,0.3,0.3
44-
private_school_students,person-k,obr_march_2024_efo,557,557,557,557,557,557,557,557,557,557,557,
44+
private_school_students,person-k,obr_march_2024_efo,557,557,557,557,557,557,557,557,557,557,557,
45+
salary_sacrifice_ni_relief,gbp-bn,spp_ni_relief_2023,,,,,,,4.1,4.2,4.3,4.5,4.6,4.7

policyengine_uk_data/utils/loss.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,37 @@ def pe_count(*variables):
158158
# Not strictly from the OBR but from the 2024 Independent Schools Council census. OBR will be using that.
159159
df["obr/private_school_students"] = pe("attends_private_school")
160160

161+
# Salary sacrifice NI relief - SPP estimates £4.1bn total (£1.2bn employee + £2.9bn employer)
162+
# Calculate relief via counterfactual: what additional NI would be paid if SS became income
163+
ss_contributions = sim.calculate("pension_contributions_via_salary_sacrifice")
164+
employment_income = sim.calculate("employment_income")
165+
166+
# Run counterfactual simulation with SS converted to employment income
167+
counterfactual_sim = Microsimulation(dataset=dataset, reform=reform)
168+
counterfactual_sim.set_input(
169+
"pension_contributions_via_salary_sacrifice",
170+
time_period,
171+
np.zeros_like(ss_contributions),
172+
)
173+
counterfactual_sim.set_input(
174+
"employment_income",
175+
time_period,
176+
employment_income + ss_contributions,
177+
)
178+
179+
# NI relief = counterfactual NI - baseline NI
180+
ni_employee_baseline = sim.calculate("ni_employee")
181+
ni_employer_baseline = sim.calculate("ni_employer")
182+
ni_employee_cf = counterfactual_sim.calculate("ni_employee", time_period)
183+
ni_employer_cf = counterfactual_sim.calculate("ni_employer", time_period)
184+
185+
employee_ni_relief = ni_employee_cf - ni_employee_baseline
186+
employer_ni_relief = ni_employer_cf - ni_employer_baseline
187+
188+
df["obr/salary_sacrifice_ni_relief"] = household_from_person(
189+
employee_ni_relief + employer_ni_relief
190+
)
191+
161192
# Population statistics from the ONS.
162193

163194
region = sim.calculate("region", map_to="person")

0 commit comments

Comments
 (0)