Spectral Deconvolution Methods for Bunching(and Regression Discontinuity Designs)

How Euler's formula separates the bunching mass from optimization frictions and the non-bunchers’ density

Dylan Moore · University of Hawaiʻi at Mānoa
National Tax Association · November 13, 2026

Why do agents bunch at kinks?

What the data show: bunching blurred by friction

The pile, before and after friction

without friction

with friction

Why the latent bunching mass? As the input to elasticity estimates (Saez 2010; Chetty, Friedman, Olsen and Pistaferri 2011; Kleven 2016).
Or in its own right (Moore 2026a; Goff 2026).
This paper: how to recover the bunching mass when all we observe is the blur.

Each observation becomes a point on a circle

For a smooth density, fades to zero as rises.

The narrower the tower (half-width ), the longer it holds up.

Only the mass point levels off. A density kink fades like .

A density jump lingers here, like . The mass point adds nothing.

Friction multiplies the transform

The atom still beats the non-bunchers’ density by a factor of , whatever is.

Against , the log transform is a straight line

Beyond a moderate frequency the curve lies on the line. That stretch is where a fit belongs.

What the argument needs

RequirementIn plain words
Bunching to find, With no mass point, a smooth distribution under less friction fits the same data. A small mass point under large cannot be told from none.
The friction’s law is known in advanceI fix its family before I look at the data and estimate only its parameters. Gaussian with scale , say, but not only Gaussian: Voigt friction (Gaussian plus independent Cauchy) and other stable distributions work too.
It must be distinguishableIn the limit only one value of its parameters is consistent with what I observe. That fails for, say, Laplace friction (a two-sided exponential) with unknown scale.
Known: is identified under Gaussian friction (Cattaneo, Jansson, Ma and Slemrod 2018, who estimate it by nonparametric maximum likelihood; Trong et al. 2021).
New here: identification under non-Gaussian friction and non-identification in other cases; the cosine and sine split; estimators that measure features of the empirical cosine function; a method for selecting the window of frequencies.

The data in the frequency domain

The estimator I use: fit in levels, on a window chosen by a fit test

Window sensitivity in the data

Data: IRS public-use tax file, 1995–2014, returns with one child.
Each return carries its sampling weight .
Left: the cosine part of the data at each frequency .
It starts at 1 and falls fast.
Shaded: standard errors around .
Problem 1. Too high a frequency is very noisy.
Past the first few wiggles, is within 2 SE of zero.
Right: the log of against .
Problem 2. Too low, it is not a straight line.
The smooth parts have not decayed yet.
Each frequency is weighted by its inverse variance.
Levels: near the noise floor goes negative and has no log.
Voigt friction adds an independent Cauchy of scale .
Its factor becomes .
The checks choose the window, including a fit test.
The fit test passes if its bootstrap .
Gaussian friction: , .
Voigt: , about twice the Gaussian.
, and , its lower bound.
Move the lower end up: keeps falling, with no flat stretch.
Too low is problem 2; too high is problem 1.
So the checks choose the window, not my eye.
If no window passes them all, I take the best and flag what it fails.

Where are the bunchers in the histogram?

A buncher’s observed income is the kink plus friction , so the fit says how many bunchers to expect in each bin.

The histogram of the data: log earned income around the first kink, returns with one child.
Gaussian friction. Lower line: the non-bunchers. Upper line: plus the bunchers. Red area: .
Voigt friction adds a Cauchy part: a sharper peak and a thin layer far out (about 6% off the picture).

The same picture, method by method

Bertanha, McCallum and Seegert’s sample: self-employed returns with one child, 1995–2004.

Lower line: its non‑bunchers. Red: its bunchers.

Gaussian plus Cauchy friction: long, thin tails.

Maximum likelihood, normal friction. Same two lines.

No friction model. Red: the bars above its line.

Most of the difference between the methods is in the tails, away from the kink.

Part 2 · Who bunches

Who bunches? Weight each point by a characteristic

The friction cancels in the ratio

Each person is a point on the circle, as before. Teal: self-employed (); open gray: not (). Teal arrow: the average of times each point; dark arrow: the average of all points.

Bunchers add their mean at every frequency; everyone else fades (: a kink term, as in Part 1).

So the ratio climbs to the self-employed share among bunchers: the amber line.

Add friction , independent of and . Both arrows shrink by the same .

As grows the fade and the factor cancels. All the ratio needs is independent errors: not symmetric, not mean zero; in principle any distribution.

Gaussian or Laplace, narrow or wide: the ratio does not move. That is identification; whether it works in practice is a separate question.

The ratio in the data

Left: the ratio at each frequency.
if self-employed; weights each return by .
Shaded: SE. Gray: is within noise.
: the least-squares slope over the shaded band.
The fit test chooses the band, as in Part 1.
Corrected for noise: a return paired with itself is left out.
, against 0.19 among all filers.
Right: the same for Schedule C net income.
= $9,020, against $2,560 among all filers.

Who bunches at the EITC’s first kink

93% of bunchers are self-employed.
Against 34% of non-bunchers at the kink, or 24% with Voigt friction.
Bunchers report $9,020 of Schedule C income and $3,000 of wages.
Their adjusted gross income (AGI) is a little lower than non-bunchers’.

The assumption: friction has nothing to do with the characteristic.

Self-employment income is fixed; noise moves only where taxable income lands.
If the noise also moved self-employment income, that would be a different problem.

Part 3 · RD with a mismeasured running variable

The jump lives on the sine side, and the error cancels in a ratio

I observe , not the true score . The effect is , the jump in the outcome over the jump in treatment at the cutoff. It works for sharp and fuzzy designs and needs measured directly, and .

It needs classical error (independent of the true score, treatment and outcome), and no bunching or density jump at the cutoff. My estimator, , pools this ratio over a band.

PROGRESA: a rebuilt running variable

PROGRESA: one rebuilt score works, one fails

PROGRESA, Mexico’s cash transfer: eligibility jumps at a cutoff in a household poverty score, and I hold the official score.

Rebuild the score from survey data, as an analyst without it would: eligibility has no jump at the cutoff.
Rebuild the score from survey data, as an analyst without it would: eligibility has no jump at the cutoff.
A second index leaves out income and the dwelling block (the house). Closer to the official score: still no jump.
In the 1997 placebo year, before any payments, one index agrees with the official-score answers. The other fails: −0.212.
In the 1997 placebo year, before any payments, one index agrees with the official-score answers. The other fails: −0.212.
The one that passes tracks the official-score answers in all three years.

Why one might fail (a conjecture): the estimator needs the score’s error to be unrelated to the outcome. The dwelling block tracks household wealth, which also predicts attendance, so leaving it out may tie the error to the outcome.

Conclusion

In the frequency domain, friction multiplies instead of blurring.

Bunching, Part 1:
the bunching mass

A new method for estimating the bunching mass when frictions are random optimization error.

Multi-dimensional bunching

The mean of any characteristic among bunchers, if friction is independent of it.

Regression discontinuity

Sharp or fuzzy, the RD effect is identified under independent error of unknown distribution, with no normality, tail, bounded-support or known-variance condition (Pei and Shen 2017 need one).

Extensions

It also recovers other moments, such as density discontinuities at the kink.

Changes in the conditional expectation function across the kink.

A test of the requirements of the Atkinson–Stiglitz theorem (Ferey, Lockwood and Taubinsky).

A covariate-dependent version of each estimator.

Monte Carlo simulations of each estimator.

Code to implement everything in today’s presentation is coming soon.

Bunching, Done Right

A Guide to the Theory of Bunching

An interactive visual textbook

A preliminary version of Chapters 1–4 is now on my website: dylantmoore.com/bunching