A scoring rule ranks the evaluation population before outcomes are
used to choose a subgroup size. URATE() estimates the
effect among the highest-ranked fraction and constructs a uniform
confidence band over all subgroup sizes. The rule may be fitted on
independent training data. Inference conditions on that realized rule
and does not require it to consistently estimate CATE. The evaluation
data must satisfy the manuscript’s random-sampling and complete-
randomization assumptions. Cross-validated scores require a different
argument and are not supported by this uniform-band procedure.
library(evalHTE)
set.seed(91)
n <- 120
score <- rnorm(n) # a prespecified rule in this simulated example
D <- sample(rep(0:1, each=n/2))
Y <- rnorm(n) + D*(1+score)
band <- URATE(D, score, Y, alpha=.1, L=1000, seed=801)
k <- band$selected
data.frame(n_selected=k,proportion=band$p[k],effect=band$rate[k],
lower=band$lower[k])
#> n_selected proportion effect lower
#> 1 30 0.25 2.261076 0.951516The selected size maximizes the uniform lower bound, with ties resolved in favor of the smallest subgroup. The uniform guarantee permits this selection. A pointwise interval or p-value at that size would not provide the same post-selection guarantee. Coverage applies to one rule and outcome; choosing among multiple models or covariates is not covered by that guarantee.
plot_CI(band)The plot uses the stored calibration. Supplying alpha to
plot_CI() or to summary() for an evaluated HTE
object recalibrates the same reference with the same seed. Two-sided
bands require side="two.sided" at evaluation and are
calibrated using absolute Gaussian paths. An upper band uses
side="upper".
For a baseline covariate, use D=NULL. The following
curve compares each subgroup’s covariate mean with the evaluation
population mean. The endpoint contrast is zero by construction.
Selection based on this curve minimizes the upper bound; evaluating a
subgroup selected by another curve instead uses its rank index
directly.
X <- score + rnorm(n)
composition <- URATE(NULL, score, X, adjustment="difference", side="upper",
alpha=.1, L=1000, seed=2801)
c(estimate=composition$rate[k],upper=composition$upper[k])
#> estimate upper
#> 1.398961 1.873475To use fitted models, retain an independent evaluation sample through the existing sample-splitting workflow:
fit <- estimate_hte(treatment="D",form=Y ~ D + X,data=training_and_evaluation,
algorithms="causal_forest",split_ratio=.4,ngates=5)
result <- evaluate_hte(fit,alpha=.1,L=50000,seed=801)
summary(result)
plot_CI(result)URATE() uses uncentered outcomes and the observed
evaluation treatment fraction. It estimates the marginal effect in
consecutive rank blocks with a finite-block residual correction.
Gaussian draws retain the dependence from the estimated ranking
threshold and fixed treatment counts. Each endpoint contrast transforms
the entire draw before calibration.
The default objective minimizes cumulative boundary area.
objective="gates" minimizes the area of the GATES band
above p_min; this integration limit does not restrict the
coverage or selection domain. The finite slope grid and Monte Carlo
quantiles approximate the asymptotic procedure. A warning at the largest
slope calls for a wider grid, and final analyses should increase
L.
The revised prostate application uses alpha=.1,
L=50000, the cumulative objective, and model-specific seeds
801 through 804. Exact replication also requires the paper’s saved
split, preprocessing, fitted scores, and model settings. The generic
training defaults do not reproduce those fitted models. The paper adds a
fixed Gaussian perturbation to its scores before evaluation; pass those
saved scores without adding another perturbation. Package tie handling
randomizes exact ties only. Neither evaluation nor plotting changes the
caller’s random-number state.