MethodAtlas
Robustness Stage

Sensitivity Analysis for Unobservables

How robust are your results to omitted variable bias? Oster (2019) and Cinelli & Hazlett (2020) provide formal answers.

The Problem You Cannot See

You have run your regression, included every control variable you can think of, and your treatment effect is statistically significant. Your advisor nods. A referee writes: "How robust is this result to omitted variable bias?"

Addressing this question is central to building a convincing empirical argument.

Every observational study — and even many quasi-experimental ones — faces the same uncomfortable question: what if there is an unobserved variable that, if you could control for it, would shrink your estimate to zero? You can never prove this is not the case. What you can do is formally characterize how strong such a confounder would have to be in order to eliminate your findings. If the answer is "implausibly strong," your result gains credibility. If the answer is "a modest confounder would do it," you should worry.

This formalization is what sensitivity analysis for unobservables does. It does not prove your result is causal. It tells you — and your readers — exactly how much unobserved confounding it would take to overturn it.


Why Does This Matter?

The traditional approach to omitted variable bias was informal: run a regression with few controls, then add more, and argue that if the coefficient does not move much, unobservables probably would not change things either. This logic was formalized by Altonji et al. (2005), who proposed comparing the coefficient with and without controls as a way to bound the bias from unobservables.

(Altonji et al., 2005)

The intuition is clean: if adding observed controls barely moves the coefficient, then unobserved confounders — which, under certain assumptions, produce bias of similar magnitude — probably would not move it much either. But this argument had limitations. It was hard to make precise, and it ignored the role of R-squared movements.

Two frameworks have since emerged as the standard tools for formalizing this argument. Both are worth knowing.


Framework 1: Oster's Delta and Bias-Adjusted Estimates

Oster (2019) extended the Altonji, Elder, and Taber logic into a complete framework that accounts for both coefficient movements and R-squared movements when controls are added.

(Oster, 2019)

The Core Idea

Oster's approach asks: if selection on unobservables is proportional to selection on observables, how large would that proportionality factor (called delta, or δ\delta) have to be to drive the treatment effect to zero?

Here is the setup. You run two regressions:

  1. Short regression (no controls): coefficient β˙\dot{\beta}, R-squared R˙\dot{R}
  2. Long regression (with controls): coefficient β~\tilde{\beta}, R-squared R~\tilde{R}

If adding observables moves the coefficient from β˙\dot{\beta} to β~\tilde{\beta} and moves R-squared from R˙\dot{R} to R~\tilde{R}, then the bias from unobservables depends on two things:

  • Delta (δ\delta): the ratio of selection on unobservables to selection on observables. If δ=1\delta = 1, unobservables are equally important as observables for confounding. If δ=2\delta = 2, unobservables are twice as important.
  • RmaxR_{\max}: the R-squared you would obtain if you could include all relevant variables (observed and unobserved). This bound caps how much explanatory power remains to be captured.

Don't worry about the notation yet — here's what this means in words: The bias-adjusted treatment effect equals the controlled estimate minus a correction term that depends on how the coefficient and R-squared move when you add controls, scaled by delta and R-max.

The commonly used first-order approximation of the bias-adjusted estimate is:

ββ~δ(β˙β~)RmaxR~R~R˙\beta^* \approx \tilde{\beta} - \delta \cdot (\dot{\beta} - \tilde{\beta}) \cdot \frac{R_{\max} - \tilde{R}}{\tilde{R} - \dot{R}}

Note: The exact result in Oster (2019), Proposition 1, involves the real root of a cubic equation. The formula above is a widely used approximation that captures the key intuition. For precise computation, use the psacalc (Stata) or robomit (R) packages, which implement the exact solution.

When δ=1\delta = 1 (proportional selection) and a specific RmaxR_{\max} is assumed, you can solve for the value of β\beta^*. Alternatively, you can set β=0\beta^* = 0 and solve for the value of δ\delta that would be required to explain away the result entirely. This procedure is the identified set approach.

Oster recommends Rmax=1.3R~R_{\max} = 1.3 \tilde{R} as a default, based on calibration exercises using randomized controlled trials, though this is a rough heuristic and sensitivity to this choice is worth exploring.

How to Interpret Delta

  • δ>1\delta > 1: unobservables would need to be more important than observables to explain away the result. This magnitude is generally reassuring.
  • δ<1\delta < 1: even modest unobserved confounding could overturn the result. This vulnerability is concerning.
  • δ<0\delta < 0: the result would actually get stronger if you added more confounders. This sign reversal can happen and is very reassuring.

Framework 2: Cinelli & Hazlett's Partial R-Squared Approach

Cinelli and Hazlett (2020) propose a different — and in many ways more intuitive — framework based on partial R-squared values.

(Cinelli & Hazlett, 2020)

The Core Idea

Instead of asking "how proportional is selection on unobservables to selection on observables?", Cinelli and Hazlett ask: how much residual variance in the treatment and in the outcome would a confounder have to explain in order to change the conclusion?

They parameterize the confounder's strength using two quantities:

  • RYZX,D2R^2_{Y \sim Z | X, D}: partial R-squared of the confounder ZZ with the outcome YY, after partialing out treatment DD and controls XX
  • RDZX2R^2_{D \sim Z | X}: partial R-squared of the confounder ZZ with the treatment DD, after partialing out controls XX

The key result is that the omitted variable bias from leaving out ZZ is a function of these two partial R-squared values. This framework lets you ask: "How strong would a confounder have to be — in terms of its association with treatment and outcome — to change my conclusion?"

Robustness Values

The framework produces two key quantities:

  • Robustness Value (RV): the minimum strength of confounding (in partial R-squared terms) that would reduce the estimate to zero. Formally, it is the value such that a confounder with RYZX,D2=RDZX2R^2_{Y \sim Z | X, D} = R^2_{D \sim Z | X} equal to that value would reduce the estimate to zero. A related quantity, RVq,αRV_{q,\alpha}, gives the minimum confounding strength that would make the estimate statistically insignificant at level α\alpha.
  • Benchmarking: you compare the robustness value against the partial R-squared of observed covariates. If no observed covariate is as strong as the robustness value, an unobserved confounder would need to be stronger than anything you observe.

Contour Plots

The most distinctive feature of this framework is the contour plot: a two-dimensional graph with RDZX2R^2_{D \sim Z | X} on one axis and RYZX,D2R^2_{Y \sim Z | X, D} on the other, showing contour lines for different levels of bias. Benchmark covariates are plotted as points, giving readers an immediate visual sense of how strong a confounder would have to be.

Interactive Exercise

Benchmarking Mini-Game

Your study estimates a treatment effect of 0.601 (SE = 0.163, t = 3.67). Place benchmark covariates on the Cinelli-Hazlett contour plot to see how strong an unobserved confounder would need to be to explain away your result. Click a covariate below, then click the plot to place it.

0.00.10.20.30.40.00.10.20.30.4Partial R² of confounder with Treatment (R²D~Z|X)Partial R² of confounder with Outcome (R²Y~Z|X)Effect survivesEffect explained awayBreakdown frontier

Available Benchmarks

Click a covariate to place it on the plot at its pre-set partial R² values.

Robustness Score

Original estimate
0.601
t-statistic
3.67
Partial R²Y~D|X
0.0096
Strongest benchmark
--

Why this matters: The Cinelli & Hazlett (2020) sensitivity framework asks: “How strong would an unobserved confounder need to be to change our conclusions?” By benchmarking against observed covariates, we can assess whether such a confounder is plausible. If even the strongest observed covariate cannot explain away the result, we gain confidence in the finding’s robustness.


When to Use Which Framework

FeatureOster (2019)Cinelli and Hazlett (2020)
Key parameterδ\delta (proportionality of selection)Partial R2R^2 (confounder strength)
RequiresShort and long regressionOnly the long regression
BenchmarkingImplicit (via RmaxR_{\max})Explicit (observed covariates)
VisualizationBias-adjusted β\beta^* as a function of δ\deltaContour plots
Best forEconomics papers, applied microPapers with many potential confounders
Softwarepsacalc (Stata), robomit (R)sensemakr (R, Stata, Python)

In practice, many papers now report both. They complement rather than substitute for each other. For an alternative robustness approach that focuses on researcher degrees of freedom rather than unobservables, see specification curve analysis.


How to Do It: Code

Cinelli & Hazlett (sensemakr)

library(sensemakr)

# Fit the main regression
model <- lm(outcome ~ treatment + x1 + x2 + x3, data = df)

# Run sensitivity analysis
sensitivity <- sensemakr(
model = model,
treatment = "treatment",
benchmark_covariates = c("x1", "x2", "x3"),  # observed covariates for benchmarking
kd = 1:3,  # multiples of each benchmark's strength to consider
ky = 1:3
)

# Print summary
summary(sensitivity)

# Contour plot
plot(sensitivity)

# Extreme scenario plot
ovb_contour_plot(sensitivity, sensitivity.of = "t-value")
Requiressensemakr

Oster (2019) Coefficient Stability

Oster (2019) recommends Rmax=1.3R~R_{\max} = 1.3 \tilde{R}, capped at 1, where R~\tilde{R} is the R2R^2 from the regression with all observed controls. The R2max / rmax() arguments take an absolute R2R^2 value, so you must compute it first.

library(robomit)

# Step 1: Estimate the fully controlled model to get R-tilde
full_model <- lm(outcome ~ treatment + x1 + x2 + x3, data = df)
R_tilde <- summary(full_model)$r.squared

# Step 2: Apply Oster's heuristic with cap at 1
R2max <- min(1.3 * R_tilde, 1)

# Compute delta for beta = 0
o_delta(
y = "outcome",          # outcome variable
x = "treatment",        # treatment variable
con = "x1 + x2 + x3",  # controls (as a formula string)
beta = 0,               # hypothesized true beta (0 = test for sign change)
R2max = R2max,          # absolute R-max value (not a multiplier)
type = "lm",
data = df
)

# Bias-adjusted beta for delta = 1
o_beta(
y = "outcome",
x = "treatment",
con = "x1 + x2 + x3",
delta = 1,
R2max = R2max,          # same computed R-max
type = "lm",
data = df
)
Requiresrobomit

Interactive: Adjusting Confounding Strength

Interactive Simulation

Sensitivity Analysis Explorer

Adjust the strength of an unobserved confounder — how strongly it predicts treatment (partial R-squared with D) and how strongly it predicts the outcome (partial R-squared with Y) — and watch how the bias-adjusted estimate changes. When the confounder is weak, the estimate barely moves. As it strengthens, the estimate can flip sign.

0.000.100.200.300.400.50Confounder-Treatment Partial R-squared-0.200.020.250.470.70Adjusted EstimateAdjusted: 0.425Original EstimateBias-Adjusted
00.5
00.5
02
0.050.5

How to Report Sensitivity Analysis

A good sensitivity analysis section includes:

  1. The controlled estimate and its standard error.
  2. The robustness value (Cinelli & Hazlett) or delta (Oster) — stated clearly in words: "A confounder would need to explain X% of the residual variation in both treatment and outcome to reduce the estimate to zero."
  3. Benchmarking against observed covariates: "The strongest observed covariate explains Y% of residual variation; a confounder would need to be Z times as strong."
  4. A contour plot or table showing sensitivity across a range of assumptions.
  5. Bias-adjusted estimates for key scenarios (δ=1\delta = 1, Rmax=1.3R~R_{\max} = 1.3\tilde{R} for Oster; benchmark multiples for Cinelli & Hazlett).

Here is an example of how to write this up:

We assess robustness to omitted variable bias using the partial R-squared framework of Cinelli and Hazlett (2020). The robustness value for our main estimate is 0.12, meaning that an unobserved confounder would need to explain at least 12% of the residual variance in both treatment assignment and the outcome to reduce the point estimate to zero. For comparison, the strongest observed predictor in our model (household income) explains only 4% of the residual variance in treatment. A confounder would therefore need to be three times as strong as income — a scenario we consider implausible given the institutional setting.


Common Mistakes


Concept Check

Concept Check

You run a regression of wages on a job training dummy, controlling for education and experience. The coefficient on training is 0.15 (SE = 0.05). You compute a robustness value (RV) of 0.08 using the Cinelli & Hazlett framework. Education has a partial R-squared of 0.10 with both treatment and outcome. Should you be worried about omitted variable bias?


Paper Library

Foundational (4)

Rosenbaum, P. R. (2002). Observational Studies.

Rosenbaum's comprehensive textbook developed the theory and practice of sensitivity analysis for observational studies. He introduced the sensitivity parameter Gamma, which quantifies how much hidden bias from an unmeasured confounder would be needed to change the qualitative conclusions of a study.

Cinelli, C., & Hazlett, C. (2020). Making Sense of Sensitivity: Extending Omitted Variable Bias.

Journal of the Royal Statistical Society: Series BDOI: 10.1111/rssb.12348

Cinelli and Hazlett developed a modern framework for sensitivity analysis based on partial R-squared measures, extending the omitted variable bias formula. Their approach allows researchers to benchmark the strength of hypothetical confounders against observed covariates, making sensitivity analysis more interpretable.

Oster, E. (2019). Unobservable Selection and Coefficient Stability: Theory and Evidence.

Journal of Business & Economic StatisticsDOI: 10.1080/07350015.2016.1227711

Oster extended the Altonji, Elder, and Taber approach to assess the robustness of regression estimates to omitted variable bias. She proposed a bounding method based on the proportional selection assumption and coefficient stability across specifications, now widely used in applied economics.

Altonji, J. G., Elder, T. E., & Taber, C. R. (2005). Selection on Observed and Unobserved Variables: Assessing the Effectiveness of Catholic Schools.

Journal of Political EconomyDOI: 10.1086/426036

Altonji, Elder, and Taber developed the idea that if selection on observables is informative about selection on unobservables, one can bound the bias from omitted variables. Their approach became the basis for the widely used Oster (2019) sensitivity framework.

Application (6)

VanderWeele, T. J., & Ding, P. (2017). Sensitivity Analysis in Observational Research: Introducing the E-Value.

Annals of Internal MedicineDOI: 10.7326/M16-2607

VanderWeele and Ding introduced the E-value, a simple and intuitive measure of the minimum strength of association that an unmeasured confounder would need to have with both the treatment and outcome to fully explain away an observed treatment-outcome association. The E-value has been widely adopted in epidemiology and social science.

Frank, K. A. (2000). Impact of a Confounding Variable on a Regression Coefficient.

Sociological Methods & ResearchDOI: 10.1177/0049124100029002001

Frank developed the impact threshold for a confounding variable (ITCV), which calculates how much bias an omitted variable would need to introduce to invalidate an inference. This approach has been widely adopted in education and management research.

Busenbark, J. R., Yoon, H., Gamache, D. L., & Withers, M. C. (2022). Omitted Variable Bias: Examining Management Research with the Impact Threshold of a Confounding Variable (ITCV).

Journal of ManagementDOI: 10.1177/01492063211006458

Busenbark and colleagues provided a practical guide to conducting sensitivity analysis in management research using the ITCV framework. They reviewed its application in strategic management and organizational behavior, and demonstrated how to interpret and report results for management audiences.

Cinelli, C., Ferwerda, J., & Hazlett, C. (2022). Sensemakr: Sensitivity Analysis Tools for OLS in R and Stata.

Journal of Statistical SoftwareDOI: 10.18637/jss.v104.i11Replication

Cinelli, Ferwerda, and Hazlett developed the sensemakr R and Stata package implementing their partial R-squared sensitivity analysis framework. They demonstrate the tool with applications to studies of violence and political attitudes, showing how researchers can benchmark potential confounders against observed covariates to assess the robustness of causal claims from observational data.

Cinelli, C., & Hazlett, C. (2022). An Omitted Variable Bias Framework for Sensitivity Analysis of Instrumental Variables.

Working Paper

Cinelli and Hazlett extended their OLS sensitivity framework to instrumental variables settings, showing how to assess the robustness of IV estimates to violations of the exclusion restriction. They derived bounds on IV bias as a function of the partial R-squared of a hypothetical confounder with both the instrument and the outcome, providing practical tools for benchmarking the plausibility of IV assumptions.

Masten, M. A., & Poirier, A. (2021). Salvaging Falsified Instrumental Variable Models.

Working Paper

Masten and Poirier developed methods for recovering useful causal conclusions from instrumental variable models that fail overidentification tests. Rather than discarding a falsified model entirely, they showed how to construct bounds on the causal parameter that remain valid under weaker assumptions, providing a structured approach to sensitivity analysis when standard IV assumptions are violated.