When observational data are used to answer an intervention question, backdoor identification separates causal reasoning from statistical estimation. It derives an estimand whose value can be computed from the observed joint distribution, provided the causal assumptions hold. section 10.2.3 section 10.3
The adjustment set contains variables that block every noncausal backdoor path between treatment and outcome. For treatment E, outcome I, and common cause G, the intervention query can become the backdoor estimand ∑g P(I = i | E = “high”, G = g)P(G = g), replacing an intervention-level quantity with an operation on P(E, I, G). section 10.3
A practical workflow treats identification and estimation as distinct:
- Represent treatment, outcome, and candidate confounders in a DAG, then determine whether the proposed adjustment set identifies the causal query. section 10.3
- Estimate the identified quantity with statistical or machine-learning methods; double machine learning models the outcome and treatment from the adjustment set before a final causal-effect stage. section 11.4.3
- Check sensitivity to omitted confounders, because an unblocked major confounder can create, reverse, or substantially distort an estimated average treatment effect. section 11.5.5
Gaming intervention
Suppose high engagement and in-game purchases share the observed cause guild membership. Adjusting for guild membership yields an estimand for the effect of high engagement when the adjustment set blocks the relevant backdoor path. If the common cause is unobserved, full identification may fail; randomized assignment can instead provide partial-identification bounds. section 10.3 section 10.9
Listing 11.10 Double ML with DoWhy, EconML, and sklearn
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LassoCV
from sklearn.ensemble import GradientBoostingRegressor
featurizer = PolynomialFeatures(degree=1, include_bias=False)
gb_estimate = model.estimate_effect(
identified_estimand,
method_name = "backdoor.econml.dml.DML", #1
control_value = 0,
treatment_value = 1,
method_params={
"init_params":{
'model_y': GradientBoostingRegressor(), #2
'model_t': GradientBoostingRegressor(), #3
'model_final': LassoCV(fit_intercept=False), #4
'featurizer': featurizer
},
"fit_params":{}
}
)
print(gb_estimate)
Inspect a DoWhy and EconML double-machine-learning implementation using gradient boosting, LassoCV, and a final effect model. section 11.4.3
Listing 11.19 Adding an unobserved confounder
identified_estimand.set_identifier_method("backdoor")
res_unobserved = model.refute_estimate( #1
identified_estimand, #1
causal_estimate_fd, #1
method_name="add_unobserved_common_cause" #1
)
print(res_unobserved)
Inspect a DoWhy refutation that adds an unobserved common cause and evaluates how the estimated effect changes. section 11.5.5
