StatsOtter Causal inference workflows
11
Workflow·3 steps

Sensitivity analysis & the E-value (Ding & VanderWeele)

Summary by StatsOtter

Reports how strong an unmeasured confounder would have to be, on the risk-ratio scale, to fully explain away an observed association.

1

Input · what goes in

A point estimate (risk ratio, or converted OR/HR/standardized mean difference) and its confidence interval.

Show data format & exampleHide example
 estimate | type | lo   | hi
     3.90 | RR   | 1.80 | 8.50
     0.80 | RR   | 0.55 | 1.15
2

Pipeline · the recipe

↑ Click any step in the diagram to read its logic, code, assumptions & discussion.

1
Data prep

Record the observed risk ratio and its confidence interval

Data preparation — shapes the raw inputs into what the estimator expects.

What happens here

Start from a reported RR with its 95% confidence limits.

Reads from the input data Feeds into #2
Key code
# Install:  install.packages("EValue")
library(EValue)
RR  <- 1.5
lo  <- 1.2
hi  <- 1.9

Reference / docs ↗

Discussion on this step (0)
  • No comments on this step yet — be the first.
2
Robustness check

Compute the E-value for the estimate and CI

A robustness check — does the headline result survive a different lens?

What happens here

evalues.RR returns the minimum confounder association needed to explain away the RR and its CI limit.

Formula
E = \mathrm{RR} + \sqrt{\mathrm{RR}\,(\mathrm{RR} - 1)}
Reads from #1 Feeds into #3
Key code
ev <- evalues.RR(est = RR, lo = lo, hi = hi)
ev

Reference / docs ↗

Discussion on this step (0)
  • No comments on this step yet — be the first.
3
Reporting

Interpret the E-values

Reporting — turn the numbers into a figure or table a reader can act on.

What happens here

Read the point E-value and the CI-limit E-value to gauge robustness to unmeasured confounding.

Reads from #2 Feeds into the final output
Key code
cat("E-value (point):", round(ev["E-values", "point"], 3), "\n")
cat("E-value (CI):   ", round(ev["E-values", "lower"], 3), "\n")

Reference / docs ↗

Discussion on this step (0)
  • No comments on this step yet — be the first.
3

Output · what you get

Confounding strength (risk-ratio scale) needed to explain away RR = 1.5 — the E-value is 2.37.
Fig 1Confounding strength (risk-ratio scale) needed to explain away RR = 1.5 — the E-value is 2.37.

Result figure rendered by StatsOtter from the package's documented example — unofficial community showcase; all credit to the original authors.

Result · the numbers

\text{E-value}=\mathrm{RR}+\sqrt{\mathrm{RR}\,(\mathrm{RR}-1)}

⚠️ Unofficial community showcase of EValue (docs). Not affiliated with the authors — all credit to Peng Ding & coauthors; this summarizes public documentation.

The E-value, from Ding & VanderWeele's assumption-free sensitivity analysis, quantifies robustness to unmeasured confounding without modeling the confounder. Given an observed risk ratio RR (adjusted for measured covariates), the bounding factor implies that a confounder associated with both treatment and outcome by risk ratios RR_EU and RR_UD can explain the result only if both exceed a threshold. The E-value is the smallest such mutual association strength: E = RR + sqrt(RR x (RR - 1)) (using max(RR, 1/RR)). A separate E-value bounds what is needed to shift the confidence interval to the null. Larger E-values mean an observed effect is more robust. The result is sharp and requires no assumptions on the confounder's distribution or its interactions—only that associations are on the risk-ratio scale (other effect measures are first converted to an approximate RR).

What you get — An E-value for the point estimate and an E-value for the CI limit nearest the null.

Example output

> evalues.RR(est = 1.5, lo = 1.2, hi = 1.9)
          point    lower hi
RR     1.500000 1.200000 NA
E-values 2.366432 1.689898 NA

Links: package · paper

Discussion (0)

  • No comments yet — start the conversation.