Skip to content

Correct net-VAT liability scaling; rewrite paper on the corrected model#21

Open
MaxGhenis wants to merge 4 commits into
mainfrom
fix/vat-liability-scaling-v2
Open

Correct net-VAT liability scaling; rewrite paper on the corrected model#21
MaxGhenis wants to merge 4 commits into
mainfrom
fix/vat-liability-scaling-v2

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

Summary

Completes the net-VAT liability fix from #15 (superseding draft PR #17), re-runs the entire pipeline on the corrected model, and rewrites the paper against the corrected numbers plus a seven-referee review (methodology, red-team, domain, citations, neutrality, style, reproducibility).

The defect and its consequences

vat_liability_k was turnover − input (no ×0.20), inflating per-firm liabilities ~5×, with ρ ∈ [0.6, 1.5] leaving ~47% of firms with negative value added. The weight optimiser compensated on band totals (aggregate scores barely moved) while distorting the near-threshold density — manufacturing the paper's "reproduction" of the administrative bunching step.

Model fixes

  • v = 0.20 × (turnover − input); ρ ∈ [0.1, 0.95], mean VA share 40%, zero negative-VA firms (from Fix vat liability scaling #17, applied to current main)
  • Behavioural solver rewritten: the damped fixed-point iteration has no fixed point for firms straddling a reform notch (iterates oscillate; results were iteration-parity artifacts). Replaced with a closed-form region-confined solve using the formulation-A response ratio y* = y_obs[(1−τf₁)/(1−τf₀)]^e (deductible share cancels). e→0 nesting now exact; baseline reproduction asserted; raise-to-£100k behavioural ≡ static at every e — a derived invariance, asserted in the crosscheck
  • Bunching estimator: removed non-identified elasticity outputs (σ/Π/eps, incl. an ad hoc τ/2 normalisation from a deleted model); fixed bootstrap replicate weights (were scaled n/W)
  • Recovery test redesigned: the old injection was invisible to the counterfactual fit by construction (donor+deposit both inside the exclusion window); new KW-consistent injection extends beyond the window and is scored by the headline estimator
  • Secondary-notch mass block in dominated_region_mass; new results/static_sweep.txt artifact (the sweep table was previously figure-pixels only); voluntary-retention sensitivity on the anchor

Headline results on the corrected model

Object Old Corrected
Common-base menu (2023-24, base) £183.6bn £184.7bn
Raise to £100k −£508m −£698m (behavioural = static at every e)
Graduated taper −£336m −£466m
Reduced rate 10% / 15% −£343m / −£171m −£460m / −£230m
Anchor 85→90k (2025-26) vs HMRC −£185m −£175m ("within £10m") −£248m full-dereg / −£141m retention — brackets HMRC in all 5 years
Bunching at 85k E=8,712, b=0.060 ("reproduces admin step") E=0, b=−0.139
Bunching at 90k (2024-25 vintage) E≈196k spurious, spec-robust — band-edge artifact
Behavioural offsets 40–75% of static 0% (raise), <4% (bands)

Paper rewrite

Every section updated. Section 5 reframed around the correction: band-calibrated synthetic data cannot support bunching inference in either direction — the corrected data show nothing at £85k while the same generator shows a huge spurious signal at the £90k band edge, robust in all 16 sensitivity cells. The earlier draft's artifact is documented openly as the sharpest demonstration of the thesis. Value-added "robustness" paragraph (which implied dominated widths above the £21,250 statutory cap) replaced by the formulation-A invariance result. Anchor mechanism corrected (uprated counterfactual threshold path, not "fiscal drag"). Citations: LLAT sample setting corrected (2004–14, £58k–£81k thresholds — not "the same £85,000 notch"); Chetty et al. credited for the polynomial counterfactual; HMT 2018 call for evidence + Council Directive (EU) 2020/285 added; URLs/DOIs throughout. Full referee reports available on request.

Upstream

Closes #15. Supersedes #17.

🤖 Generated with Claude Code

MaxGhenis and others added 4 commits July 1, 2026 22:37
v_i = 0.20 x (turnover - inputs) in generator, calibration, and validator;
rho recentred to mean ~0.6 and clamped to [0.1, 0.95] so value added is
strictly positive; secondary-notch mass block in dominated_region_mass.

Cherry-picked from origin/fix-vat-liability-scaling (issue #15) without
the tex changes, which are superseded by the rewrite in this branch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Replace the damped fixed-point forward solve (no fixed point at reform
  notches; iterates oscillate) with a closed-form region-confined solve:
  each firm re-optimises within the schedule region containing its observed
  turnover, using the formulation-A response ratio
  y* = y_obs [(1-tau f1)/(1-tau f0)]^e (deductible share cancels).
  e->0 nesting is now exact; a pure threshold raise provably has zero
  intensive-margin offset (behavioural == static at every e) — asserted in
  the crosscheck; baseline reproduction asserted in reform_revenue.
- Remove the non-identified elasticity outputs (sigma/Pi/eps) and the
  tau/2 wedge normalisation inherited from a deleted sigmoid model from the
  bunching estimator; keep the geometry (b, b_llat, E, Delta_R, y_R).
- Fix bootstrap replicate weights to sum to the population mass W rather
  than the row count n (E replicates were scaled by n/W).
- Redesign the recovery test: KW-consistent injection with missing mass
  extending beyond the exclusion window, scored by the headline estimator
  (the previous injection was invisible to the counterfactual fit by
  construction).
- Relabel e sweep values as assumptions (0.05 external KW anchor); remove
  the false 'calibrated to reduced-form estimates' provenance.
- report.py: fall back to the generic output CSV name; taper guard in the
  dynamic CLI.

Addresses issues #15 and the methodology findings in the review.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Both vintages rebuilt with v = 0.20(turnover - inputs); all artifacts
regenerated: calibration report (89.4%/89.4%), static sweep + anchor
(new static_sweep.txt artifact with voluntary-retention sensitivity),
reform menu (raise -698m, taper -466m, 10% band -460m, 15% band -230m
on the common 184.7bn base), behavioural table (raise == static at
every e; band offsets second-order), bunching (E=0 at 85k; spurious
E=196k at the 90k band edge on the 2024-25 vintage), placebo (E=0
under all treatments), redesigned recovery test, dominated-region
masses, iso-optimum verification.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Abstract/intro/data/static/bunching/model/behavioural/conclusion and both
appendices rewritten against the corrected pipeline and the review findings:

- Section 5 reframed: the corrected data contain no bunching at 85k
  (E=0, b=-0.139) and a spurious spec-robust signal at the 90k band edge
  (E~196k); the earlier draft's 'reproduced step' is documented as a
  liability-scaling artifact and its correction reported openly.
- Anchor comparison rewritten: full-deregistration (-248m, 2025-26) and
  43% voluntary-retention (-141m) conventions bracket HMRC's -185m in
  every forecast year; 'fiscal drag lifts the frozen baseline' replaced
  with the uprated counterfactual threshold path the code implements.
- Behavioural section rewritten around the region-confined solver:
  raise-to-100k behavioural == static at every e (derived and asserted);
  reduced-rate offsets under 4%; taper exclusion restated structurally;
  the orphaned 'pathological FOC solve' claim removed; e sweep relabelled
  as assumptions (KW 0.05 anchor; LLAT UK 0.09-0.14 noted).
- Dominated region: formulation-A invariance replaces the erroneous
  per-firm tau0/(1-tau0) robustness paragraph (which implied widths above
  the statutory cap); masses updated to the corrected population.
- Static: new sweep (2024-25 vintage, explicitly introduced), menu on the
  184.7bn base, direct-vs-smooth method reconciliation, +5.8% base
  overshoot disclosed against HMRC liability-target sums.
- Neutrality/style: metric-scoped verdicts only; hedges consolidated;
  self-praise removed; findings renumbered to four consistently.
- Citations: LLAT setting corrected (2004-14 sample, 58k-81k thresholds);
  Chetty et al. credited for the polynomial counterfactual; URLs/DOIs
  added throughout; benedek2015 to techreport; belloncopestake year fixed;
  HMT 2018 call for evidence and Council Directive (EU) 2020/285 added;
  ONS panel relabelled to the VAT/PAYE-registered frame with a BPE note;
  150k step FRS attribution removed (band edge; step absent in corrected
  data).
- Title: 'An Open Firm-Level Microsimulation of the UK VAT Registration
  Threshold'. README tables updated; upstream Populace inheritance of the
  mis-scaling flagged.

Closes #15. Supersedes #17.

Co-Authored-By: Claude Fable 5 <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.

Fix per-firm VAT liability scaling (value-added → net VAT) + repair bunching reproduction

1 participant