I want to analyze the results of a block randomized experiment. Within each block, units are randomized to treatment and control as if that block were a completely randomized experiment. Specifically, I want an unbiased estimator for the overall treatment effect and an estimate of the variance of this estimator.

If the probability of receiving treatment is the same in each block, then an unbiased estimate of the overall average treatment effect ATE can be obtained like so:

$$\hat{ATE} = \sum_{j=1}^J \frac{N_j}{N}\hat{ATE_j}$$ Where:

  • N = Total Number of units in the experiment
  • $N_j$ = Number of units in block j
  • $\hat{ATE_j}$ is the Average Treatment Effect in block j. Specifically, $$ \hat{ATE_j} = \bar{Y}_{j,treatment} - \bar{Y}_{j,control}$$

$\bar{Y}_{j,treatment}$ is the average observed outcome in the treatment group in block j and $\bar{Y}_{j,control}$ is the average observed outcome in the control group in block j.

The difficulty is that the probability of treatment varies by the strata/blocks. So, some blocks have 50% of their units treated and others have, for example, 10% treated. I've been told that the above estimator for ATE is only unbiased if the probability of treatment is constant across the blocks and that, otherwise, I need to use some kind of Horvitz-Thompson weighting, weighting the units by their inverse probability of treatment, in order to get an unbiased estimator.

I can't find any literature on this. Do I need to use horvitz-thompson or some other kind of weighting? Or can I still use the estimator above? Any references would be especially appreciated.



1 Answer 1


I don't think this is the case. Each $ATE_j$ is unbiased, so weighted average of them should be unbiased as well because the expectation is linear operator.

Here's a 500 rep simulation in Stata where the treatment effect is set to 15 with 50 blocks of 100 observations (on average):

capture program drop mybs
program define mybs, rclass
qui set obs 5
gen block = _n
gen p_treat = uniform()
gen n = rpoisson(100)
qui expand n
gen treated = uniform()<p_treat
gen y = rnormal(100,15)
qui replace y = y + 15 if treated == 1
collapse (mean) y (count) n=y, by(block treated)
qui reshape wide y n, i(block) j(treated)
qui gen TE = y1-y0
qui gen N=n0+n1
qui sum TE [fw=N]
return scalar ate = r(mean) 

set seed 123456
simulate ate = r(ate), reps(500): mybs
sum ate, detail

There does not appear to be any bias here:

. sum ate, detail

      Percentiles      Smallest
 1%     9.240335       7.301056
 5%     11.53554       7.853343
10%     12.34418       8.115672       Obs                 500
25%     13.81046       8.936302       Sum of Wgt.         500

50%     15.07377                      Mean           15.03785
                        Largest       Std. Dev.      2.191757
75%     16.31851       20.99205
90%     17.74527       21.72955       Variance         4.8038
95%     18.50914       21.98358       Skewness      -.0549813
99%     20.30977       24.24625       Kurtosis       4.139082

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.