Skip to content

Design choices

Each default below was chosen on the basis of a derivation, a test or a benchmark. GraphDML(mode="original") switches all of them to the procedure of the original method, which is useful for comparisons and replication.

Choice Default Original procedure Why Evidence
Focal set nodes with disjoint dependency sets (pairwise distance ≥ 3 for one-hop exposure; generalises to any exposure and to directed graphs) same rule, one-hop exposure only scores are independent exactly when their noise sets do not overlap tests/test_focal.py
Focal-set order lowest degree first random larger focal set, so smaller standard errors test_min_degree_strategy_finds_larger_sets_on_average
Nuisance training data every node independent of the held-out scores ("buffered") focal nodes of the other folds several times more data, and no covariate shift between focal nodes and the neighbors the treatment model predicts for focal-only training: direct effect +10% biased with coverage 0.80 on referral_app, peer coverage down to 0.72 with partialling-out; buffered: 0.93–0.99 (results)
Score IV-type partialling-out partialling-out is attenuated when the treatment model is wrong; IV-type is consistent if either the treatment model or g is right methodology §4, tests/test_robustness.py; lower RMSE in 7 of 8 benchmark cells (up to 3×)
Fold aggregation pooled moment (DML2) average of fold estimates (DML1) more stable with small folds
Folds 5 3 more training data per fold
Features own covariates + one- and two-hop neighbor aggregates own + summed one-hop neighbor covariates E[Y | X, A] depends on two-hop covariates (methodology §3) no measurable difference in benchmarks; never worse
Nuisance learners regularised histogram gradient boosting graph neural network over-fit propensities add noise that biases partialling-out toward zero flu_town, 12 seeds: library-default boosting 13% attenuation, regularised 8%, regularised + IV-type 1%
Variance sandwich (HC0-equivalent for partialling-out); optional cluster-robust sandwich matches statsmodels and DoubleML exactly; coverage gate