ppict

Evidence sheet / October 2026

Source

The interval shrank.
The error rate held.

Prediction-powered covariate adjustment, measured in 22,400 null trials and on one real randomized trial split.

ACTG 175 treatment effect estimates and 95 percent intervals Unadjusted 65.73 CD4 cells, interval 40.22 to 91.24. L1 lasso 65.72, interval 45.53 to 85.90. Group-lasso PPI++ 66.89, interval 45.90 to 87.89. Unadjusted 51.02 wide L1 lasso 40.37 wide Group-lasso PPI++ 41.99 wide 40 50 60 70 80 90
ACTG 175, CD4 cells at week 20. 527 patients in the analysis half. Bars are 95% intervals. One stratified split.
17.7% narrower than unadjusted
24 / 24 null cells held alpha
0.0 app, CLI, API difference

What it does

One estimator. Four ways to run it.

  1. 1

    Hold out the score

    The prognostic score trains on patients outside the analysis half.

  2. 2

    Select groups

    Permutation-assisted group lasso, calibrated against a null.

  3. 3

    Tune one value

    PPI++ estimates a single tuning scalar from labeled data.

  4. 4

    Report

    Effect, interval, design projection and SAP appendix.

Python package / CLI / R package / calculator

Null sweep

8 scenarios. 400 trials each. True effect zero.

Rejection rate at alpha 0.05 for each scenario and method
Scenario Unadjusted PPI++ single L1 lasso
Good score 4.50 4.50 6.00
Weak score 5.00 4.25 5.75
Poorly estimated 6.25 6.75 8.75*
Noise added 4.50 5.25 6.00
Predicted shuffled 4.50 4.75 6.00
Bias added 4.50 4.50 6.00
Sign flipped 4.50 4.50 6.00
History shift 4.50 4.00 6.00

Rejection rate at alpha 0.05. 400 replicates per row. Single-tuning column shown; the 24 cells include per-arm and lambda=1. * p = 0.0011 against no inflation; every other cell p > 0.05.

Interval width relative to unadjusted

PPI++ single-tuning. Lower is narrower. 400 paired replicates each.

A shuffled score gives up and falls back to the unadjusted analysis. History shift costs part of the gain.

ACTG 175

527 patients / CD4 at week 20 / one split

Treatment effect estimates, intervals and widths on ACTG 175
Method Estimate 95% interval Width
Unadjusted 65.73 40.22 to 91.24 51.02
L1 lasso 65.72 45.53 to 85.90 40.37
Group-lasso PPI++ 66.89 45.90 to 87.89 41.99

Negative control

1,000 permuted labels

Unadjusted 5.1%
Adjusted 4.0%
Corrupted 5.1%

All three are consistent with alpha 0.05.

The L1 lasso is narrower here, and it is the method that fails the null sweep. It selects covariates on the same patients it estimates on. The adjusted row uses a score fitted on held-out ACTG controls, not the TCGA expression score.

TCGA-BRCA

780 ER-labelled samples / 5-fold / 20,227 genes

0.9337 0.9551
L2 logistic ppict group lasso

83 genes in the final fit

ESR1, PGR, FOXA1 among the strongest

0 shared patients with the trial

0 expression columns in ACTG 175

The expression score is real and external. It is not transported: the trial has no expression data and the outcomes are on different scales.

What the calculator returns

Simulated 720-patient file / 80% power / $4,200 per patient

16.7% interval narrowing
264 fewer patients
$1.11M trial cost avoided
10.6 months saved

App, CLI and API agree to 0.0 on identical input. Cost and time are projections, not observed savings.

101 Python tests / 4 R test files / 460 parity values, max difference 7.4e-9 / R CMD check OK.

SAP appendix, PDF LaTeX source Run it locally

What this does not show