UCA component pilot

Contents

Unified Covariate Adjustment (UCA) constructs an estimator from a verified graph expression. This pilot compares nested Outcome regression (OM/UCA plug-in), inverse probability weighting (IPW/UCA terminal transport), and augmented inverse probability weighting (AIPW/UCA full score). They use the same fitted chain, source observations and held-out units. On front-door and multi-stage graphs these are generalized UCA components.

The target in every comparison is the interventional mean of the binary outcome when all listed action nodes are set to one. Outcome is score.plugin; IPW is the mean of score.terminal_weight_scores; AIPW is the mean of score.scores. The final transport weight already accounts for the cumulative prefix; stage weights are not multiplied together.

The Fixed-partition Multilinearity Criterion (FMC) and Multilinearity Criterion (MC) certify the expressions. BD has a measured common cause, SBD is a two-action sequential graph, FD has a mediator with hidden action–outcome confounding, and MC-only requires the MC search after FMC rejection. Full edges and mechanisms are in the raw JSON.

Runtime is shared-fit profiling, not independent end-to-end method runtime. Outcome requires the backward-regression phase; IPW requires the weight phase; AIPW requires both. Joint evaluation computes all paired components and is reported once. Data generation and graph identification are separate.

Configuration: n=1200, paired seeds=[0, 1, 2, 3, 4], XGBoost rounds=30, nthread=1. Truth is exact binary-SCM enumeration under all listed actions set to one. This is a small pilot, not a statistical superiority test.

One process-wide BD warm-up (data seed 999, split seed 999) is excluded from all recorded results. Graphs run in the listed order in that warmed process. Median times across five seeds remain machine/session measurements.

Runtime: Python 3.11.14; macOS-15.6.1-arm64-arm-64bit; package 0.1.0a11. Source baseline: 106c3487c63833fe29bf4f395bf01494510b525a, plus the local cleanup identified by the installed module/script hashes in JSON. Version alone does not pin those bytes.

Accuracy

Graph Outcome RMSE IPW RMSE AIPW RMSE
BD 0.04853 0.02789 0.02428
SBD 0.04502 0.02397 0.03346
FD 0.03714 0.04220 0.01947
MC-only 0.07516 0.06396 0.04206

Bias/MAE details use successful trials; failure counts retain the full attempted denominator.

Graph Method Bias RMSE MAE Failures
BD Outcome -0.00788 0.04853 0.04353 0/5
BD IPW -0.01229 0.02789 0.02629 0/5
BD AIPW -0.00748 0.02428 0.01854 0/5
SBD Outcome -0.02095 0.04502 0.03603 0/5
SBD IPW 0.01360 0.02397 0.02049 0/5
SBD AIPW -0.02394 0.03346 0.02394 0/5
FD Outcome -0.02980 0.03714 0.02980 0/5
FD IPW 0.02358 0.04220 0.02722 0/5
FD AIPW 0.01452 0.01947 0.01452 0/5
MC-only Outcome -0.00189 0.07516 0.06423 0/5
MC-only IPW 0.01520 0.06396 0.06029 0/5
MC-only AIPW 0.01897 0.04206 0.03804 0/5

Median seconds; shared-fit profiling:

Graph ID once Generate Weight fit Regression fit Joint evaluation
BD 0.0017 0.0003 0.0002 0.0271 0.1784
SBD 0.0032 0.0006 0.0004 0.0352 0.2437
FD 0.0031 0.0005 0.0003 0.0521 0.3800
MC-only 0.0082 0.0008 0.0007 0.0617 0.5345

Graph and split scope

Graph Graph criterion Stages Rows per stage fit Held-out rows Exact mean
BD FMC 2 240 480 0.506880
SBD FMC 2 240 480 0.490578
FD FMC 3 171 513 0.366866
MC-only MC after FMC rejection 4 133 532 0.496036

Mechanisms, paired splits, versions, source hashes and individual estimates are in the raw JSON. The shared split gives multi-stage graphs smaller per-stage training blocks. No tuning, causal interval coverage or out-of-graph generalization is established. Latent values and true mechanisms are used only for simulation/truth, never nuisance learning.

Reproduce

Install this local cleanup revision with a regular installation first. This run used the existing dependency runtime; it did not resolve fresh dependencies or change a project environment. The package version remains 0.1.0a11, so use the raw JSON’s source hashes to distinguish it from the earlier published a11. From the checkout, run:

python -B tutorials/benchmark_uca.py --n 1200 --seeds 5 --rounds 30 \
  --source-revision 106c3487c63833fe29bf4f395bf01494510b525a \
  --output /tmp/uca-pilot.json --report /tmp/uca-pilot.md

--seeds 5 selects seeds 0 through 4. Each graph’s SCM mechanisms stay fixed; only observation/split seeds vary. Identification runs once per graph, outside the repeated fit timings. A process-wide warm-up precedes measured fits. The final timing run was sequential, with this task’s test processes stopped. Other workloads on the machine were not controlled. Data generation, identification, and source setup overhead are not part of the nuisance-phase subtotals.

Checks and interpretation

All 20 fitted chains succeeded, yielding 60 paired component estimates; there were 0 balance failures. Bias and RMSE aggregate the same five fixed-SCM trials for each method. Warm-up changed none of the 20 per-seed estimate triples. Within this pilot, AIPW had the lowest RMSE in BD, FD and MC-only, while IPW had the lowest RMSE in SBD. Five seeds and one mechanism per graph do not establish a generally superior estimator.

The measured joint evaluation phase exceeded the regression-fit phase in this run. The current evaluator calls fitted predictors per history; this report records that observation without changing evaluation or introducing batching. An independently optimized Outcome/IPW implementation may have different end-to-end runtime; this pilot profiles reuse of the same learned UCA chain.

The cleanup extracted private backward-fit and evaluation-unit helpers and added paired terminal scores and phase diagnostics. It preserved default graph dispatch, XGBoost, source splits, RNG draw order and minimum-L2 weights.

Regression check Run / passed / skipped
Paired component/RNG tests 3 / 3 / 0
UCA defaults 5 / 5 / 0
Minimum-L2 weighting 7 / 7 / 0
Installed public API 8 / 8 / 0
Bundled CommonEngine tests 19 / 19 / 0
Bundled front-door adapters 3 / 3 / 0

The installed-package checks total 23, and separate source-engine checks total 22, for 45 distinct tests passed, 0 skipped. Before/after fixed-seed BD and FD score arrays, baseline arrays, source IDs and split fingerprints were bitwise identical. Package builds and raw-source provenance were also checked.