Causal inference on a learned embedding · anchored series · the paper's tasks and two ADME data sets
Causal-Chemprop1 fits a structural causal model to the last hidden layer of a trained Chemprop2 and, given one measured member of a scaffold series, predicts the rest of the series as counterfactuals of it. Its paper reports better within-series ranking than Chemprop on eleven kinase scaffold groups. With the authors' released checkpoints that reproduces: Table 1 to two decimals in 65 of 66 values, ahead of their Chemprop on 9 of 11 tasks. It does not survive retraining. Refit end to end with the authors' own code, it loses within-task Spearman ρ on 10 of 11 tasks, by a median 0.61. And fitted per fold and per series on ExpansionRx and Biogen, its within-series ρ is behind that of its own encoder on 152 of 182 series on ExpansionRx and 20 of 22 series on Biogen, and behind Monroe + TabPFN 35, 6 on 159 of 182 on ExpansionRx and 22 of 22 on Biogen.
A Chemprop is trained on the target. Its 200-unit last hidden layer and the target are taken as the 201 variables of a linear structural causal model: DAGMA3 learns the graph from an analog set, the training molecules whose Murcko scaffold resembles the series', and dowhy's GCM4 fits a mechanism to every node and scores each node's intrinsic causal contribution to the target. To predict a molecule of the series, the noise of the measured anchor is abducted, the molecule's own values are imposed on the high-contribution nodes, and the target is read off the counterfactual. Two rules of the authors' test_counterfactual can replace that with the SCM's plain prediction: per molecule, when the counterfactual is far from the anchor, and per series, when the counterfactuals barely vary.
Nothing in the model is reimplemented. The encoder is the authors' SobolevMPNN, trained with the architecture and schedule of their causal_utils.train; the SCM is their fit_causal, with their vendored dowhy and DAGMA; inference is their test_counterfactual, with only the file reading replaced. Where the release hard-codes hyperparameters per task and the eleven tasks disagree, the majority value is used. On ExpansionRx and Biogen a series is a held-out test cluster with at least seven measured molecules for the endpoint; one seeded-random member is its anchor, given to every arm that can use it; the rest are scored. The analog set is the fold's training molecules within the paper's scaffold similarity of the anchor, and a series is kept only if it has at least 90 analogs in every fold, the size below which the paper calls the SCM under-determined.
Every unanchored arm also appears with the cheapest use of the anchor there is: shift its predictions for the series by its own error on the anchor, the paper's “direct residual correction”. A shift cannot change a ranking, so it matters for MAE, not for within-series ρ. Monroe + TabPFN 3 is also run with every anchor in its in-context training set (+ctx), the way an in-context model takes new data.
Causal-Chemprop is fitted once per series per fold, so it is run on the 5 folds of the first repeat, not all 25; every arm is compared on those folds alone. LightGBM, CheMeleon and Monroe come from the foundation-model comparison, fine-tuned Atom-JEPA7 from the Atom-JEPA study, unchanged.
The release ships the eleven ABL1, AURKA and SRC tasks with their anchors, the trained encoders and the fitted SCMs. Run through the authors' own functions they give Table 1 to two decimals in 65 of 66 values; the exception is chemprop retrained on ABL1_2, ρ −0.08 against a printed 0.08, which looks like a dropped minus sign. The other arms are fitted here on the same training sets and anchors; +anchor adds the anchor to the training data. The table is within-task Spearman ρ, the paper's metric; the bottom row is how many tasks the released Causal-Chemprop is ahead and behind, and a Wilcoxon signed-rank test over the tasks.
| Task | Causal-Chemprop, released | SCM refit | encoder + SCM refit | Chemprop, released | Chemprop retrained, released | LightGBM +anchor | Monroe/PFN3 | Monroe/PFN3 +anchor | Atom-JEPA FT |
|---|---|---|---|---|---|---|---|---|---|
| ABL1_0 | 0.76 | 0.76 | 0.28 | 0.71 | 0.55 | 0.61 | 0.48 | 0.62 | 0.47 |
| ABL1_1 | 0.16 | 0.16 | 0.08 | −0.29 | −0.33 | 0.15 | 0.18 | 0.10 | 0.37 |
| ABL1_2 | 0.38 | 0.38 | −0.23 | 0.20 | −0.08 | 0.05 | −0.35 | −0.18 | −0.04 |
| ABL1_3 | 0.77 | 0.77 | −0.55 | 0.64 | 0.80 | 0.89 | 0.82 | 0.82 | 0.69 |
| AURKA_0 | 0.54 | 0.54 | −0.11 | 0.40 | 0.53 | 0.23 | 0.46 | 0.48 | 0.17 |
| AURKA_1 | 0.90 | 0.88 | 0.29 | 0.86 | 0.31 | 1.00 | 0.88 | 0.88 | 0.64 |
| AURKA_2 | −0.22 | −0.22 | −0.22 | 0.36 | −0.22 | −0.23 | 0.52 | 0.70 | 0.02 |
| AURKA_3 | 0.75 | 0.67 | 0.26 | 0.48 | 0.46 | 0.57 | 0.47 | 0.45 | 0.39 |
| SRC_0 | 0.42 | 0.42 | −0.62 | 0.50 | 0.45 | 0.43 | 0.30 | 0.34 | 0.63 |
| SRC_1 | 0.77 | 0.61 | −0.09 | −0.46 | 0.67 | 0.84 | 0.36 | 0.04 | 0.79 |
| SRC_2 | 0.41 | 0.01 | −0.20 | −0.08 | 0.17 | −0.19 | 0.10 | −0.01 | 0.30 |
| released ahead | 4–0p = 0.07 | 10–0p = 0.005 | 9–2p = 0.08 | 8–2p = 0.02 | 7–4p = 0.17 | 8–3p = 0.12 | 9–2p = 0.08 | 7–4p = 0.15 |
Against the arms the paper ran, the released model holds up: ahead of its Chemprop on 9 of 11 tasks and of the retrained Chemprop on 8. Against arms it did not run the margin is similar in count and weaker in evidence: ahead of Monroe + TabPFN 3 on 8 (p = 0.12), of Monroe with the anchor on 9 (p = 0.08) and of fine-tuned Atom-JEPA on 7 (p = 0.15). With 7 to 22 molecules per task, few of these tests could be significant either way.
The released numbers come from one trained encoder and one fitted SCM per task. Two refits, both through the authors' train, separate them. Refitting only the SCM on the released encoder (SCM refit) keeps most of the result: the released model is ahead of it on 4 and behind on none of 11 tasks. Retraining the encoder as well (encoder + SCM refit) does not: within-task ρ falls on 10 of 11 tasks, by a median 0.61, and the refit model is behind the released Chemprop on 9 of 11. Mean ρ over the 11 tasks is 0.51 released and −0.10 refit. The authors' training is seeded and set deterministic, but it does not regenerate their checkpoints here, and a new encoder is a new embedding: the SCM, the contributing nodes and the counterfactuals all change with it. The result in Table 1 belongs to those particular checkpoints.
On 8 ExpansionRx endpoints9 there are 182 series with enough analogs, and on 4 Biogen endpoints10 22. Each series is scored separately in each fold, and the table below counts series, with each series' ρ averaged over its folds: the comparison on the paper's own terms.
| Causal-Chemprop against | ExpansionRx, 182 series | Biogen ADME, 22 series | ||||||
|---|---|---|---|---|---|---|---|---|
| ahead | behind | median Δρ | Wilcoxon | ahead | behind | median Δρ | Wilcoxon | |
| Chemprop, Causal-Chemprop's own encoder | 29 | 152 | −0.17 | p < 0.001 | 2 | 20 | −0.39 | p < 0.001 |
| Monroe + TabPFN 3 | 22 | 159 | −0.28 | p < 0.001 | 0 | 22 | −0.45 | p < 0.001 |
| Monroe + TabPFN 3, anchors in context | 20 | 162 | −0.28 | p < 0.001 | 0 | 22 | −0.46 | p < 0.001 |
| Atom-JEPA fine-tuned | 16 | 165 | −0.32 | p < 0.001 | 1 | 21 | −0.44 | p < 0.001 |
| ChemProp + CheMeleon | 28 | 153 | −0.26 | p < 0.001 | 1 | 21 | −0.54 | p < 0.001 |
| LightGBM + Morgan | 50 | 132 | −0.16 | p < 0.001 | 3 | 19 | −0.28 | p < 0.001 |
Causal-Chemprop is behind its own encoder on 152 of 182 ExpansionRx series and 20 of 22 Biogen series. The other ranking arms are further ahead of it, Monroe + TabPFN 3 most of all; giving Monroe the anchors in context changes its ρ by +0.009 on ExpansionRx and +0.002 on Biogen on average.
The protocol's view, per endpoint, the mean within-series ρ of a fold as the metric. A method is on top if Tukey's correction cannot separate it from the best mean. With 5 folds the intervals are wide, and still Causal-Chemprop is on top of 0 of 8 ExpansionRx endpoints and 1 of 4 Biogen endpoints.
| Endpoint | LightGBM +off | CheMeleon FT +off | Atom-JEPA FT +off | Monroe/PFN3 | Monroe/PFN3 +ctx | Chemprop | Causal-Chemprop |
|---|---|---|---|---|---|---|---|
| LogD | 0.67±0.02 | 0.80±0.01tied | 0.86±0.01tied | 0.80±0.01tied | 0.81±0.01tied | 0.83±0.01tied | 0.26±0.08 |
| LogS | 0.43±0.03 | 0.51±0.03tied | 0.53±0.02tied | 0.55±0.02tied | 0.53±0.02tied | 0.46±0.02 | 0.32±0.04 |
| LOG_HLM | 0.33±0.02 | 0.49±0.03 | 0.61±0.04tied | 0.51±0.05tied | 0.54±0.04tied | 0.47±0.03 | 0.27±0.11 |
| LOG_MLM | 0.37±0.04 | 0.43±0.02 | 0.52±0.02tied | 0.46±0.03tied | 0.49±0.02tied | 0.37±0.05 | 0.26±0.08 |
| LOG_Caco_AB | 0.47±0.03 | 0.53±0.03 | 0.66±0.02tied | 0.64±0.02tied | 0.63±0.01tied | 0.49±0.03 | 0.30±0.10 |
| LOG_Caco_Efflux | 0.40±0.03tied | 0.42±0.03tied | 0.44±0.02tied | 0.45±0.01tied | 0.48±0.02tied | 0.36±0.03 | 0.12±0.12 |
| LOG_MPPB | 0.49±0.02 | 0.75±0.06tied | 0.74±0.03tied | 0.68±0.03tied | 0.67±0.02tied | 0.65±0.05tied | 0.55±0.12 |
| LOG_MBPB | 0.60±0.05 | 0.73±0.03tied | 0.81±0.04tied | 0.62±0.02 | 0.63±0.03 | 0.71±0.01tied | 0.54±0.13 |
| Endpoint | LightGBM +off | CheMeleon FT +off | Atom-JEPA FT +off | Monroe/PFN3 | Monroe/PFN3 +ctx | Chemprop | Causal-Chemprop |
|---|---|---|---|---|---|---|---|
| LOG_SOL | 0.17±0.28tied | 0.57±0.08tied | 0.45±0.13tied | 0.52±0.07tied | 0.52±0.07tied | 0.53±0.23tied | 0.35±0.51tied |
| LOG_HLM | 0.64±0.04tied | 0.73±0.04tied | 0.76±0.03tied | 0.70±0.02tied | 0.70±0.02tied | 0.70±0.04tied | 0.23±0.17 |
| LOG_RLM | 0.55±0.01tied | 0.70±0.07tied | 0.73±0.05tied | 0.73±0.05tied | 0.74±0.04tied | 0.69±0.04tied | 0.26±0.29 |
| LOG_MDR1_ER | 0.57±0.05tied | 0.64±0.04tied | 0.68±0.05tied | 0.71±0.02tied | 0.71±0.02tied | 0.62±0.06tied | 0.06±0.32 |
The fit diagnostics say which of the authors' rules produced each series' predictions. When the SCM's plain prediction is used, for every molecule or through the low-variance fallback, Causal-Chemprop ranks about as well as the encoder underneath it. When every molecule gets the counterfactual, the ranking is close to random: ρ −0.02 against the encoder's 0.65 on ExpansionRx and 0.12 against the encoder's 0.69 on Biogen on the same series. The counterfactual pulls every member of a series towards the anchor and does not keep their order. No node clears the paper's contribution threshold in 47% of ExpansionRx fits and 1% of Biogen fits; there the authors' fallback chooses the nodes.
| How the series was predicted | ExpansionRx | Biogen ADME | ||||
|---|---|---|---|---|---|---|
| fits | ρ, Causal-Chemprop | ρ, its encoder | fits | ρ, Causal-Chemprop | ρ, its encoder | |
| every molecule the counterfactual | 148 | −0.02 | 0.65 | 62 | 0.12 | 0.69 |
| some counterfactual, some SCM | 507 | 0.29 | 0.59 | 39 | 0.24 | 0.62 |
| every molecule switched to the SCM prediction | 110 | 0.45 | 0.45 | 1 | 0.60 | 0.60 |
| the low-variance fallback: all SCM predictions | 145 | 0.46 | 0.48 | 8 | 0.61 | 0.65 |
One measured analog is a noisy correction. Shifting Monroe + TabPFN 3 by its error on the anchor raises its mean MAE, by 0.051 on ExpansionRx and 0.118 on Biogen: the anchor's own error is part noise and part where it sits in the series, and the shift adds both to every member. Putting the anchors in its context lowers mean MAE instead, by 0.019 on ExpansionRx and 0.004 on Biogen. Causal-Chemprop has a higher mean MAE than its own encoder, shifted or not, on both data sets: its counterfactuals are worse in absolute terms as well as in rank. MAE is in the log units of each endpoint.
| Endpoint | LightGBM +off | CheMeleon FT +off | Atom-JEPA FT +off | Monroe/PFN3 | Monroe/PFN3 +off | Monroe/PFN3 +ctx | Chemprop | Chemprop +off | Causal-Chemprop |
|---|---|---|---|---|---|---|---|---|---|
| LogD | 0.811±0.024 | 0.559±0.014 | 0.438±0.023tied | 0.413±0.007tied | 0.549±0.016 | 0.379±0.007tied | 0.393±0.006tied | 0.512±0.026 | 0.752±0.094 |
| LogS | 0.472±0.011 | 0.388±0.013 | 0.380±0.013 | 0.353±0.009tied | 0.417±0.006 | 0.332±0.006tied | 0.383±0.016 | 0.414±0.013 | 0.452±0.060 |
| LOG_HLM | 0.463±0.031 | 0.401±0.012 | 0.365±0.008 | 0.296±0.009tied | 0.386±0.005 | 0.285±0.007tied | 0.328±0.019tied | 0.408±0.016 | 0.412±0.046 |
| LOG_MLM | 0.469±0.022 | 0.401±0.007 | 0.435±0.013 | 0.340±0.008tied | 0.418±0.008 | 0.327±0.004tied | 0.409±0.031 | 0.435±0.031 | 0.493±0.079 |
| LOG_Caco_AB | 0.242±0.011 | 0.267±0.010 | 0.244±0.005 | 0.235±0.012 | 0.200±0.009tied | 0.198±0.005tied | 0.352±0.012 | 0.261±0.011 | 0.350±0.035 |
| LOG_Caco_Efflux | 0.306±0.015 | 0.282±0.005 | 0.257±0.014tied | 0.285±0.007 | 0.252±0.004tied | 0.244±0.009tied | 0.330±0.006 | 0.303±0.010 | 0.337±0.022 |
| LOG_MPPB | 0.299±0.035tied | 0.233±0.018tied | 0.219±0.007tied | 0.235±0.007tied | 0.310±0.007tied | 0.247±0.005tied | 0.241±0.042tied | 0.333±0.040tied | 0.352±0.163 |
| LOG_MBPB | 0.298±0.030 | 0.197±0.009tied | 0.186±0.017tied | 0.172±0.009tied | 0.205±0.011tied | 0.168±0.010tied | 0.200±0.016tied | 0.216±0.012 | 0.246±0.044 |
| Endpoint | LightGBM +off | CheMeleon FT +off | Atom-JEPA FT +off | Monroe/PFN3 | Monroe/PFN3 +off | Monroe/PFN3 +ctx | Chemprop | Chemprop +off | Causal-Chemprop |
|---|---|---|---|---|---|---|---|---|---|
| LOG_SOL | 0.330±0.087tied | 0.317±0.052tied | 0.268±0.033tied | 0.224±0.021tied | 0.232±0.022tied | 0.224±0.020tied | 0.306±0.061tied | 0.285±0.028tied | 0.652±0.258 |
| LOG_HLM | 0.657±0.027 | 0.579±0.020 | 0.476±0.045 | 0.270±0.012tied | 0.576±0.025 | 0.263±0.013tied | 0.319±0.014tied | 0.704±0.059 | 1.016±0.173 |
| LOG_RLM | 0.574±0.027tied | 0.452±0.048tied | 0.464±0.022tied | 0.336±0.019tied | 0.461±0.004tied | 0.330±0.017tied | 0.392±0.028tied | 0.451±0.048tied | 1.084±0.372 |
| LOG_MDR1_ER | 0.384±0.040tied | 0.302±0.030tied | 0.290±0.030tied | 0.259±0.009tied | 0.290±0.022tied | 0.258±0.009tied | 0.361±0.039tied | 0.426±0.043tied | 0.898±0.308 |
Every series needs its own SCM in every fold, each on one CPU core: DAGMA on the analog set, a mechanism per node, then intrinsic causal contributions by Shapley sampling, which is most of the time. The encoders, one per endpoint and fold, are the cheap part. The fits ran on two machines, a 32-core workstation with an RTX 5070 Ti and a DGX Spark, in 527 CPU-core hours and 5 GPU hours.
| Data set | Series | SCM fits | Median min / fit | Longest fit, h | SCM, CPU-core hours | Encoders, GPU hours |
|---|---|---|---|---|---|---|
| ExpansionRx | 182 | 910 | 5 | 9.5 | 331 | 4.2 |
| Biogen ADME | 22 | 110 | 60 | 8.4 | 196 | 0.8 |
One repeat. Causal-Chemprop is run on the five folds of the first repeat; the other arms have all 25 and are compared on those five. The series-level counts do not depend on the number of folds the way the fold-level tests do, and they are lopsided enough that more folds would not reverse them.
The paper's setting, not its tuning. The SCM hyperparameters are the majority values of the release's per-task settings, fixed for every series. The paper describes one rule; the release tunes per task. A per-series search could do better, but would need held-out series to tune on, which the setting does not have.
Series, not kinases. ADME endpoints of clustered test molecules are not the paper's kinase scaffold groups. The analog rule, the feasibility floor, the anchor and the metric are the paper's; the chemistry and the endpoints are not.
Atom-JEPA on the paper's tasks. The eleven Atom-JEPA fits on the paper's tasks used the authors' Biogen recipe; 4 tasks lost five training molecules each for which no conformer could be generated, and the three SRC tasks were run on the DGX Spark, which has room for them.
Reported the way “Even More Thoughts on ML Method Comparisons” and the protocol paper it points at11 argue comparisons should be: distributions over folds and series, simultaneous confidence intervals, paired tests, and no bolded maxima. Where two methods cannot be separated, both are reported as tied.
Code, per-fold and per-series metrics and every figure: studies/causal-chemprop.