Econometrics & Randomized Experiments
Lee Trimming Bounds Formula for Differential Sample Attrition
Correct selective follow-up attrition in randomized trials using David Lee’s (2009) excess-observer trimming fraction p_trim = (s_T - s_C) / s_T and sharp quantile-trimmed bounds.
Bound treatment effects when job training or therapy changes who stays observed!
Even in a gold-standard randomized experiment, post-randomization attrition or non-employment creates selection bias on observed wages: if 80% of treated participants report wages (s_T = 0.80) vs only 60% of controls (s_C = 0.60), the extra 20% "induced-to-respond" treated subjects are NOT comparable to "always-observed" controls! Under monotonicity (treatment only helps response), David Lee (2009) showed that always-observers constitute fraction 1 - p_trim = s_C / s_T = 0.60 / 0.80 = 0.75 of observed treated subjects, so trimming fraction p_trim = (s_T - s_C) / s_T = 0.2500 from the TOP vs BOTTOM of observed treated outcomes yields sharp causal bounds!
Verify on 8 sorted observed treated outcomes in B2:B9 = {12, 15, 18, 20, 22, 25, 28, 32} (mean = 21.50, s_T = 0.80 in E2) vs control mean mu_C = 17.00 with s_C = 0.60 (E3, E4). Here p_trim = (0.80 - 0.60) / 0.80 = 0.2500 -> trim k_trim = 0.25 * 8 = 2 observations! Trimming the top 2 {28, 32} gives worst-case treated mean AVERAGE(B2:B7) = 18.6667 -> Lee Lower Bound = 18.6667 - 17.00 = +1.6667 (still strictly positive!); trimming the bottom 2 {12, 15} gives AVERAGE(B4:B9) = 24.1667 -> Lee Upper Bound = +7.1667!
| Lee (2009) Attrition Quantity | Formula Expression | Sample Output (8 Treated Obs) |
|---|---|---|
| Excess-Response Trimming Share p_trim | (s_T - s_C) / s_T = (0.80 - 0.60) / 0.80 | 0.2500 (Trim 2 of 8 obs) |
| Naive Unadjusted Difference | AVERAGE(B2:B9) - mu_C = 21.50 - 17.00 | +4.5000 |
| Lee Sharp Lower Bound (Drop Top k) | AVERAGE(TAKE(Sorted_T, N_T - k)) - mu_C | +1.6667 (> 0 robust!) |
| Lee Sharp Upper Bound (Drop Bot k) | AVERAGE(DROP(Sorted_T, k)) - mu_C | +7.1667 |
Lee Trimming Fraction p_trim = (s_T - s_C) / s_T Formula
Verify response-rate bounds 0 < s_C <= s_T <= 1 (if s_C > s_T, trim the control arm symmetrically instead).
=IF(OR(E2 <= 0, E2 > 1, E3 <= 0, E3 > E2), "Require 0 < s_C <= s_T <= 1", ROUND((E2 - E3) / E2, 4))Lee Sharp Lower & Upper Trimmed Bounds Formula (Dynamic SORT + TAKE / DROP)
Sort treated outcomes dynamically via SORT(B2:B9) and slice N_T - k_trim lowest values with TAKE (lower bound) or drop k_trim lowest values with DROP (upper bound). Check equal retention (set E3 = 0.80 = E2): k_trim = 0 and BOTH Lee bounds collapse to +4.5000!
=LET(s_tr, E2, s_co, E3, mu_c, E4, IF(OR(s_tr <= 0, s_co <= 0, s_co > s_tr), "Require 0 < s_C <= s_T <= 1", LET(n_obs, ROWS(B2:B9), k_tr, ROUND(((s_tr - s_co) / s_tr) * n_obs, 0), srt_t, SORT(B2:B9), ROUND(AVERAGE(TAKE(srt_t, n_obs - k_tr)) - mu_c, 4))))Try the example
Use the original values or change them to test your understanding.