# Sequentially doubly robust estimation This study validates `SDR`, the sequentially doubly robust estimator of Díaz, Williams, Hoffman and Schenck (2023), Equation (4) and Section 5.3. The [sequentially doubly robust estimator](../longitudinal-tmle.md#the-sequentially-doubly-robust-estimator) section states the estimator, its conditions and its exact-law evidence. The study pairs each fit with pinned `lmtp` 1.5.4: `cf_sdr` and `theta_dr(is_sdr = TRUE)`. Both sides read the same shifted values, per-node ratios and fold assignment. The study writes them beside each replicate, so `lmtp` fits no ratio. ## What was compared | scenario | law and plans | pairing | | --- | --- | --- | | `sdr_end_of_study` | the censored two-node law; `never`, `always` and a dynamic plan | one fold | | `sdr_end_of_study_crossfit` | the same law and plans at five folds | five folds, identical fold assignment | | `sdr_survival` | the two-node survival law; the same three plans at horizons 1 and 2 | one fold | | `sdr_mtp` | a truncated-normal dose at both nodes; `up`, `scale at 2` and `up then history` | one fold, exact | | `sdr_policy` | a categorical treatment under three known stochastic policies, through four copies of each unit | one fold; `mix` is exact | | setting | `cleverly` | R `lmtp` | | --- | --- | --- | | datasets | 1,000 samples of 2,000 rows per scenario | the identical rows | | per-node ratio | the generating mechanism, and the oracle binned density of the longitudinal modified-treatment-policy study at a continuous node | the same ratio array, read from the replicate data | | node regressions | a quasibinomial GLM at the last node and least squares at the earlier node, unclipped | `SL.glm` on the same columns | | cross-fitting | the training-fold recursion: fold $k$ fits every regression on its training rows | `cf_sdr` on the same folds | | intervals | pointwise 95% Wald from the influence curve | the same, from `lmtp`'s influence curve | At five folds the two constructions differ. This package composes each fold's transforms from that fold's own regressions. `lmtp` stitches each row's later transform from the fold that holds the row out. The pairing gates (`gates.csv`) therefore hold each scenario to one of two rules. The `sdr_mtp` rows and `ey_regimen[mix]` are exact pairs, and their largest estimate gap is 3.2e-12. Every other row is a margins pair. All 180 gate rows pass. ## Accuracy against known truth | law | estimand | what was tested | implementation | bias (99% interval) | coverage | SE ratio | result | | --- | --- | --- | --- | --- | --- | --- | --- | | two-node law with monotone censoring, three plans, one fold | `ate_regimen[always vs never]` | difference in mean outcome between the plans "treat at both times" against "treat at neither time" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0014 to 0.0038 | 0.9460 | 0.9826 | pass | | two-node law with monotone censoring, three plans, one fold | `ate_regimen[always vs never]` | difference in mean outcome between the plans "treat at both times" against "treat at neither time" | R `lmtp` | -0.0016 to 0.0036 | 0.9470 | 0.9872 | pass | | two-node law with monotone censoring, three plans, one fold | `ate_regimen[treat then continue if l2 positive vs never]` | difference in mean outcome between the plans "treat, then continue only if L2 is positive" against "treat at neither time" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000346 to 0.0049 | 0.9420 | 0.9981 | pass | | two-node law with monotone censoring, three plans, one fold | `ate_regimen[treat then continue if l2 positive vs never]` | difference in mean outcome between the plans "treat, then continue only if L2 is positive" against "treat at neither time" | R `lmtp` | -0.000724 to 0.0045 | 0.9510 | 1.0046 | pass | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[always]` | mean outcome under the plan treat at both times | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000780 to 0.0023 | 0.9410 | 1.0122 | pass | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[always]` | mean outcome under the plan treat at both times | R `lmtp` | -0.000814 to 0.0022 | 0.9450 | 1.0155 | pass | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[never]` | mean outcome under the plan treat at neither time | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0025 to 0.0016 | 0.9510 | 0.9909 | pass | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[never]` | mean outcome under the plan treat at neither time | R `lmtp` | -0.0024 to 0.0017 | 0.9570 | 0.9973 | pass | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[treat then continue if l2 positive]` | mean outcome under the plan treat, then continue only if L2 is positive | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | 0.000113 to 0.0035 | 0.9410 | 0.9723 | pass | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[treat then continue if l2 positive]` | mean outcome under the plan treat, then continue only if L2 is positive | R `lmtp` | -0.000117 to 0.0032 | 0.9450 | 0.9795 | pass | | the same law and plans, five folds | `ate_regimen[always vs never]` | difference in mean outcome between the plans "treat at both times" against "treat at neither time" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0036 to 0.0017 | 0.9410 | 0.9603 | pass | | the same law and plans, five folds | `ate_regimen[always vs never]` | difference in mean outcome between the plans "treat at both times" against "treat at neither time" | R `lmtp` | -0.0034 to 0.0019 | 0.9400 | 0.9655 | pass | | the same law and plans, five folds | `ate_regimen[treat then continue if l2 positive vs never]` | difference in mean outcome between the plans "treat, then continue only if L2 is positive" against "treat at neither time" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0035 to 0.0020 | 0.9410 | 0.9616 | pass | | the same law and plans, five folds | `ate_regimen[treat then continue if l2 positive vs never]` | difference in mean outcome between the plans "treat, then continue only if L2 is positive" against "treat at neither time" | R `lmtp` | -0.0034 to 0.0021 | 0.9460 | 0.9681 | pass | | the same law and plans, five folds | `ey_regimen[always]` | mean outcome under the plan treat at both times | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0016 to 0.0017 | 0.9370 | 0.9435 | pass | | the same law and plans, five folds | `ey_regimen[always]` | mean outcome under the plan treat at both times | R `lmtp` | -0.0015 to 0.0019 | 0.9360 | 0.9384 | pass | | the same law and plans, five folds | `ey_regimen[never]` | mean outcome under the plan treat at neither time | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0012 to 0.0031 | 0.9390 | 0.9659 | pass | | the same law and plans, five folds | `ey_regimen[never]` | mean outcome under the plan treat at neither time | R `lmtp` | -0.0012 to 0.0031 | 0.9410 | 0.9691 | pass | | the same law and plans, five folds | `ey_regimen[treat then continue if l2 positive]` | mean outcome under the plan treat, then continue only if L2 is positive | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0014 to 0.0019 | 0.9500 | 0.9950 | pass | | the same law and plans, five folds | `ey_regimen[treat then continue if l2 positive]` | mean outcome under the plan treat, then continue only if L2 is positive | R `lmtp` | -0.0014 to 0.0020 | 0.9480 | 0.9922 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[scale at 2 vs natural]` | difference in mean outcome between the plans "multiply the second dose by 1.25, capped at 5.5" against "leave the observed dose unchanged at both times" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000357 to 0.0012 | 0.9520 | 1.0253 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[scale at 2 vs natural]` | difference in mean outcome between the plans "multiply the second dose by 1.25, capped at 5.5" against "leave the observed dose unchanged at both times" | R `lmtp` | -0.000357 to 0.0012 | 0.9520 | 1.0253 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[up then history vs natural]` | difference in mean outcome between the plans "add 0.5 to the first dose, then add 0.5 to the second where the first exceeds 3" against "leave the observed dose unchanged at both times" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000551 to 0.000799 | 0.9340 | 1.0070 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[up then history vs natural]` | difference in mean outcome between the plans "add 0.5 to the first dose, then add 0.5 to the second where the first exceeds 3" against "leave the observed dose unchanged at both times" | R `lmtp` | -0.000551 to 0.000799 | 0.9340 | 1.0070 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[up vs natural]` | difference in mean outcome between the plans "add 0.5 to the dose at both times, capped at 5.5" against "leave the observed dose unchanged at both times" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000398 to 0.0010 | 0.9420 | 1.0169 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[up vs natural]` | difference in mean outcome between the plans "add 0.5 to the dose at both times, capped at 5.5" against "leave the observed dose unchanged at both times" | R `lmtp` | -0.000398 to 0.0010 | 0.9420 | 1.0169 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[natural]` | mean outcome under the plan leave the observed dose unchanged at both times | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000841 to 0.000981 | 0.9590 | 0.9974 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[natural]` | mean outcome under the plan leave the observed dose unchanged at both times | R `lmtp` | -0.000841 to 0.000981 | 0.9590 | 0.9974 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[scale at 2]` | mean outcome under the plan multiply the second dose by 1.25, capped at 5.5 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000689 to 0.0017 | 0.9540 | 1.0287 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[scale at 2]` | mean outcome under the plan multiply the second dose by 1.25, capped at 5.5 | R `lmtp` | -0.000689 to 0.0017 | 0.9540 | 1.0287 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[up then history]` | mean outcome under the plan add 0.5 to the first dose, then add 0.5 to the second where the first exceeds 3 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000914 to 0.0013 | 0.9590 | 1.0270 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[up then history]` | mean outcome under the plan add 0.5 to the first dose, then add 0.5 to the second where the first exceeds 3 | R `lmtp` | -0.000914 to 0.0013 | 0.9590 | 1.0270 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[up]` | mean outcome under the plan add 0.5 to the dose at both times, capped at 5.5 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000748 to 0.0015 | 0.9580 | 1.0315 | pass | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[up]` | mean outcome under the plan add 0.5 to the dose at both times, capped at 5.5 | R `lmtp` | -0.000748 to 0.0015 | 0.9580 | 1.0315 | pass | | the three-level law with the plans low, mix and taper | `ate_regimen[mix vs low]` | difference in mean outcome between the plans "draw each arm from a known policy at both times" against "assign the low arm at both times" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0025 to 0.0032 | 0.9350 | 0.9815 | pass | | the three-level law with the plans low, mix and taper | `ate_regimen[mix vs low]` | difference in mean outcome between the plans "draw each arm from a known policy at both times" against "assign the low arm at both times" | R `lmtp` | -0.0025 to 0.0033 | 0.9410 | 0.9923 | pass | | the three-level law with the plans low, mix and taper | `ate_regimen[taper vs low]` | difference in mean outcome between the plans "assign the high arm first, then draw from a known policy" against "assign the low arm at both times" | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0037 to 0.0031 | 0.9420 | 0.9809 | pass | | the three-level law with the plans low, mix and taper | `ate_regimen[taper vs low]` | difference in mean outcome between the plans "assign the high arm first, then draw from a known policy" against "assign the low arm at both times" | R `lmtp` | -0.0034 to 0.0035 | 0.9510 | 0.9926 | pass | | the three-level law with the plans low, mix and taper | `ey_regimen[low]` | mean outcome under the plan assign the low arm at both times | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0035 to 0.0020 | 0.9350 | 0.9868 | pass | | the three-level law with the plans low, mix and taper | `ey_regimen[low]` | mean outcome under the plan assign the low arm at both times | R `lmtp` | -0.0037 to 0.0020 | 0.9370 | 0.9948 | pass | | the three-level law with the plans low, mix and taper | `ey_regimen[mix]` | mean outcome under the plan draw each arm from a known policy at both times | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0016 to 0.000747 | 0.9530 | 1.0011 | pass | | the three-level law with the plans low, mix and taper | `ey_regimen[mix]` | mean outcome under the plan draw each arm from a known policy at both times | R `lmtp` | -0.0016 to 0.000747 | 0.9530 | 1.0011 | pass | | the three-level law with the plans low, mix and taper | `ey_regimen[taper]` | mean outcome under the plan assign the high arm first, then draw from a known policy | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0030 to 0.000884 | 0.9520 | 0.9944 | pass | | the three-level law with the plans low, mix and taper | `ey_regimen[taper]` | mean outcome under the plan assign the high arm first, then draw from a known policy | R `lmtp` | -0.0027 to 0.0011 | 0.9520 | 1.0043 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[always vs never @ t=1]` | difference in cumulative risk between the plans "treat at both times" against "treat at neither time" at horizon t = 1 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0012 to 0.0019 | 0.9580 | 1.0086 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[always vs never @ t=1]` | difference in cumulative risk between the plans "treat at both times" against "treat at neither time" at horizon t = 1 | R `lmtp` | -0.0012 to 0.0019 | 0.9580 | 1.0078 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[always vs never @ t=2]` | difference in cumulative risk between the plans "treat at both times" against "treat at neither time" at horizon t = 2 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0013 to 0.0035 | 0.9410 | 0.9714 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[always vs never @ t=2]` | difference in cumulative risk between the plans "treat at both times" against "treat at neither time" at horizon t = 2 | R `lmtp` | -0.0012 to 0.0035 | 0.9450 | 0.9817 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[treat then continue if l2 positive vs never @ t=2]` | difference in cumulative risk between the plans "treat, then continue only if L2 is positive" against "treat at neither time" at horizon t = 2 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0012 to 0.0036 | 0.9460 | 0.9799 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[treat then continue if l2 positive vs never @ t=2]` | difference in cumulative risk between the plans "treat, then continue only if L2 is positive" against "treat at neither time" at horizon t = 2 | R `lmtp` | -0.0011 to 0.0037 | 0.9470 | 0.9910 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[always @ t=1]` | cumulative risk under the plan treat at both times at horizon t = 1 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0013 to 0.000623 | 0.9500 | 1.0081 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[always @ t=1]` | cumulative risk under the plan treat at both times at horizon t = 1 | R `lmtp` | -0.0013 to 0.000617 | 0.9520 | 1.0099 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[always @ t=2]` | cumulative risk under the plan treat at both times at horizon t = 2 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000840 to 0.0021 | 0.9440 | 0.9797 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[always @ t=2]` | cumulative risk under the plan treat at both times at horizon t = 2 | R `lmtp` | -0.000805 to 0.0021 | 0.9480 | 0.9830 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[never @ t=1]` | cumulative risk under the plan treat at neither time at horizon t = 1 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0020 to 0.000503 | 0.9450 | 1.0029 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[never @ t=1]` | cumulative risk under the plan treat at neither time at horizon t = 1 | R `lmtp` | -0.0020 to 0.000509 | 0.9470 | 1.0023 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[never @ t=2]` | cumulative risk under the plan treat at neither time at horizon t = 2 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.0024 to 0.0014 | 0.9450 | 0.9780 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[never @ t=2]` | cumulative risk under the plan treat at neither time at horizon t = 2 | R `lmtp` | -0.0024 to 0.0014 | 0.9480 | 0.9945 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[treat then continue if l2 positive @ t=2]` | cumulative risk under the plan treat, then continue only if L2 is positive at horizon t = 2 | `cleverly` sequentially doubly robust (SDR) longitudinal estimator | -0.000754 to 0.0022 | 0.9470 | 1.0169 | pass | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[treat then continue if l2 positive @ t=2]` | cumulative risk under the plan treat, then continue only if L2 is positive at horizon t = 2 | R `lmtp` | -0.000714 to 0.0022 | 0.9510 | 1.0210 | pass | ## Agreement with the canonical implementation Comparator-backed: a paired comparison with `lmtp` 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 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | two-node law with monotone censoring, three plans, one fold | `ate_regimen[always vs never]` | difference in mean outcome between the plans "treat at both times" against "treat at neither time" | 0.000180 | 0.0379 | 1.0077 | -0.0010 | matching implementation | 0.0047 vs 0.0500 | equivalent | | two-node law with monotone censoring, three plans, one fold | `ate_regimen[treat then continue if l2 positive vs never]` | difference in mean outcome between the plans "treat, then continue only if L2 is positive" against "treat at neither time" | 0.000396 | 0.0829 | 1.0160 | -0.0090 | matching implementation | 0.0148 vs 0.0500 | equivalent | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[always]` | mean outcome under the plan treat at both times | 0.000036 | 0.0129 | 1.0085 | -0.0040 | matching implementation | 0.0114 vs 0.0500 | equivalent | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[never]` | mean outcome under the plan treat at neither time | -0.000144 | 0.0380 | 1.0093 | -0.0060 | matching implementation | 0.0050 vs 0.0500 | equivalent | | two-node law with monotone censoring, three plans, one fold | `ey_regimen[treat then continue if l2 positive]` | mean outcome under the plan treat, then continue only if L2 is positive | 0.000252 | 0.0816 | 1.0252 | -0.0040 | matching implementation | 0.0102 vs 0.0500 | equivalent | | the same law and plans, five folds | `ate_regimen[always vs never]` | difference in mean outcome between the plans "treat at both times" against "treat at neither time" | -0.000219 | 0.0447 | 1.0164 | 0.0010 | different estimator | 0.0067 vs 0.0500 | equivalent | | the same law and plans, five folds | `ate_regimen[treat then continue if l2 positive vs never]` | difference in mean outcome between the plans "treat, then continue only if L2 is positive" against "treat at neither time" | -0.000092 | 0.0183 | 1.0208 | -0.0050 | different estimator | 0.0070 vs 0.0500 | equivalent | | the same law and plans, five folds | `ey_regimen[always]` | mean outcome under the plan treat at both times | -0.000165 | 0.0544 | 1.0052 | 0.0010 | different estimator | 0.0070 vs 0.0500 | equivalent | | the same law and plans, five folds | `ey_regimen[never]` | mean outcome under the plan treat at neither time | 0.000054 | 0.0138 | 1.0126 | -0.0020 | different estimator | 0.0056 vs 0.0500 | equivalent | | the same law and plans, five folds | `ey_regimen[treat then continue if l2 positive]` | mean outcome under the plan treat, then continue only if L2 is positive | -0.000038 | 0.0123 | 1.0191 | 0.0020 | different estimator | 0.0140 vs 0.0500 | equivalent | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[scale at 2 vs natural]` | difference in mean outcome between the plans "multiply the second dose by 1.25, capped at 5.5" against "leave the observed dose unchanged at both times" | -3.687e-16 | 2.577e-13 | 1.0000 | 0 | matching implementation | 3.175e-14 vs 0.0500 | equivalent | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[up then history vs natural]` | difference in mean outcome between the plans "add 0.5 to the first dose, then add 0.5 to the second where the first exceeds 3" against "leave the observed dose unchanged at both times" | -2.780e-16 | 2.241e-13 | 1.0000 | 0 | matching implementation | 2.764e-14 vs 0.0500 | equivalent | | two-node law with a truncated-normal dose at both nodes and four plans | `ate_regimen[up vs natural]` | difference in mean outcome between the plans "add 0.5 to the dose at both times, capped at 5.5" against "leave the observed dose unchanged at both times" | -2.735e-16 | 2.091e-13 | 1.0000 | 0 | matching implementation | 2.265e-14 vs 0.0500 | equivalent | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[natural]` | mean outcome under the plan leave the observed dose unchanged at both times | 0 | 0 | 1 | 0 | matching implementation | 3.331e-16 vs 0.0500 | equivalent | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[scale at 2]` | mean outcome under the plan multiply the second dose by 1.25, capped at 5.5 | -3.920e-16 | 1.806e-13 | 1.0000 | 0 | matching implementation | 2.021e-14 vs 0.0500 | equivalent | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[up then history]` | mean outcome under the plan add 0.5 to the first dose, then add 0.5 to the second where the first exceeds 3 | -2.846e-16 | 1.397e-13 | 1.0000 | 0 | matching implementation | 1.554e-14 vs 0.0500 | equivalent | | two-node law with a truncated-normal dose at both nodes and four plans | `ey_regimen[up]` | mean outcome under the plan add 0.5 to the dose at both times, capped at 5.5 | -2.820e-16 | 1.355e-13 | 1.0000 | 0 | matching implementation | 1.643e-14 vs 0.0500 | equivalent | | the three-level law with the plans low, mix and taper | `ate_regimen[mix vs low]` | difference in mean outcome between the plans "draw each arm from a known policy at both times" against "assign the low arm at both times" | -0.000080 | 0.0152 | 0.9893 | -0.0060 | matching implementation | 0.0182 vs 0.0500 | equivalent | | the three-level law with the plans low, mix and taper | `ate_regimen[taper vs low]` | difference in mean outcome between the plans "assign the high arm first, then draw from a known policy" against "assign the low arm at both times" | -0.000324 | 0.0515 | 0.9955 | -0.0090 | matching implementation | 0.0164 vs 0.0500 | equivalent | | the three-level law with the plans low, mix and taper | `ey_regimen[low]` | mean outcome under the plan assign the low arm at both times | 0.000080 | 0.0155 | 0.9763 | -0.0020 | matching implementation | 0.0194 vs 0.0500 | equivalent | | the three-level law with the plans low, mix and taper | `ey_regimen[mix]` | mean outcome under the plan draw each arm from a known policy at both times | -1.272e-13 | 5.993e-11 | 1.0000 | 0 | matching implementation | 6.405e-11 vs 0.0500 | equivalent | | the three-level law with the plans low, mix and taper | `ey_regimen[taper]` | mean outcome under the plan assign the high arm first, then draw from a known policy | -0.000244 | 0.0693 | 1.0243 | 0 | matching implementation | 0.0150 vs 0.0500 | equivalent | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[always vs never @ t=1]` | difference in cumulative risk between the plans "treat at both times" against "treat at neither time" at horizon t = 1 | 0.000010 | 0.0034 | 1.0004 | 0 | matching implementation | 0.0013 vs 0.0500 | equivalent | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[always vs never @ t=2]` | difference in cumulative risk between the plans "treat at both times" against "treat at neither time" at horizon t = 2 | -0.000046 | 0.0104 | 1.0135 | -0.0040 | matching implementation | 0.0053 vs 0.0500 | equivalent | | censored survival law, risks at horizons 1 and 2, one fold | `ate_regimen[treat then continue if l2 positive vs never @ t=2]` | difference in cumulative risk between the plans "treat, then continue only if L2 is positive" against "treat at neither time" at horizon t = 2 | -0.000051 | 0.0114 | 1.0151 | -0.0010 | matching implementation | 0.0054 vs 0.0500 | equivalent | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[always @ t=1]` | cumulative risk under the plan treat at both times at horizon t = 1 | 0.000005 | 0.0027 | 1.0033 | -0.0020 | matching implementation | 0.0049 vs 0.0500 | equivalent | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[always @ t=2]` | cumulative risk under the plan treat at both times at horizon t = 2 | -0.000030 | 0.0112 | 1.0060 | -0.0040 | matching implementation | 0.0028 vs 0.0500 | equivalent | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[never @ t=1]` | cumulative risk under the plan treat at neither time at horizon t = 1 | -0.000005 | 0.0021 | 1.0011 | -0.0020 | matching implementation | 0.0019 vs 0.0500 | equivalent | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[never @ t=2]` | cumulative risk under the plan treat at neither time at horizon t = 2 | 0.000016 | 0.0045 | 1.0208 | -0.0030 | matching implementation | 0.0066 vs 0.0500 | equivalent | | censored survival law, risks at horizons 1 and 2, one fold | `risk_regimen[treat then continue if l2 positive @ t=2]` | cumulative risk under the plan treat, then continue only if L2 is positive at horizon t = 2 | -0.000035 | 0.0129 | 1.0091 | -0.0040 | matching implementation | 0.0115 vs 0.0500 | equivalent | ## Theory properties | property | cell | role | what was tested | what must hold | measured | result | | --- | --- | --- | --- | --- | --- | --- | | `clustered_calibration` | `clusters_200__known_ratio` | positive | contrast of always against never, 200 clusters of 10 rows: grouped folds, the known ratio and GLM outcome regressions | SE ratio and coverage intervals both inside their calibration bands | SE ratio 0.9699 to 1.0249, coverage 0.9348 to 0.9536 | pass | | `clustered_calibration` | `clusters_200__noise_control` | control | contrast of always against never, 200 clusters of 10 rows: a declared scale of independent noise is added to each estimate | the SE-ratio interval must fall below the calibration band | SE ratio 0.6845 to 0.7254, coverage 0.8075 to 0.8388 | pass | | `clustered_calibration` | `clusters_200__shrunken_se_control` | control | contrast of always against never, 200 clusters of 10 rows: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | SE ratio 0.6777 to 0.7172, coverage 0.8067 to 0.8380 | pass | | `clustered_calibration` | `clusters_20__known_ratio` | positive | contrast of always against never, 20 clusters of 100 rows: grouped folds, the known ratio and GLM outcome regressions | SE ratio and coverage intervals both inside their calibration bands | SE ratio 0.9511 to 1.0091, coverage 0.9375 to 0.9559 | pass | | `clustered_calibration` | `clusters_20__noise_control` | control | contrast of always against never, 20 clusters of 100 rows: a declared scale of independent noise is added to each estimate | the SE-ratio interval must fall below the calibration band | SE ratio 0.6950 to 0.7389, coverage 0.8204 to 0.8508 | pass | | `clustered_calibration` | `clusters_20__shrunken_se_control` | control | contrast of always against never, 20 clusters of 100 rows: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | SE ratio 0.6660 to 0.7063, coverage 0.7969 to 0.8289 | pass | | `construction_diagnostic` | `estimated_flexible_mechanism` | diagnostic | the shipped construction with a tree mechanism estimated in each fold, under the default bounds (0.01, 1) | reported only | bias -0.0034 to 0.0015, coverage 0.9650, SE ratio 1.0441 | reported | | `construction_diagnostic` | `stitched_cross_fit` | diagnostic | the stitched construction: each row's node 2 transform comes from the fold that holds it out, and node 1 regresses the stitched transforms | reported only | bias -0.0029 to 0.0013, coverage 0.9483, SE ratio 0.9856 | reported | | `crossfit_overfitting` | `cross_fitted_sdr` | positive | five-fold SDR with fully grown outcome trees and the known mechanism | SE ratio clears the overfitting floor and stays inside the sanity band | SE ratio 0.9739 to 1.0132 | pass | | `crossfit_overfitting` | `in_sample_control` | control | the same flexible learner fitted in sample, with no cross-fitting | SE ratio must fall below the overfitting ceiling | SE ratio 0.3477 to 0.3622 | pass | | `interval_calibration` | `competing_h2__correctly_specified` | positive | difference of always and never in the death incidence at t = 2: both nuisances are correctly specified with an independently computed efficiency bound | SE ratio and coverage intervals both inside their calibration bands, with both efficiency-ratio intervals inside their bands | coverage 0.9307 to 0.9502, SE ratio 0.9617 to 1.0199, empirical efficiency ratio 1.0135 to 1.0732, reported efficiency ratio 1.0297 to 1.0359 | pass | | `interval_calibration` | `competing_h2__noise_control` | control | difference of always and never in the death incidence at t = 2: one efficiency-bound unit of independent noise is added to each estimate | the empirical efficiency ratio must rise above the band | coverage 0.8235 to 0.8537, SE ratio 0.7040 to 0.7453, empirical efficiency ratio 1.3863 to 1.4659, reported efficiency ratio 1.0297 to 1.0360 | pass | | `interval_calibration` | `competing_h2__shrunken_se_control` | control | difference of always and never in the death incidence at t = 2: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | coverage 0.8059 to 0.8373, SE ratio 0.6736 to 0.7140, empirical efficiency ratio 1.0129 to 1.0727, reported efficiency ratio 0.7207 to 0.7252 | pass | | `interval_calibration` | `dynamic__correctly_specified` | positive | dynamic plan: both nuisances are correctly specified with an independently computed efficiency bound | SE ratio and coverage intervals both inside their calibration bands, with both efficiency-ratio intervals inside their bands | coverage 0.9396 to 0.9578, SE ratio 0.9806 to 1.0394, empirical efficiency ratio 0.9686 to 1.0263, reported efficiency ratio 1.0049 to 1.0077 | pass | | `interval_calibration` | `dynamic__noise_control` | control | dynamic plan: one efficiency-bound unit of independent noise is added to each estimate | the empirical efficiency ratio must rise above the band | coverage 0.8217 to 0.8520, SE ratio 0.6934 to 0.7357, empirical efficiency ratio 1.3679 to 1.4513, reported efficiency ratio 1.0049 to 1.0077 | pass | | `interval_calibration` | `dynamic__shrunken_se_control` | control | dynamic plan: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | coverage 0.8139 to 0.8448, SE ratio 0.6863 to 0.7281, empirical efficiency ratio 0.9675 to 1.0261, reported efficiency ratio 0.7034 to 0.7054 | pass | | `interval_calibration` | `msm_identity__correctly_specified` | positive | the duration coefficient of the identity-link working model: both nuisances are correctly specified with an independently computed efficiency bound | SE ratio and coverage intervals both inside their calibration bands, with both efficiency-ratio intervals inside their bands | coverage 0.9350 to 0.9539, SE ratio 0.9683 to 1.0276, empirical efficiency ratio 0.9923 to 1.0523, reported efficiency ratio 1.0170 to 1.0217 | pass | | `interval_calibration` | `msm_identity__noise_control` | control | the duration coefficient of the identity-link working model: one efficiency-bound unit of independent noise is added to each estimate | the empirical efficiency ratio must rise above the band | coverage 0.8245 to 0.8546, SE ratio 0.6990 to 0.7413, empirical efficiency ratio 1.3757 to 1.4584, reported efficiency ratio 1.0171 to 1.0218 | pass | | `interval_calibration` | `msm_identity__shrunken_se_control` | control | the duration coefficient of the identity-link working model: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | coverage 0.8150 to 0.8457, SE ratio 0.6777 to 0.7196, empirical efficiency ratio 0.9919 to 1.0527, reported efficiency ratio 0.7119 to 0.7152 | pass | | `interval_calibration` | `msm_logit__correctly_specified` | positive | the duration coefficient of the logit-link working model: both nuisances are correctly specified with an independently computed efficiency bound | SE ratio and coverage intervals both inside their calibration bands, with both efficiency-ratio intervals inside their bands | coverage 0.9386 to 0.9569, SE ratio 0.9692 to 1.0294, empirical efficiency ratio 1.0011 to 1.0634, reported efficiency ratio 1.0282 to 1.0326 | pass | | `interval_calibration` | `msm_logit__noise_control` | control | the duration coefficient of the logit-link working model: one efficiency-bound unit of independent noise is added to each estimate | the empirical efficiency ratio must rise above the band | coverage 0.8240 to 0.8542, SE ratio 0.6950 to 0.7376, empirical efficiency ratio 1.3970 to 1.4825, reported efficiency ratio 1.0282 to 1.0327 | pass | | `interval_calibration` | `msm_logit__shrunken_se_control` | control | the duration coefficient of the logit-link working model: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | coverage 0.8163 to 0.8469, SE ratio 0.6786 to 0.7201, empirical efficiency ratio 1.0020 to 1.0632, reported efficiency ratio 0.7198 to 0.7228 | pass | | `interval_calibration` | `mtp_up__correctly_specified` | positive | the shift up at both nodes against the natural course, continuous dose: both nuisances are correctly specified with an independently computed efficiency bound | SE ratio and coverage intervals both inside their calibration bands, with both efficiency-ratio intervals inside their bands | coverage 0.9359 to 0.9546, SE ratio 0.9676 to 1.0238, empirical efficiency ratio 1.0026 to 1.0606, reported efficiency ratio 1.0232 to 1.0296 | pass | | `interval_calibration` | `mtp_up__noise_control` | control | the shift up at both nodes against the natural course, continuous dose: one efficiency-bound unit of independent noise is added to each estimate | the empirical efficiency ratio must rise above the band | coverage 0.8276 to 0.8575, SE ratio 0.7004 to 0.7431, empirical efficiency ratio 1.3815 to 1.4652, reported efficiency ratio 1.0232 to 1.0296 | pass | | `interval_calibration` | `mtp_up__shrunken_se_control` | control | the shift up at both nodes against the natural course, continuous dose: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | coverage 0.8090 to 0.8402, SE ratio 0.6767 to 0.7169, empirical efficiency ratio 1.0016 to 1.0619, reported efficiency ratio 0.7162 to 0.7208 | pass | | `interval_calibration` | `policy_mix__correctly_specified` | positive | contrast of the known policy mix against low, three-level law: both nuisances are correctly specified with an independently computed efficiency bound | SE ratio and coverage intervals both inside their calibration bands, with both efficiency-ratio intervals inside their bands | coverage 0.9440 to 0.9614, SE ratio 0.9921 to 1.0521, empirical efficiency ratio 0.9617 to 1.0194, reported efficiency ratio 1.0098 to 1.0131 | pass | | `interval_calibration` | `policy_mix__noise_control` | control | contrast of the known policy mix against low, three-level law: one efficiency-bound unit of independent noise is added to each estimate | the empirical efficiency ratio must rise above the band | coverage 0.8219 to 0.8522, SE ratio 0.6949 to 0.7358, empirical efficiency ratio 1.3750 to 1.4555, reported efficiency ratio 1.0098 to 1.0131 | pass | | `interval_calibration` | `policy_mix__shrunken_se_control` | control | contrast of the known policy mix against low, three-level law: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | coverage 0.8230 to 0.8532, SE ratio 0.6945 to 0.7363, empirical efficiency ratio 0.9619 to 1.0193, reported efficiency ratio 0.7069 to 0.7092 | pass | | `interval_calibration` | `static__correctly_specified` | positive | static plan: both nuisances are correctly specified with an independently computed efficiency bound | SE ratio and coverage intervals both inside their calibration bands, with both efficiency-ratio intervals inside their bands | coverage 0.9318 to 0.9511, SE ratio 0.9637 to 1.0208, empirical efficiency ratio 1.0005 to 1.0589, reported efficiency ratio 1.0189 to 1.0233 | pass | | `interval_calibration` | `static__noise_control` | control | static plan: one efficiency-bound unit of independent noise is added to each estimate | the empirical efficiency ratio must rise above the band | coverage 0.8227 to 0.8530, SE ratio 0.6903 to 0.7336, empirical efficiency ratio 1.3921 to 1.4787, reported efficiency ratio 1.0189 to 1.0233 | pass | | `interval_calibration` | `static__shrunken_se_control` | control | static plan: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | coverage 0.8077 to 0.8390, SE ratio 0.6742 to 0.7144, empirical efficiency ratio 1.0011 to 1.0598, reported efficiency ratio 0.7132 to 0.7163 | pass | | `interval_calibration` | `survival_h2__correctly_specified` | positive | difference of always and never in the risk at t = 2, survival law: both nuisances are correctly specified with an independently computed efficiency bound | SE ratio and coverage intervals both inside their calibration bands, with both efficiency-ratio intervals inside their bands | coverage 0.9377 to 0.9562, SE ratio 0.9772 to 1.0353, empirical efficiency ratio 1.0022 to 1.0608, reported efficiency ratio 1.0342 to 1.0402 | pass | | `interval_calibration` | `survival_h2__noise_control` | control | difference of always and never in the risk at t = 2, survival law: one efficiency-bound unit of independent noise is added to each estimate | the empirical efficiency ratio must rise above the band | coverage 0.8178 to 0.8484, SE ratio 0.7041 to 0.7451, empirical efficiency ratio 1.3925 to 1.4726, reported efficiency ratio 1.0340 to 1.0401 | pass | | `interval_calibration` | `survival_h2__shrunken_se_control` | control | difference of always and never in the risk at t = 2, survival law: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | coverage 0.8095 to 0.8407, SE ratio 0.6847 to 0.7251, empirical efficiency ratio 1.0021 to 1.0603, reported efficiency ratio 0.7239 to 0.7281 | pass | | `power` | `static__alternative` | positive | static plan: the same test applied to a law with a real effect | rejection lower bound clears the minimum power | rejection 0.9637, 0.9431 to 0.9786 | pass | | `root_n_and_efficiency` | `static__n_1000` | positive | static plan: bias, coverage and SE calibration at n = 1,000 | bias inside the margin, coverage clears the floor, SE ratio inside the band | bias -0.000706, coverage 0.9282 to 0.9711, SE ratio 1.0228 | pass | | `root_n_and_efficiency` | `static__n_2000` | positive | static plan: 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.000667, coverage 0.9214 to 0.9665, SE ratio 0.9922 | pass | | `root_n_and_efficiency` | `static__n_8000` | positive | static plan: 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.0011, coverage 0.9214 to 0.9665, SE ratio 1.0002 | pass | | `root_n_rate` | `static__empirical_sd` | positive | static plan: 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.5565 to -0.4633 | pass | | `root_n_rate` | `static__reported_se` | positive | static plan: the same regression applied to the mean reported standard error | slope interval inside the root-n band and excluding -1/4 | slope -0.5221 to -0.5150 | pass | | `sdr_tmle_agreement` | `static` | diagnostic | the absolute difference of SDR and LTMLE over the SE of SDR, for always against never, on the calibration draws | reported only | mean absolute difference / SE 0.0087 | reported | | `sequential_double_robustness` | `P_A__n_2000` | positive | both outcome regressions are correct and both mechanisms are wrong, at n = 2,000 | absolute bias + 2 MCSE at n = 8,000 below 0.01 and below its value at n = 2,000, SE ratio inside the union-model band | absolute bias + 2 MCSE 0.0069, SE ratio 0.7200, coverage 0.8420 | pass | | `sequential_double_robustness` | `P_A__n_8000` | positive | both outcome regressions are correct and both mechanisms are wrong, at n = 8,000 | absolute bias + 2 MCSE at n = 8,000 below 0.01 and below its value at n = 2,000, SE ratio inside the union-model band | absolute bias + 2 MCSE 0.0023, SE ratio 0.7498, coverage 0.8730 | pass | | `sequential_double_robustness` | `P_B__n_2000` | positive | node 1 outcome regression wrong, node 2 mechanism wrong, at n = 2,000 | absolute bias + 2 MCSE at n = 8,000 below 0.01 and below its value at n = 2,000, SE ratio inside the union-model band | absolute bias + 2 MCSE 0.0073, SE ratio 0.6910, coverage 0.8160 | pass | | `sequential_double_robustness` | `P_B__n_8000` | positive | node 1 outcome regression wrong, node 2 mechanism wrong, at n = 8,000 | absolute bias + 2 MCSE at n = 8,000 below 0.01 and below its value at n = 2,000, SE ratio inside the union-model band | absolute bias + 2 MCSE 0.0023, SE ratio 0.6722, coverage 0.8260 | pass | | `sequential_double_robustness` | `P_C__n_2000` | positive | both mechanisms are correct and both outcome regressions are wrong, at n = 2,000 | bias inside the margin, SE ratio inside the union-model band, coverage clears the floor | bias -0.0064 to 0.0074, margin 0.0210, coverage 0.9100 to 0.9518, SE ratio 0.9868 | pass | | `sequential_double_robustness` | `P_C__n_8000` | positive | both mechanisms are correct and both outcome regressions are wrong, at n = 8,000 | bias inside the margin, SE ratio inside the union-model band, coverage clears the floor | bias -0.0014 to 0.0053, margin 0.0103, coverage 0.9307 to 0.9669, SE ratio 1.0106 | pass | | `sequential_double_robustness` | `P_D__n_2000` | positive | node 1 mechanism wrong, node 2 outcome regression wrong, the pattern LTMLE misses, at n = 2,000 | absolute bias + 2 MCSE at n = 8,000 below 0.01 and below its value at n = 2,000, SE ratio inside the union-model band | absolute bias + 2 MCSE 0.0083, SE ratio 0.6023, coverage 0.7620 | pass | | `sequential_double_robustness` | `P_D__n_8000` | positive | node 1 mechanism wrong, node 2 outcome regression wrong, the pattern LTMLE misses, at n = 8,000 | absolute bias + 2 MCSE at n = 8,000 below 0.01 and below its value at n = 2,000, SE ratio inside the union-model band | absolute bias + 2 MCSE 0.0036, SE ratio 0.5927, coverage 0.7650 | pass | | `sequential_double_robustness` | `both_correct__n_2000` | positive | every outcome regression and mechanism is correct, at n = 2,000 | bias inside the margin, SE ratio inside the union-model band, coverage clears the floor | bias 0.000011 to 0.0112, margin 0.0172, coverage 0.8853 to 0.9327, SE ratio 0.9459 | **fail** | | `sequential_double_robustness` | `both_correct__n_8000` | positive | every outcome regression and mechanism is correct, at n = 8,000 | bias inside the margin, SE ratio inside the union-model band, coverage clears the floor | bias -0.0018 to 0.0033, margin 0.0077, coverage 0.9295 to 0.9661, SE ratio 0.9994 | pass | | `sequential_double_robustness` | `ltmle_P_D_control` | control | LTMLE in pattern P_D, where its recursion needs the node 2 outcome regression | bias interval at least 3 empirical standard deviations from zero, SE ratio inside the union-model band | bias 0.2158 to 0.2235, empirical SD 0.0468, SE ratio 1.0199 | pass | | `sequential_double_robustness` | `node2_both_wrong_control` | control | SDR with the outcome regression and the mechanism both wrong at node 2 | bias interval at least 3 empirical standard deviations from zero, SE ratio inside the union-model band | bias 0.2158 to 0.2233, empirical SD 0.0456, SE ratio 1.0690 | pass | | `simultaneous_coverage` | `six_regimens__pointwise_joint_control` | control | the six regimen means and five contrasts of the two-node law: the pointwise 95% intervals of the same fits, read jointly | joint coverage upper endpoint must fall below the nominal rate | joint coverage 0.6739 to 0.7271 | pass | | `simultaneous_coverage` | `six_regimens__simultaneous_band` | positive | the six regimen means and five contrasts of the two-node law: the max-t multiplier band over every estimand the law reports, from the same-row centered influence curves | joint coverage interval inside the calibration coverage band | joint coverage 0.9085 to 0.9394 | **fail** | | `type_i_error` | `static__sharp_null` | positive | static plan: a confounded law whose true contrast is exactly zero | one-sided rejection bound stays under the declared type-I ceiling | rejection 0.0600, 0.0404 to 0.0850 | pass | | `weighted_calibration` | `selection_weighted__correctly_specified` | positive | contrast of always against never on the selected law, with weights: every nuisance is correct; no efficiency ratio is claimed (RM18-fixed-weights) | SE ratio and coverage intervals both inside their calibration bands | SE ratio 0.9681 to 1.0272, coverage 0.9273 to 0.9472 | pass | | `weighted_calibration` | `selection_weighted__noise_control` | control | contrast of always against never on the selected law, with weights: one efficiency-bound unit of independent noise is added to each estimate | the SE-ratio interval must fall below the calibration band | SE ratio 0.6900 to 0.7323, coverage 0.8093 to 0.8404 | pass | | `weighted_calibration` | `selection_weighted__shrunken_se_control` | control | contrast of always against never on the selected law, with weights: the reported standard errors are multiplied by a declared factor below one | the SE-ratio interval must fall below the calibration band | SE ratio 0.6777 to 0.7180, coverage 0.8038 to 0.8354 | pass | The `sequential_double_robustness` family reads the two-node law of `tests/discrete_law_longitudinal_sdr.py`. Each of the patterns P_A to P_D makes one nuisance wrong at each node, and the pattern `both_correct` makes none wrong. The patterns `both_correct` and `P_C` keep the ratios exact, so they gate the bias and the coverage at both sizes. The patterns `P_A`, `P_B` and `P_D` gate the absolute bias at n = 2,000 and n = 8,000, and report their coverage only. Theorem 4 needs the rate product for their intervals. Both controls make the same nuisances wrong at one node, and their bias clears the floor of 3 empirical SDs. The `construction_diagnostic` and `sdr_tmle_agreement` cells state no verdict. The stitched cell fits Step 2 of Section 5.3 as printed. The tree cell estimates the mechanism with trees of at least 50 rows a leaf, under the default bounds (0.01, 1). Two property cells fail their own rule, and the diagnosis finds no defect in `SDR`. The [`X4-finite-sample`](../../roadmap.md#red-cell-owners) owner holds the coverage cell. The [`band-finite-sample`](../../roadmap.md#red-cell-owners) owner holds the band. | cell | measured | reading | | --- | --- | --- | | `sequential_double_robustness/both_correct__n_2000` | coverage 0.911, 99% interval 0.885 to 0.933, against a floor of 0.90; SE ratio 0.946 | finite-sample, shared with LTMLE | | `simultaneous_coverage/six_regimens__simultaneous_band` | joint coverage 0.925, 99% interval 0.909 to 0.939, against a band of 0.92 to 0.98 | finite-sample, pointwise shortfall inherited | **The `both_correct` cell at n = 2,000.** The law's smallest path probability is near 0.012, so an inverse weight can reach about 85. At n = 2,000 the standard error then varies with the error it measures. A diagnostic refitted the cell's own fit and `LTMLE` with the same learners on the same 1,000 fresh draws ([`tests/diagnostics/x4_both_correct/`](https://github.com/esbraun/cleverly-tmle/tree/main/tests/diagnostics/x4_both_correct)). | engine | coverage | SE ratio | coefficient of variation of the SE | correlation of SE and error | | --- | ---: | ---: | ---: | ---: | | `SDR` | 0.903 | 0.918 | 0.186 | 0.301 | | `LTMLE` | 0.903 | 0.917 | 0.187 | 0.321 | The two engines cover equally on the same draws. The same cell at n = 8,000 covers 0.950, with an SE ratio of 0.999. A defect in the `SDR` curve would not be shared with `LTMLE`, and would not disappear as $n$ grows. **The band.** The band reads every regimen mean and contrast of the six-plan law. The oracle band at the exact-law critical value of 2.693 covers 0.931 on the same replications. The package band covers 0.925 at a mean critical value of 2.683. The shortfall therefore comes from the pointwise intervals. The other cells that the `band-finite-sample` owner holds read the same way. `tests/unit/test_sdr_shortfall_reading.py` rebuilds the coverage reading from the committed rows. `tests/unit/test_band_shortfall_reading.py` rebuilds the band reading. ## Measured values and declared margins Names beginning `margin:` are thresholds declared before the run. Everything else is measured from the committed results and checked at the precision printed. | quantity | value | source | | --- | --- | --- | | `replicates` | 1000 | paired replications | | `n` | 2000 | observations per paired replication | | `independent_tests_passed` | 60 | truth tests passing | | `independent_tests_total` | 60 | truth tests reported | | `paired_tests_passed` | 30 | paired comparisons passing | | `paired_tests_total` | 30 | paired comparisons reported | | `property_cells_passed` | 54 | property cells passing | | `property_cells_total` | 56 | property cells reported | | `property_cells_reported` | 3 | diagnostic cells with no verdict | | `max_standardized_bias` | 0.0871 | largest primary standardized bias | | `min_coverage` | 0.9340 | lowest primary coverage | | `max_margin_utilization` | 0.0829 | largest paired similarity-margin share | | `margin:confidence_level` | 0.9900 | Monte Carlo confidence level | | `margin:alpha` | 0.0500 | test size | | `margin:bootstrap_replicates` | 10000 | bootstrap replications | | `margin:nominal_coverage` | 0.9500 | nominal interval coverage | | `margin:over_coverage_ceiling` | 0.9900 | descriptive overcoverage threshold | | `margin:se_ratio_sanity_lower` | 0.8000 | primary SE-ratio lower screen | | `margin:se_ratio_sanity_upper` | 1.2000 | primary SE-ratio upper screen | | `margin:coverage_noninferiority` | -0.0250 | coverage-difference noninferiority bound | | `margin:rmse_noninferiority` | 1.1000 | RMSE-ratio noninferiority bound | | `margin:calibration_noninferiority` | 0.0500 | calibration-excess noninferiority bound | | `margin:root_n_slope` | -0.5000 | expected root-n slope | | `margin:root_n_slope_lower` | -0.6250 | root-n slope lower bound | | `margin:root_n_slope_upper` | -0.3750 | root-n slope upper bound | | `margin:excluded_slope` | -0.2500 | slower rate the interval must exclude | | `margin:overfit_coverage_gain` | 0.1500 | minimum paired coverage gain | | `margin:standardized_bias` | 0.2500 | standardized-bias margin | | `margin:coverage_floor` | 0.9000 | primary coverage floor | | `margin:calibration_se_ratio_lower` | 0.9300 | calibration SE-ratio lower bound | | `margin:calibration_se_ratio_upper` | 1.0700 | calibration SE-ratio upper bound | | `margin:calibration_coverage_lower` | 0.9200 | calibration coverage lower bound | | `margin:calibration_coverage_upper` | 0.9800 | calibration coverage upper bound | | `margin:paired_difference` | 0.1500 | paired similarity margin in pooled SDs | | `margin:efficiency_ratio_lower` | 0.9000 | exact-EIF ratio lower bound | | `margin:efficiency_ratio_upper` | 1.1000 | exact-EIF ratio upper bound | | `margin:shrunken_se_factor` | 0.7000 | negative-control SE multiplier | | `margin:overfit_se_floor` | 0.8500 | cross-fitted tree SE-ratio lower bound | | `margin:overfit_control_ceiling` | 0.7500 | in-sample tree SE-ratio upper bound | | `margin:type_i_ceiling` | 0.1000 | type-I upper bound | | `margin:minimum_power` | 0.8000 | power lower bound | ## Limits | limit | what it means for use | | --- | --- | | finite-support laws with two nodes, and one continuous-dose law | the evidence covers these laws, with plans and policies fixed before the run | | the mechanism is known in every primary scenario | both sides read the generating ratio. An estimated mechanism appears in the tree diagnostic cell only, which states no verdict | | parametric node regressions in the primary scenarios | a quasibinomial GLM and least squares. The overfitting family adds fully grown trees with a known mechanism | | the cross-fitted pairs compare two constructions | `lmtp` stitches Step 2 across folds, and this package runs the training-fold recursion. The pairs are margins pairs, not exactness checks | | the one-correct patterns report coverage only | an interval under `P_A`, `P_B` or `P_D` needs the Theorem 4 rate product, which a wrong nuisance does not meet | | two property cells are red under `reporting` | a finite-sample coverage cell at n = 2,000 shared with LTMLE, and a band that inherits its pointwise shortfall. The `X4-finite-sample` and `band-finite-sample` owners hold them | | clusters, weights and an MSM are calibration cells only | the `clustered_calibration`, `weighted_calibration` and `msm_*` cells have no `lmtp` pairing | | no multiply robust interval | page 854 of the source states that neither SDR nor TMLE gives one |