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 Quantity | Spreadsheet Formula | Sample Result |
|---|---|---|
| Normalized Excess Mass (b) | B_excess / h_0 | 3.0000 bins |
| Marginal Buncher Response (Delta_z) | (B_excess / h_0) * w_bin | 1,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.