Econometrics & Omitted-Variable Sensitivity
Oster Coefficient Stability Delta and Bias-Adjusted Beta Formula
Audit omitted-variable bias in Excel and Arte Sheets using Emily Oster’s (2019) R-squared-scaled bias-adjusted beta_star and breakdown proportionality delta_zero.
Understand why stable coefficients mean nothing when controls barely move R-squared!
Researchers often claim an OLS treatment slope is robust to omitted variables because adding observed controls barely shifts beta from uncontrolled beta_dot to controlled beta_tilde. Emily Oster (2019) proved that if observed controls barely increase R-squared (R_tilde - R_dot is tiny relative to remaining unexplained signal R_max - R_tilde), even a tiny coefficient movement implies massive potential omitted-variable bias!
Under Oster’s linear approximation with equal selection proportionality delta = 1.00 (B6) and theoretical ceiling R_max = MIN(1, 1.3 * R_tilde): beta_star = beta_tilde - delta * (beta_dot - beta_tilde) * ((R_max - R_tilde) / (R_tilde - R_dot)), and the breakdown proportionality that drives beta_star = 0 is delta_zero = (beta_tilde * (R_tilde - R_dot)) / ((beta_dot - beta_tilde) * (R_max - R_tilde)). Verify by hand: uncontrolled beta_dot = 0.25, R_dot = 0.05 (B2, B3); controlled beta_tilde = 0.20, R_tilde = 0.30 (B4, B5); ceiling R_max = 1.3 * 0.30 = 0.39 (E2). Then (R_max - R_tilde)/(R_tilde - R_dot) = 0.09 / 0.25 = 0.36, so beta_star(delta=1) = 0.20 - 1 * 0.05 * 0.36 = 0.1820 (safely excludes 0!) and breakdown delta_zero = 0.20 / (0.05 * 0.36) = 11.1111 (well above Oster’s |delta| > 1.0 benchmark!).
| Oster (2019) Diagnostic | Formula Expression | Sample Output |
|---|---|---|
| Oster R-Squared Ceiling R_max | MIN(1, 1.3 * R_tilde) | 0.3900 |
| Unexplained-to-Explained R^2 Ratio | (R_max - R_tilde) / (R_tilde - R_dot) | 0.3600 (0.09 / 0.25) |
| Bias-Adjusted Slope beta_star (delta=1) | beta_tilde - delta*(beta_dot - beta_tilde)*Ratio | 0.1820 (Excludes 0) |
| Breakdown Selection Ratio delta_zero | beta_tilde / ((beta_dot - beta_tilde) * Ratio) | 11.1111 (> 1.0 robust hurdle) |
Oster Bias-Adjusted Coefficient beta_star(delta, R_max) Formula
Guard informative controls (R_tilde > R_dot) and valid R_max >= R_tilde before scaling the observed coefficient attenuation (beta_dot - beta_tilde).
=LET(b_dot, B2, r_dot, B3, b_til, B4, r_til, B5, del_s, B6, r_max, MIN(1, 1.3 * r_til), IF(OR(r_dot < 0, r_til <= r_dot, r_til > 1), "Controls Add Zero R2", ROUND(b_til - del_s * (b_dot - b_til) * ((r_max - r_til) / (r_til - r_dot)), 4)))Breakdown Proportionality delta_zero & Noisy-Control Trap Check
See the noisy-control trap in action: change controlled R_tilde in B5 from 0.30 down to 0.06 (so controls only raise R^2 by +0.01 while R_max = 0.078 -> Ratio = 0.018 / 0.01 = 1.80, or test fixing R_max = 0.39 with R_tilde = 0.06 -> Ratio = 33!). Even with dynamic R_max = 1.3 * R_tilde, if B2 = 0.35 and B5 = 0.06, Ratio = 1.80 and beta_star plunges from +0.2000 into negative territory (-0.0700)!
=LET(b_dot, B2, r_dot, B3, b_til, B4, r_til, B5, r_max, MIN(1, 1.3 * r_til), denom_v, (b_dot - b_til) * (r_max - r_til), IF(OR(r_til <= r_dot, ABS(denom_v) < 0.000001), "Zero Attenuation", ROUND((b_til * (r_til - r_dot)) / denom_v, 4)))Try the example
Use the original values or change them to test your understanding.