Skip to contents

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.

Usage

Mskbnd2(y, D, X, y_min, y_max)

Arguments

y

Observed outcomes, all within [y_min, y_max].

D

Binary treatment indicator.

X

Stratum label per unit.

y_min, y_max

A priori outcome support.

Value

List with lower, upper, width, inter_lower, inter_upper, n_strata, n.

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.

References

Manski (1990), AER P&P 80(2), 319-323; Manski (2003), Partial Identification of Probability Distributions, Springer. Standard published form; neither source was available locally, so the bound is stated in full above for checking.

Examples

set.seed(12)
X <- rep(c("a", "b"), each = 50)
D <- rbinom(100, 1, 0.5)
y <- runif(100)
Mskbnd2(y, D, X, y_min = 0, y_max = 1)[c("lower", "upper")]
#> $lower
#> [1] -0.5360215
#> 
#> $upper
#> [1] 0.4639785
#>