Paired 2x2 Factorial Design for Treatment Effect Identification and Estimation in the Presence of Paired Interference and Noncompliance


Download PDF (0.6 MB)


I propose an experimental design, the Paired 2x2 Factorial Design, together with two strategies for treatment effect identification and estimation from a large sample of pairs, comprised of distinguishable members (e.g. couples with a healthy and an ill member), when (i) there is interference: the potential outcomes of a pair member do not only depend on the member’s own treatment participation but on his/her partner’s participation too; (ii) there is (endogenous) noncompliance: the units may not comply perfectly with their treatment encouragement; (iii) the experimenter can have two different binary treatments and two different outcomes of interest for the different members in a pair; (iv) units within a pair are allowed to coordinate their treatment participation based on their encouragement. The latter, number (iv), is my main contribution, as this has not been addressed by previous studies.

The first strategy uses only half of the sample to identify the effects of both treatments on both pair members, in certain complier subpopulations, under the usual instrumental variables assumptions. The second strategy, the main theoretical result, uses the whole sample to identify the same treatment effects, relying on the same set of assumptions.

The use of the design is illustrated, in theory, on a sample of married couples where one member suffers from depression. The treatment is an antidepressant for the depressed member and an educational program for the healthy partner.


Assume that pim_data.csv is an experimental data set to which the estimator can be applied. You can use the Julia package TreatmentEffects.jl in the following way to compute the LATE estimates.

In a Julia REPL step into the Pkg by pressing ]. Run add Press backspace to quit Pkg. In the REPL:

using TreatmentEffects, CSV
data = read_csv("pim_data.csv")
y = data[:outcome]
d_a = data[:treatment_takeup_a]  # d_a_i=1 iff i'th member-A is treated
d_b = data[:treatment_takeup_b]  # d_b_i=1 iff i'th member-B is treated
z_a = data[:treatment_assignment_a]  # z_a_i=1 iff i'th member-A is assigned to treated
z_b = data[:treatment_assignment_b]  # z_b_i=1 iff i'th member-B is assigned to treated
m = PairedInterferenceModel(y, d_a, d_b, z_a, z_b)
late_estimates = late_estimator(m) # -> [baseline, late_for_treatmentA_compliers, late_for_treatmentB_compliers, noise]