Skip to content

Fix vat liability scaling#17

Draft
vahid-ahmadi wants to merge 5 commits into
mainfrom
fix-vat-liability-scaling
Draft

Fix vat liability scaling#17
vahid-ahmadi wants to merge 5 commits into
mainfrom
fix-vat-liability-scaling

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

⚠️ DRAFT — do not merge. Work-in-progress model fix that is economically correct but breaks the bunching section. Tracked by #15.

What this does

Fixes a per-firm scaling defect in the synthetic-data model:

  • vat_liability_k was storing raw value added (turnover − input), missing the ×0.20 VAT rate — per-firm "net VAT" was ~5× too large.
  • The input/output ratio ρ was centred ~0.98, so ~47% of firms had negative value added (inputs > turnover); the headline base only matched HMRC because those negatives accidentally cancelled the over-scaling.

The fix: v_i = STANDARD_VAT_RATE · (turnover − input) and ρ re-centred to ~0.6 (clamped [0.1, 0.95], so value added is always positive), applied consistently across config / generate / calibration / validate / dynamic.

What's verified good ✅

  • Input ratio ρ → 0.60, value-added share 0.40, zero negative-VA firms.
  • Revenue base essentially unchanged (£204.6bn @ £90k 2025-26 vs £203.8bn before) — now correct for the right reason, not via cancellation.
  • Per-firm net VAT wedge ~2% → ~8% (economically sensible).
  • Overall calibration ~89% (held).

Why it's a DRAFT and must not merge ❌

The corrected (turnover-correlated) liability makes the weight optimiser pile weight just above £85k, which reverses the near-threshold density step and collapses the bunching signal: excess mass E: 8,712 → 0, ratio b: +0.06 → −0.14. The 2024-25 vintage also degrades. Calibration-knob tuning (l1_reg_coef, vat_liability_band_importance) can flip the simple density step positive but the estimator still returns E=0 — knob-tuning does not restore it. So merging this would ship a paper whose headline bunching result is broken.

What remains (see #15)

Decide the bunching story under the corrected model — either a deeper calibration change (e.g. a near-threshold density target) or an honest reframing of Section 5 — then a full re-run and propagation of all headline numbers.

Notes

🤖 Generated with Claude Code

vahid-ahmadi and others added 5 commits June 28, 2026 16:27
Implements corrections from a policy / economics / statistics referee panel.

Substantive (theory):
- Secondary dominated region: a banded reduced rate reverts to 20% at the
  £105k band top, creating a second notch (a' = T1(τ−r)/(1−τ)). Total
  dominated width is therefore £21,562 (15%) and £22,569 (10%), essentially
  unchanged vs the £21,250 baseline — the reduced rate splits the empty band
  rather than shrinking it. Only the taper removes the distortion; the level
  move relocates it. Corrected in model.tex, intro.tex, conclusion.tex.
- Reconcile notch rate: the £21,250 width uses the statutory 20% turnover
  rate while the costing/behavioural layers use each firm's ~3% net wedge.
  Reframe "model-free" → "exact, elasticity-free (conditional on the
  turnover-tax notch)"; clarify the 137k count indexes exposed population,
  not optimal locators.
- Demote e=0.17 from "headline" to "illustrative midpoint"; anchor the
  e-range's only external point (Kleven–Waseem ≈0.05); note 0.17/0.32 are
  notch-implied, not data-identified.

Statistics / inference:
- Caveat that bootstrap SEs/CIs reflect resampling dispersion of a synthetic
  file of analyst-chosen size, not population sampling error.
- Reconcile appendix elasticities (notch-width ≈0.45, marginal-buncher ≈0.66)
  vs body sweep {0.05,0.17,0.32}: different objects, all non-identified.
- Fix estimator contradictions: bin width £100 → £1,000 (bunching.tex);
  counterfactual polynomial "cubic" → degree-7 (a_data.tex), matching code.

Policy:
- Reconcile £203.8bn base as a theoretical-liability (VTTL-style) aggregate
  above cash receipts (footnote); cite HMT Spring Budget 2024 for the £185m
  anchor.
- Add compliance-cost caveat (cite Keen & Mintz 2004) to the distortion
  ranking limitations.

Housekeeping:
- Correct the static-sweep convexity mechanism (higher per-firm liability,
  not denser mass) and three sec:bunching → sec:behavioural cross-refs.
- Move orphaned/contradictory model sections (results, counterfactuals,
  literature) to paper/future/; update body.tex comments.
- README firm count 2.0M → 2.5M; conclusion voluntary-reg wording → 43%.
- Rebuild paper/main.pdf.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The reduced-rate case needs the secondary-notch identity, so the opening
of "How each reform changes the dominated region" now references both
eq:dominated and eq:dominated-secondary rather than implying everything
follows from the single primary-notch formula. Rebuild main.pdf.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Second-pass revisions from the three-referee re-review (all minor):
- Base reconciliation: intro now flags the £508m (£85k data-year base) vs the
  £374m £90k-sweep figure for the same £100k move; static.tex notes both
  £183.6bn and £203.8bn are VTTL-style theoretical-liability bases.
- "HMRC's £185m" → "the Government's published £185m" (cite is HM Treasury).
- model.tex: own that the 137k dominated-band count is conditional on the
  uniform within-band fill and would shift under another shape; the width a,
  not the count, is exact.
- behavioural.tex: resolve the Δy* symbol collision (structural marginal-buncher
  excess now Δy_H ≡ n_H−T*, distinct from the appendix's £5.6k bunching span);
  note the body's 0.17/0.32 differ from the appendix's ≈0.66 marginal-buncher
  elasticity, both non-identified.
- data.tex: note ρ_i up to 1.5 permits negative value added (input-VAT-reclaim
  positions).
- conclusion.tex: flag absent sectoral incidence of the menu reforms as future
  work (VAT-by-sector excluded from the optimiser).
- a_inference.tex: complete tab:degwin to the full {5,6,7,8}×{£10–25k} grid
  (16 cells, from the released estimator output) so it matches the prose.
- Rebuild main.pdf (35pp).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… ~0.6

Per-firm net VAT liability is now STANDARD_VAT_RATE*(turnover-input) (was raw
value added, missing the rate); input/output ratio re-centred ~0.98 -> ~0.6 and
clamped [0.1,0.95] so value added is always positive (eliminates the ~47%
negative-VA firms). Applied consistently in generate/calibration/validate/dynamic.
Calibration knob l1_reg_coef is PROVISIONAL (repair of near-threshold density
in progress). Results/figures intentionally not committed yet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Knob-tuning (l1_reg_coef, vat_liability_band_importance) was explored to repair
the near-threshold density but did NOT restore positive bunching excess mass
(E stays 0 even when the simple below/above density step turns positive). So the
branch keeps the v_i/rho fix with DEFAULT knobs; the bunching reproduction issue
is deferred to a tracking issue.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant