Skip to content

Reliability and Evaluation Research · Jul 2026

causal-inference-engine: Effect Estimation That Can Decline

On the benchmark that matters most, the useful output was no number at all

Source

The problem

Correlation dashboards get read as causal claims.

Approach

Causal discovery classifies every covariate as confounder, mediator or collider and drops the dangerous ones automatically, in plain English, before anything is estimated. Five estimators are compared side by side — propensity score matching, IPW, T/S/X-learner, difference-in-differences and instrumental variables — and graded on synthetic data with a planted true effect, where 10 of 10 rows behaved as expected. Refusal is structural rather than decorative: the interface withholds results until the assumptions page is opened, and the PDF leads with the verdict rather than appending it.

How it works

Key decisions

Make refusal structural, not decorative
Caveats get skipped. Instead the interface withholds the effect size until the assumptions page is opened, and the PDF leads with the verdict rather than appending it, because a number seen first is remembered regardless of what follows.
Grade against planted truth
On real data nobody knows the true effect, which is why you are estimating it. So the engine is validated on synthetic data with the answer built in: 10 of 10 rows behaved as expected, including one designed to fail.
Publish the row where the methods miss
A realistic row with a noisy proxy confounder and another missing entirely lands at 0.83 to 1.07 against a true 0.15, with intervals that confidently exclude the truth. Publishing only the clean rows would misrepresent what these methods deliver.

Interface

The results page withholding effect sizes until assumptions have been reviewed
Refusal is structural rather than a footnote. Open Results before the assumptions page and there is deliberately nothing to read.

What the measurements showed

What broke

Running it

python -m validation.ground_truth

Full setup, configuration and API reference are in the repository README.

Stack

Written up in