Arte SheetsLearn. Try. Understand.

Public Economics & Causal Inference

Kleven-Saez Kink Bunching Mass and Behavioral Elasticity Formula

Calculate normalized excess bunching mass b = B / h_0, marginal buncher shift Delta_z = b * w_bin, and exact log-retention elasticity e = (Delta_z / z_star) / LN((1 - m_1) / (1 - m_2)).

Convert excess bunchers at a convex schedule kink into structural behavioral elasticity

When a marginal deduction, benefit phase-out, or bracket schedule jumps from rate m_1 below threshold z_star to higher rate m_2 > m_1 above z_star, optimization pulls agents who would have located on [z_star, z_star + Delta_z] down onto the kink! Saez (2010) and Kleven (2016) proved that normalized excess bunching mass b = B_excess / h_0 (in bin-width units w_bin) pins down the marginal buncher’s counterfactual response Delta_z = b * w_bin.

Audit the exact log-retention denominator versus the naive small-kink approximation: at threshold z_star = 50,000 (B2), bin width w_bin = 500 (B3), excess bunchers B_excess = 1,200 (B4), counterfactual smooth density h_0 = 400 per bin (B5), pre-kink rate m_1 = 0.20 (B6), and post-kink rate m_2 = 0.36 (B7), normalized mass is b = 3.0000 bins and Delta_z = 1,500 (3.00% of z_star). Dividing 0.0300 by exact LN((1 - 0.20) / (1 - 0.36)) = LN(1.25) = 0.2231 gives structural elasticity e = 0.1344, whereas naive linear (m_2 - m_1) / (1 - m_1) = 0.20 overstates elasticity at 0.1500!

Bunching QuantitySpreadsheet FormulaSample Result
Normalized Excess Mass (b)B_excess / h_03.0000 bins
Marginal Buncher Response (Delta_z)(B_excess / h_0) * w_bin1,500.00 (3.00% of z_star)
Exact Log-Retention Elasticity (e_log)(Delta_z / z_star) / LN((1 - m_1)/(1 - m_2))0.1344
Small-Kink Linear Approx (e_lin)(Delta_z / z_star) / ((m_2 - m_1)/(1 - m_1))0.1500 (+11.6% Upward Bias)

Exact Log-Retention Kleven-Saez Kink Elasticity Formula

Validate that threshold z_star > 0, counterfactual density h_0 > 0, and retention shares satisfy 0 <= m_1 < m_2 < 1 so a convex kink exists before evaluating LN((1 - m_1) / (1 - m_2)).

=LET(z_st, B2, w_bn, B3, b_ex, B4, h_cf, B5, m_lo, B6, m_hi, B7, IF(OR(z_st <= 0, w_bn <= 0, b_ex < 0, h_cf <= 0, m_lo < 0, m_hi <= m_lo, m_hi >= 1), "Invalid Kink Parameters", LET(dz_sh, (b_ex / h_cf) * w_bn, d_ln, LN((1 - m_lo) / (1 - m_hi)), ROUND((dz_sh / z_st) / d_ln, 4))))

Marginal Buncher Counterfactual Earnings Shift Delta_z = (B_excess / h_0) * w_bin Formula

Report Delta_z in native currency or hours alongside elasticity so policy reviewers can inspect whether the implied width matches the visible pre-kink bunching window.

=LET(w_bn, B3, b_ex, B4, h_cf, B5, IF(OR(w_bn <= 0, b_ex < 0, h_cf <= 0), "Invalid Kink Parameters", ROUND((b_ex / h_cf) * w_bn, 2)))

Try the example

Use the original values or change them to test your understanding.

Further reading