Inside a stratum X = x:
E[Y(1)|x] in [m1 p1 + ymin (1-p1), m1 p1 + ymax (1-p1)] and
E[Y(0)|x] in [m0 p0 + ymin (1-p0), m0 p0 + ymax (1-p0)], with
p1 = P(D=1|x), p0 = 1 - p1, m1 = E[Y|D=1,x],
m0 = E[Y|D=0,x]. Differencing the opposite ends gives the
stratum ATE bound, whose width is exactly ymax - ymin however
the data fall – the signature of the no-assumption bound, and the
reason it always contains zero.
Details
Two population summaries follow, answering different questions.
lower/upper average the stratum bounds with weights
P(x): the bound on the population ATE, weakly tighter than
pooling first. inter_lower/inter_upper INTERSECT the
stratum bounds, which is valid only under the extra assumption of a
common effect across strata; it is reported separately and flagged
empty when the strata disagree.
