Multi-arm DR-TMLE#
This study exercises the armwise multi-treatment extension implemented by cleverly and R
drtmle 1.1.2 at pinned commit 538a3a2. The two
implementations receive identical samples, one exact five-fold assignment, and the same Python
out-of-fold initial outcome and treatment predictions. That isolates the reduced regressions,
corrections, targeting, and inference from nuisance-fit differences. random_partition draws that
assignment from the row count and the sample’s seed, so it reads neither the arm labels nor the
outcome.
The binary-outcome law reports three arm means and ATE, risk-ratio, and odds-ratio contrasts
against the high reference arm. A separate fit-diagnostics artifact audits empirical scores
and solver status for every replication.
Accuracy against known truth#
law |
estimand |
what was tested |
implementation |
bias (99% interval) |
coverage |
SE ratio |
result |
|---|---|---|---|---|---|---|---|
three-arm binary-outcome law with shared cross-fitted nuisances |
|
difference in counterfactual means, low versus high |
|
-0.0026 to 0.0020 |
0.9550 |
1.0632 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
difference in counterfactual means, low versus high |
R |
-0.0026 to 0.0020 |
0.9550 |
1.0636 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
difference in counterfactual means, medium versus high |
|
-0.0030 to 0.0019 |
0.9537 |
1.0037 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
difference in counterfactual means, medium versus high |
R |
-0.0030 to 0.0018 |
0.9537 |
1.0038 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘high’ |
|
-0.000878 to 0.0027 |
0.9525 |
0.9990 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘high’ |
R |
-0.000876 to 0.0027 |
0.9525 |
0.9989 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘low’ |
|
-0.0011 to 0.0023 |
0.9600 |
1.0413 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘low’ |
R |
-0.0011 to 0.0023 |
0.9600 |
1.0421 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘medium’ |
|
-0.0014 to 0.0020 |
0.9637 |
1.0366 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘medium’ |
R |
-0.0014 to 0.0020 |
0.9637 |
1.0367 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal odds ratio, low versus high, reported on the log scale |
|
-0.0099 to 0.0090 |
0.9550 |
1.0611 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal odds ratio, low versus high, reported on the log scale |
R |
-0.0099 to 0.0090 |
0.9550 |
1.0615 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal odds ratio, medium versus high, reported on the log scale |
|
-0.0111 to 0.0099 |
0.9550 |
1.0032 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal odds ratio, medium versus high, reported on the log scale |
R |
-0.0112 to 0.0099 |
0.9550 |
1.0032 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal risk ratio, low versus high, reported on the log scale |
|
-0.0058 to 0.0048 |
0.9537 |
1.0509 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal risk ratio, low versus high, reported on the log scale |
R |
-0.0058 to 0.0048 |
0.9537 |
1.0512 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal risk ratio, medium versus high, reported on the log scale |
|
-0.0062 to 0.0042 |
0.9525 |
0.9959 |
pass |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal risk ratio, medium versus high, reported on the log scale |
R |
-0.0062 to 0.0042 |
0.9513 |
0.9959 |
pass |
Agreement with the canonical implementation#
Comparator-backed: a paired comparison with drtmle-r-multi-arm on the same samples. Each row reports estimate equivalence within the declared margin, the RMSE ratio and the coverage difference, and names its comparison kind.
law |
estimand |
what was compared |
paired difference |
share of margin used |
RMSE ratio bound |
coverage difference |
comparison kind |
calibration resolution |
result |
|---|---|---|---|---|---|---|---|---|---|
three-arm binary-outcome law with shared cross-fitted nuisances |
|
difference in counterfactual means, low versus high |
0.000004 |
0.0011 |
1.0005 |
0 |
matching implementation |
0.000613 vs 0.0500 |
equivalent |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
difference in counterfactual means, medium versus high |
0.000003 |
0.000783 |
1.0004 |
0 |
matching implementation |
0.000439 vs 0.0500 |
equivalent |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘high’ |
-0.000002 |
0.000684 |
1.0001 |
0 |
matching implementation |
0.000263 vs 0.0500 |
equivalent |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘low’ |
0.000002 |
0.000761 |
1.0010 |
0 |
matching implementation |
0.0018 vs 0.0500 |
equivalent |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
counterfactual mean under treatment arm ‘medium’ |
0.000001 |
0.000416 |
1.0007 |
0 |
matching implementation |
0.000528 vs 0.0500 |
equivalent |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal odds ratio, low versus high, reported on the log scale |
0.000031 |
0.0012 |
1.0005 |
0 |
matching implementation |
0.000619 vs 0.0500 |
equivalent |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal odds ratio, medium versus high, reported on the log scale |
0.000046 |
0.000879 |
1.0005 |
0 |
matching implementation |
0.000450 vs 0.0500 |
equivalent |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal risk ratio, low versus high, reported on the log scale |
0.000012 |
0.0010 |
1.0004 |
0 |
matching implementation |
0.000641 vs 0.0500 |
equivalent |
three-arm binary-outcome law with shared cross-fitted nuisances |
|
marginal risk ratio, medium versus high, reported on the log scale |
0.000012 |
0.000795 |
1.0004 |
0.0012 |
matching implementation |
0.000255 vs 0.0500 |
equivalent |
Theory properties#
property |
cell |
role |
what was tested |
what must hold |
measured |
result |
|---|---|---|---|---|---|---|
|
|
control |
both nuisances are misspecified, at n = 2,000 |
the exact coverage interval must fall below the floor, over the replications this rung declares its own verdict at |
coverage 0.4683 to 0.5747, bias 0.0503 |
pass |
|
|
control |
both nuisances are misspecified, at n = 4,000 |
the exact coverage interval must fall below the floor, over the replications this rung declares its own verdict at |
coverage 0.2089 to 0.3018, bias 0.0487 |
pass |
|
|
control |
both nuisances are misspecified, at n = 8,000 |
the exact coverage interval must fall below the floor, over the replications this rung declares its own verdict at |
coverage 0.0235 to 0.0674, bias 0.0490 |
pass |
|
|
positive |
only the outcome regression is correctly specified, at n = 2,000 |
the exact coverage interval clears the declared floor, over the replications this rung declares its own verdict at |
coverage 0.9245 to 0.9714, bias 0.0011 |
pass |
|
|
positive |
only the outcome regression is correctly specified, at n = 4,000 |
the exact coverage interval clears the declared floor, over the replications this rung declares its own verdict at |
coverage 0.8988 to 0.9542, bias 0.000900 |
fail |
|
|
positive |
only the outcome regression is correctly specified, at n = 8,000 |
the exact coverage interval clears the declared floor, over the replications this rung declares its own verdict at |
coverage 0.9165 to 0.9662, bias 0.0017 |
pass |
|
|
control |
the same regression with both nuisances misspecified |
slope interval must not establish contraction |
slope -0.0022 to 0.0060 |
pass |
|
|
positive |
log absolute bias regressed on log n across three sizes, outcome regression correct, over every replication each rung ran |
slope interval entirely below zero, so the bias contracts |
slope -1.0718 to -0.6666 |
pass |
|
|
positive |
the same regression with only the treatment mechanism correct |
slope interval entirely below zero, so the bias contracts |
slope -1.0240 to -0.7408 |
pass |
|
|
positive |
only the treatment mechanism is correctly specified, at n = 2,000 |
the exact coverage interval clears the declared floor, over the replications this rung declares its own verdict at |
coverage 0.9204 to 0.9688, bias 0.000585 |
pass |
|
|
positive |
only the treatment mechanism is correctly specified, at n = 4,000 |
the exact coverage interval clears the declared floor, over the replications this rung declares its own verdict at |
coverage 0.9224 to 0.9701, bias -0.000437 |
pass |
|
|
positive |
only the treatment mechanism is correctly specified, at n = 8,000 |
the exact coverage interval clears the declared floor, over the replications this rung declares its own verdict at |
coverage 0.9285 to 0.9740, bias 0.000830 |
pass |
|
|
positive |
both the outcome regression and the treatment mechanism are correctly specified |
bias interval inside the equivalence margin, with the reported standard error on the scale of the empirical spread |
bias -0.0052 to 0.0024, margin 0.0090, SE ratio 1.0625 |
pass |
|
|
control |
both nuisances are misspecified |
bias interval must fall entirely outside the margin, with the reported standard error still on the scale of the empirical spread |
bias 0.0466 to 0.0544, margin 0.0092, SE ratio 1.0265 |
pass |
|
|
positive |
only the outcome regression is correctly specified |
bias interval inside the equivalence margin, with the reported standard error on the scale of the empirical spread |
bias -0.000511 to 0.0076, margin 0.0096, SE ratio 0.9980 |
pass |
|
|
positive |
only the treatment mechanism is correctly specified |
bias interval inside the equivalence margin, with the reported standard error on the scale of the empirical spread |
bias 0.0015 to 0.0072, margin 0.0068, SE ratio 0.9998 |
fail |
|
|
diagnostic |
each split is balanced on the treatment, which the package refuses |
reported, not gated: the coverage interval and its paired difference from the unstratified arm are published and no margin is applied |
coverage 0.9451 to 0.9576, paired coverage difference -0.0056 to 0.0045 |
reported |
|
|
diagnostic |
each split is drawn without reading the treatment or the outcome |
reported, not gated: the coverage interval is published and no margin is applied |
coverage 0.9458 to 0.9582 |
reported |
|
|
positive |
both nuisances are correctly specified |
SE ratio and coverage intervals both inside their calibration bands |
coverage 0.9300 to 0.9597, SE ratio 0.9258 to 1.0123 |
fail |
|
|
positive |
bias, coverage and SE calibration at n = 2,000 |
bias inside the margin, coverage clears the floor, SE ratio inside the sanity band |
bias -0.000290, coverage 0.9307 to 0.9826, SE ratio 1.0010 |
pass |
|
|
positive |
bias, coverage and SE calibration at n = 500 |
bias inside the margin, coverage clears the floor, SE ratio inside the band |
bias -0.000902, coverage 0.8965 to 0.9627, SE ratio 0.9888 |
fail |
|
|
positive |
bias, coverage and SE calibration at n = 8,000 |
bias inside the margin, coverage clears the floor, SE ratio inside the sanity band |
bias -0.000534, coverage 0.9212 to 0.9774, SE ratio 1.0454 |
pass |
|
|
positive |
log empirical spread of the estimates regressed on log n across three sizes |
slope interval inside the root-n band and excluding -1/4 |
slope -0.5835 to -0.4823 |
pass |
|
|
positive |
the same regression applied to the mean reported standard error |
slope interval inside the root-n band and excluding -1/4 |
slope -0.5171 to -0.5090 |
pass |
Measured values#
quantity |
value |
source |
|---|---|---|
|
800 |
primary replications |
|
2000 |
observations per primary replication |
|
18 |
implementation-estimand truth tests |
|
18 |
truth tests passing |
|
9 |
paired comparison tests |
|
9 |
paired tests passing |
|
22 |
repeated-sampling property cells |
|
18 |
property cells passing |
|
2 |
fold-policy rows reported rather than gated, and excluded from the two counts above |
|
800 |
fits each side audits against the shared score bar |
|
2 |
Cleverly fits that miss that bar |
|
4 |
R |
|
0.9523 |
reported coverage of the split this row declares |
|
0.9516 |
reported coverage of the treatment-stratified split |
|
-0.0056 |
its paired 99% lower bound against the unstratified arm |
|
0.0045 |
its paired 99% upper bound against the unstratified arm |
|
8000 |
paired replications behind that difference |
|
400 |
replications behind the gated n = 500 cell |
|
0.9900 |
Monte Carlo confidence level |
|
0.0500 |
nominal estimator size |
|
0.9500 |
nominal estimator coverage |
|
10000 |
resamples for bootstrap intervals |
|
0.2500 |
bias equivalence margin in empirical SDs |
|
0.9000 |
lower coverage gate |
|
0.9900 |
reported conservative-coverage ceiling |
|
0.8000 |
lower SE-ratio screen |
|
1.2000 |
upper SE-ratio screen |
|
0.9300 |
lower calibration band |
|
1.0700 |
upper calibration band |
|
0.9200 |
lower calibration-coverage band |
|
0.9800 |
upper calibration-coverage band |
|
0.1000 |
largest supported type-I rate |
|
0.1500 |
paired similarity margin in empirical SDs |
|
1.1000 |
RMSE-ratio non-inferiority margin |
|
-0.0250 |
coverage-difference non-inferiority margin |
|
0.0500 |
SE-calibration non-inferiority margin |
|
0.8000 |
lower power gate |
|
-0.5000 |
root-n contraction target |
|
-0.6250 |
lower contraction band |
|
-0.3750 |
upper contraction band |
|
-0.2500 |
slower rate the interval must exclude |
|
0.1000 |
union-model SE-ratio screen, lower limit |
|
10 |
union-model SE-ratio screen, upper limit |
Limitations#
This is a reporting study. A red scientific verdict publishes rather than prevents the record from existing. The source theorem and the original R study are binary-treatment results. Both packages expose a vector intervention API, and this row measures their armwise extension. It does not claim a new multi-arm theorem. The red-cell ledger lists each red cell of this study with the roadmap ask that owns it.
The contraction ladder explains the treatment_correct level cell. That cell
misses its equivalence margin at n = 2,000 by 0.0004, which is about six per cent of the margin.
The two figures print four units of the last digit apart in the generated table above.
The ladder redraws that regime on independent streams at three sizes and puts the bias inside the
margin at every one.
In this regime the outcome regression is misspecified and the treatment mechanism is correct.
RM18 read the level cell against the fully specified primary rows at the same size, under a rule
declared before the computation. That Welch interval runs 0.001160 to 0.008650 and excludes zero,
so the fixed-size reading is finite-sample excess detected. This comparison does not establish
asymptotic inconsistency or identify the cause of the difference.
The ladder’s n = 2,000 rung is the other sample of the same regime, and it does not reproduce the excess. Its difference from the primary rows runs -0.002581 to 0.004917, and the pooled comparison covers zero. The overall evidence is inconclusive. These rows establish neither an added bias nor its absence. What the one-sided reading found gives each interval.
No test pins this law as H1. In the treatment_correct regime the consistent nuisance is a correctly
specified multinomial GLM. Where the law is not H1, the theorem predicts a conservative interval. The
measured SE ratios of 1.00 to 1.04 do not contradict it. No magnitude was computed for this
law. The coverage rule is a floor and the SE screen is wide, so no verdict here can detect a
conservative interval.
RM18 design SL ran the two outer rungs of each regime at 73,000 replications. A declaration before the run fixed that budget and the reading rule. RM33 replaces collided sample seeds through audited targeted reruns. The current artifacts retain every unaffected row and recompute the complete analysis.
The 99% interval of each fitted slope lies below zero, and both slope rows pass.
Over the 73,000 replications of each outer
rung, the bias interval of each one-correct regime excludes zero at n = 2,000 and at n = 8,000.
The declared reading of both slopes is therefore contracts.
The declaration did not name the budget of the n = 2,000 bias interval. RM18 first read it at the
600 replications of each rung’s coverage verdict, and after review at the slope’s own 73,000
rows. Over the first 600 rows, both intervals cover zero, and the reading would be contracts at the noise floor. Both labels take the same route in the ledger.
The both-wrong control’s slope interval covers zero, and the control passes. Each rung’s coverage
verdict stays at 600 replications. A slope below zero shows the direction of the change, and it
does not identify the exponent. What design SL found gives each
original interval and what the readings do not show.
tests/unit/test_rm18_slopes_reading.py independently computes the current full-rung bias intervals and checks each reading.
The composite manifests separate inherited evidence from the replacement fits and complete analysis.
The three remaining red cells are red on their own terms, and each misses by less than the width
of its own last printed digit. Four property rows are red in all: these three and the
treatment_correct level cell above. The interval_calibration SE-ratio interval reaches
0.9258 against a band that opens at 0.93. The outcome_correct rung at n = 4,000 has a coverage lower bound of 0.8988
against a floor of 0.90. The n_500 size cell has a lower bound of 0.8965 against the same
floor.
RM18 design BD re-read these three cells on fresh draws, under a declaration written before its
run. Each reads resolved: truth satisfies the gate. The re-read does not move a verdict. Over
17,000 fresh replicates, the calibration cell’s SE-ratio interval runs 0.9932 to 1.0217. Over
6,000 each, the n = 4,000 rung covers 0.9464 to 0.9605, and the n_500 cell covers 0.9439 to
0.9584. The roadmap record,
What design BD found at commit 985849c6, gives every leg and what the re-read does not
show.
tests/diagnostics/rm18_boundary/ holds the rows.
The n_500 cell was green at 0.9057 on the treatment-stratified split this row used before.
Nothing but the fold draw moved, and 400 replications at n = 500 do not resolve a coverage
endpoint to better than about a point. Read it as one Monte Carlo resolution rather than as a
property of the estimator. The same cell in the outcome-adaptive multi-arm row moved the other way
under the same change.
The fold_policy family now measures that comparison. It runs the two split policies on one
binary law and on one set of draws. It reports and it does not gate. Neither cell declares a
margin, so the pass counts above leave both out.
The measured table above gives the paired coverage difference and its two endpoints. That interval covers zero. The upper endpoint stays below the threshold the declared rule names. The fold policy does not explain the endpoint move on this law at this size.
This reading has less room than its design asked for. The declaration budgeted 8,000 draws for a
99% half-width of 0.0046, which would resolve the 0.005 the rule names. The realized half-width
is 0.0051, because the two policies disagreed on more draws than the pilot predicted. The upper
endpoint clears 0.005 only because the point estimate fell below zero. So this reading rests on
where the difference landed, and not on the resolution the instrument achieved.
RM18 at commit dea3297e records the declared and realized numbers, in “What the two
readings found”.
The diagnostic reads its own coverage over 8,000 draws. That coverage does not re-read the
n_500 cell. The gated cell keeps its own 400-replication budget. RM18 at commit dea3297e
declares the rule this reading applies, in “The two readings, declared before they run”.
Each side audits score_audited_fits fits against the shared empirical-score bar. Cleverly misses
it on subject_score_failures fits, and R drtmle misses it on reference_score_failures. The
propensity bound stays inactive throughout, and the subject fit is refused if it does not.
The row covers one binary-outcome law, one fold count, pooled reduced cross-fitting, univariate reduction, ordinary GLM nuisance fits, and pointwise intervals. It excludes flexible learners, practical-positivity stress, missing outcomes, weights, clusters, fold repeats, simultaneous bands, and longitudinal treatment. The default-band study measures the default band of this study’s subject fit.