(Follow-up from the LinkedIn thread on the 0.3.0 announcement.)
_select_adjustment_set in pathmc/adjustment.py currently does the right conservative thing: it derives minimal backdoor sets from the DAG, auto-selects when exactly one exists, and raises when several do, asking the user to pass adjustment_set= explicitly rather than choosing silently. The chosen set is also surfaced via the adjustment_set property and stamped into result attrs, which is exactly what a reader of the output needs.
The gap is that when the error fires, the user is asked to choose among valid sets with no guidance, and minimality is the wrong criterion to choose by. Minimality is an identification property. Among valid sets, the choice moves the variance of the regression-adjustment estimator, and Henckel, Perković and Maathuis (JRSS-B 2022, "Graphical criteria for efficient total effect estimation via adjustment in causal linear models") show there is a unique optimal adjustment set, the O-set: informally, the parents of the nodes on proper causal paths from treatment to outcome, minus the forbidden nodes and the treatment itself. It is valid whenever any valid adjustment set exists (for amenable graphs), it is generally not a minimal set, and it minimizes asymptotic variance. Rotnitzky and Smucler (JMLR 2020) extend the variance ordering beyond the linear case.
Proposal, in increasing order of ambition:
- Add
optimal_adjustment_set(graph_info, treatment, outcome) to pathmc.identify alongside adjustment_sets.
- Accept a sentinel in the constructor, e.g.
adjustment_set="optimal", so the current default behavior (auto-select the unique minimal set, raise on ties) is untouched and the O-set is opt-in.
- Point the several-minimal-sets error message at the option, since the O-set resolves the tie deterministically.
One caveat worth carrying into the docs rather than treating as a blocker: the optimality results are proved for linear models and specific estimator classes, so for the Bayesian GLM families the argument is asymptotic-heuristic. Happy to discuss scope; the smallest useful version is (1) plus a sentence in the 16-scm-vs-adjustment user guide page distinguishing minimal from efficient sets.
(Follow-up from the LinkedIn thread on the 0.3.0 announcement.)
_select_adjustment_setinpathmc/adjustment.pycurrently does the right conservative thing: it derives minimal backdoor sets from the DAG, auto-selects when exactly one exists, and raises when several do, asking the user to passadjustment_set=explicitly rather than choosing silently. The chosen set is also surfaced via theadjustment_setproperty and stamped into resultattrs, which is exactly what a reader of the output needs.The gap is that when the error fires, the user is asked to choose among valid sets with no guidance, and minimality is the wrong criterion to choose by. Minimality is an identification property. Among valid sets, the choice moves the variance of the regression-adjustment estimator, and Henckel, Perković and Maathuis (JRSS-B 2022, "Graphical criteria for efficient total effect estimation via adjustment in causal linear models") show there is a unique optimal adjustment set, the O-set: informally, the parents of the nodes on proper causal paths from treatment to outcome, minus the forbidden nodes and the treatment itself. It is valid whenever any valid adjustment set exists (for amenable graphs), it is generally not a minimal set, and it minimizes asymptotic variance. Rotnitzky and Smucler (JMLR 2020) extend the variance ordering beyond the linear case.
Proposal, in increasing order of ambition:
optimal_adjustment_set(graph_info, treatment, outcome)topathmc.identifyalongsideadjustment_sets.adjustment_set="optimal", so the current default behavior (auto-select the unique minimal set, raise on ties) is untouched and the O-set is opt-in.One caveat worth carrying into the docs rather than treating as a blocker: the optimality results are proved for linear models and specific estimator classes, so for the Bayesian GLM families the argument is asymptotic-heuristic. Happy to discuss scope; the smallest useful version is (1) plus a sentence in the
16-scm-vs-adjustmentuser guide page distinguishing minimal from efficient sets.