Session 12
PMAP 8521: Program evaluation
Andrew Young School of Policy Studies
Treatment effects and compliance
Treatment effects and compliance
Randomized promotion
Treatment effects and compliance
Randomized promotion
Fuzzy regression discontinuity
δ=(Y| P=1)−(Y| P=0)
δ=(Y| P=1)−(Y| P=0)
δ (delta) = causal effect
δ=(Y| P=1)−(Y| P=0)
δ (delta) = causal effect
P = Program
δ=(Y| P=1)−(Y| P=0)
δ (delta) = causal effect
P = Program
Y = Outcome
δ=(Y| P=1)−(Y| P=0)
δ (delta) = causal effect
P = Program
Y = Outcome
δ=Y1−Y0
Fundamental problem
of causal inference
Fundamental problem
of causal inference
δi=Y1i−Y0iin real life isδi=Y1i−???
Fundamental problem
of causal inference
δi=Y1i−Y0iin real life isδi=Y1i−???
Individual-level effects are
impossible to observe!
Difference between average/expected value when
program is on vs. expected value when program is off
ATE=E(Y1−Y0)=E(Y1)−E(Y0)
Difference between average/expected value when
program is on vs. expected value when program is off
ATE=E(Y1−Y0)=E(Y1)−E(Y0)
Can be found for a whole population, on average
δ=(ˉY | P=1)−(ˉY | P=0)
Every individual has a
treatment/causal effect
Every individual has a
treatment/causal effect
ATE = average of all
unit-level causal effects
Every individual has a
treatment/causal effect
ATE = average of all
unit-level causal effects
ATE = Average effect
for the whole population
Average treatment on the treated
ATT/TOT
Average treatment on the treated
ATT/TOT
Conditional average treatment effect
CATE
Local average treatment effect (LATE) =
weighted ATE
Narrower effect; only applies to some of the population
Local average treatment effect (LATE) =
weighted ATE
Narrower effect; only applies to some of the population
You can't make population-level
claims with LATE
Local average treatment effect (LATE) =
weighted ATE
Narrower effect; only applies to some of the population
You can't make population-level
claims with LATE
(But that can be okay!)
In RDD, LATE = people in the bandwidth
In RDD, LATE = people in the bandwidth
In RCTs and IVs, LATE = compliers
Complier
Treatment
follows assignment
Always taker
Gets treatment
regardless of assignment
Complier
Treatment
follows assignment
Always taker
Gets treatment
regardless of assignment
Never taker
Rejects treatment
regardless of assignment
Defier
Does the opposite
of assignment
We can generally assume
that defiers don't exist
We can generally assume
that defiers don't exist
In drug trials this makes sense; you can't get access
to medicine without being in treatment group
We can generally assume
that defiers don't exist
In drug trials this makes sense; you can't get access
to medicine without being in treatment group
In development it can make sense; in a bed net RCT,
a defier assigned to treatment would have to
tear down all existing bed nets out of spite
Monotonicity assumption
Monotonicity assumption
Assignment to treatment only
has an effect in one direction
Monotonicity assumption
Assignment to treatment only
has an effect in one direction
Assignment to treatment can only
increase—not decrease—your actual chance of treatment
Intent to treat (ITT)
Effect of assignment (not actual treatment!)
Intent to treat (ITT)
Effect of assignment (not actual treatment!)
Complier Average Causal Effect (CACE)
LATE for the compliers
Complier Average Causal Effect (CACE)
LATE for the compliers
An NGO distributes mosquito bed nets to help
improve health by reducing malaria infection rate
An NGO distributes mosquito bed nets to help
improve health by reducing malaria infection rate
We can read everyone's minds and we know if
people are always takers, never takers, or compliers
But we can't read minds! This is what we actually see:
(Actually this is what we see)
ITT = πcompliers×(T−C)compliers+πalways takers×(T−C)always takers+πnever takers×(T−C)never takersITT = πCCACE+πAATACE+πNNTACE
ITT = πCCACE+πAATACE+πNNTACE
ITT = πCCACE+πAATACE+πNNTACE
Treatment received is same regardless of assignment!
Being assigned to treatment doesn't influence ATs and NTs
ITT = πCCACE+πAATACE+πNNTACE
Treatment received is same regardless of assignment!
Being assigned to treatment doesn't influence ATs and NTs
ITT = πCCACE+πA×0+πN×0
ITT = πCCACE+πAATACE+πNNTACE= πCCACE+πA×0+πN×0ITT = πCCACE
ITT = πCCACE+πAATACE+πNNTACE= πCCACE+πA×0+πN×0ITT = πCCACE
CACE=ITTπC
ITT = πCCACE+πAATACE+πNNTACE= πCCACE+πA×0+πN×0ITT = πCCACE
CACE=ITTπC
ITT and πC are both findable!
ITT = effect of assignment to treatment on outcome
ITT=(ˉy | Treatment)−(ˉy | Control)
ITT = effect of assignment to treatment on outcome
ITT=(ˉy | Treatment)−(ˉy | Control)
bed_nets %>% group_by(treatment) %>% summarize(avg = mean(health))
## # A tibble: 2 × 2## treatment avg## <chr> <dbl>## 1 Control 40.9## 2 Treatment 46.9
ITT = effect of assignment to treatment on outcome
ITT=(ˉy | Treatment)−(ˉy | Control)
bed_nets %>% group_by(treatment) %>% summarize(avg = mean(health))
## # A tibble: 2 × 2## treatment avg## <chr> <dbl>## 1 Control 40.9## 2 Treatment 46.9
itt_model <- lm(health ~ treatment, data = bed_nets)tidy(itt_model)
## # A tibble: 2 × 2## term estimate## <chr> <dbl>## 1 (Intercept) 40.9 ## 2 treatmentTreatment 5.99
People in treatment group who complied are a combination of Always Takers and Compliers
πA+πC=% yes in treatment; orπC=% yes in treatment−πA
πC=% yes in treatment−πA
πC=% yes in treatment−πA
We can assume that the proportion of Always Takers
is the same across treatment and control
πC=% yes in treatment−πA
We can assume that the proportion of Always Takers
is the same across treatment and control
We know how many people were in control but still used nets—that's πA!
πC=% yes in treatment−πA=% yes in treatment−% yes in control
bed_nets %>% group_by(treatment, bed_net) %>% summarize(n = n()) %>% mutate(prop = n / sum(n))
## # A tibble: 4 × 4## # Groups: treatment [2]## treatment bed_net n prop## <chr> <fct> <int> <dbl>## 1 Control No bed net 808 0.805## 2 Control Bed net 196 0.195## 3 Treatment No bed net 388 0.390## 4 Treatment Bed net 608 0.610
πC=% yes in treatment−πA=% yes in treatment−% yes in control
bed_nets %>% group_by(treatment, bed_net) %>% summarize(n = n()) %>% mutate(prop = n / sum(n))
## # A tibble: 4 × 4## # Groups: treatment [2]## treatment bed_net n prop## <chr> <fct> <int> <dbl>## 1 Control No bed net 808 0.805## 2 Control Bed net 196 0.195## 3 Treatment No bed net 388 0.390## 4 Treatment Bed net 608 0.610
# pi_c = prop yes in treatment - # prop yes in controlpi_c <- 0.6104418 - 0.1952191pi_c
## [1] 0.4152227
41.5% compliers!
CACE=ITTπC
CACE=ITTπC
ITT <- tidy(itt_model) %>% filter(term == "treatmentTreatment") %>% pull(estimate)ITT
## [1] 5.987992
pi_c
## [1] 0.4152227
CACE=ITTπC
ITT <- tidy(itt_model) %>% filter(term == "treatmentTreatment") %>% pull(estimate)ITT
## [1] 5.987992
pi_c
## [1] 0.4152227
CACE <- ITT / pi_cCACE
## [1] 14.42116
Bed nets cause 14.4 point
increase in health for compliers
CACE=ITTπC
ITT=(ˉy | Treatment)−(ˉy | Control)
πC = % yes in treatment−% yes in control
LATE for the compliers
LATE for the compliers
If you use assignment to treatment as an instrument,
you can find the causal effect for just compliers
LATE for the compliers
If you use assignment to treatment as an instrument,
you can find the causal effect for just compliers
Instrumental variables in general give you the CACE
model_2sls <- iv_robust(health ~ bed_net | treatment, data = bed_nets)tidy(model_2sls)
## term estimate std.error statistic p.value## 1 (Intercept) 38.12285 0.5150818 74.01320 0.000000e+00## 2 bed_netBed net 14.42116 1.2538198 11.50178 1.086989e-29
Same 14.421 effect!
What if you have a program
that anyone can opt in to?
What if you have a program
that anyone can opt in to?
ACA, voting, employer retirement matching
What if you have a program
that anyone can opt in to?
ACA, voting, employer retirement matching
You can't just look at outcomes
of participants vs. non-participants!
Selection bias!
What if you have a program
that anyone can opt in to?
ACA, voting, employer retirement matching
You can't just look at outcomes
of participants vs. non-participants!
Selection bias!
You can't randomly
assign people to it either
Ethics!
What if you encourage
some people to participate?
What if you encourage
some people to participate?
What if the encouragement is randomized?
What if you encourage
some people to participate?
What if the encouragement is randomized?
Valid treatment/control groups?
What if you encourage
some people to participate?
What if the encouragement is randomized?
Valid treatment/control groups?
Not really…
…but also, kind of!
…but also, kind of!
Encouragement/promotion =
an instrument!
Relevant?
Z → X Cor(Z, X) ≠ 0
Promotion causes people
to use the program. Yep.
Relevant?
Z → X Cor(Z, X) ≠ 0
Promotion causes people
to use the program. Yep.
Exclusive?
Z → X → Y Z ↛ Y Cor(Z, Y | X) = 0
Promotion causes outcome
only through program? Yep.
Relevant?
Z → X Cor(Z, X) ≠ 0
Promotion causes people
to use the program. Yep.
Exclusive?
Z → X → Y Z ↛ Y Cor(Z, Y | X) = 0
Promotion causes outcome
only through program? Yep.
Exogenous?
U ↛ Z Cor(Z, U) = 0
Unobserved things that influence outcome don't also influence promotion?
Yep.
Always Takers
People who will always
enroll in program
Always Takers
People who will always
enroll in program
Never Takers
People who will never
enroll in program
Always Takers
People who will always
enroll in program
Never Takers
People who will never
enroll in program
Compliers / Enrollers-if-Promoted
People who will enroll in the program if encouraged to
id | outcome | program | promotion |
---|---|---|---|
1 | 45 | TRUE | TRUE |
2 | 55 | TRUE | FALSE |
3 | 52 | FALSE | FALSE |
4 | 39 | FALSE | TRUE |
id | outcome | program | promotion |
---|---|---|---|
1 | 45 | TRUE | TRUE |
2 | 55 | TRUE | FALSE |
3 | 52 | FALSE | FALSE |
4 | 39 | FALSE | TRUE |
iv_robust(outcome ~ program | promotion)
id | outcome | program | promotion |
---|---|---|---|
1 | 45 | TRUE | TRUE |
2 | 55 | TRUE | FALSE |
3 | 52 | FALSE | FALSE |
4 | 39 | FALSE | TRUE |
iv_robust(outcome ~ program | promotion)
This will show the LATE for promoted-ees!
id | outcome | program | promotion |
---|---|---|---|
1 | 45 | TRUE | TRUE |
2 | 55 | TRUE | FALSE |
3 | 52 | FALSE | FALSE |
4 | 39 | FALSE | TRUE |
iv_robust(outcome ~ program | promotion)
This will show the LATE for promoted-ees!
Says nothing about the effect of the program on Always Takers or Never Takers
Fuzzy discontinuities imply noncompliance
Fuzzy discontinuities imply noncompliance
Address noncompliance with
instrumental variables
Instrument = above/below cutoff
i.e. what they were supposed to do
Instrument = above/below cutoff
i.e. what they were supposed to do
(This is just like the CACE we just did!)
Relevant?
Z → X Cor(Z, X) ≠ 0
Cutoff causes program? Yep.
Relevant?
Z → X Cor(Z, X) ≠ 0
Cutoff causes program? Yep.
Exclusive?
Z → X → Y Z ↛ Y Cor(Z, Y | X) = 0
Cutoff causes outcome
only through program? Yep.
Relevant?
Z → X Cor(Z, X) ≠ 0
Cutoff causes program? Yep.
Exclusive?
Z → X → Y Z ↛ Y Cor(Z, Y | X) = 0
Cutoff causes outcome
only through program? Yep.
Exogenous?
U ↛ Z Cor(Z, U) = 0
Unobserved things that influence outcome don't also influence cutoff?
It's an arbitrary cutoff, so sure.
Effect is only for
(1) compliers (2) near the cutoff
Be specific when talking about effects;
definitely don't make population-level claims
Step 1: Center running variable + make threshold variable
tutoring_centered <- tutoring %>% mutate(entrance_centered = entrance_exam - 70, below_cutoff = entrance_exam <= 70)head(tutoring_centered, 6)
## # A tibble: 6 × 6## id entrance_exam tutoring exit_exam entrance_centered below_cutoff## <int> <dbl> <lgl> <dbl> <dbl> <lgl> ## 1 1 92.4 FALSE 78.1 22.4 FALSE ## 2 2 72.8 FALSE 58.2 2.77 FALSE ## 3 3 53.7 TRUE 62.0 -16.3 TRUE ## 4 4 98.3 FALSE 67.5 28.3 FALSE ## 5 5 69.7 TRUE 54.1 -0.288 TRUE ## 6 6 68.1 TRUE 60.1 -1.93 TRUE
Step 2: Use cutoff as instrument in 2SLS model
# Bandwidth ± 10fuzzy1 <- iv_robust( exit_exam ~ entrance_centered + tutoring | entrance_centered + below_cutoff, data = filter(tutoring_centered, entrance_centered >= -10 & entrance_centered <= 10))tidy(fuzzy1)
## term estimate std.error statistic p.value## 1 (Intercept) 60.1413558 1.01765573 59.097939 9.746624e-200## 2 entrance_centered 0.4366281 0.09929619 4.397229 1.407213e-05## 3 tutoringTRUE 9.7410444 1.91184891 5.095091 5.384163e-07
Use the fuzzy
argument in rdrobust()
Important! Specify actual treatment status,
not the instrument of above/below the cutoff
rdrobust(y = tutoring$exit_exam, x = tutoring$entrance_exam, c = 70, fuzzy = tutoring$tutoring) %>% summary()
## First-stage estimates.## ## =============================================================================## Method Coef. Std. Err. z P>|z| [ 95% C.I. ] ## =============================================================================## Conventional -0.708 0.073 -9.751 0.000 [-0.850 , -0.565]
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
o | Tile View: Overview of Slides |
Esc | Back to slideshow |
Session 12
PMAP 8521: Program evaluation
Andrew Young School of Policy Studies
Treatment effects and compliance
Treatment effects and compliance
Randomized promotion
Treatment effects and compliance
Randomized promotion
Fuzzy regression discontinuity
δ=(Y| P=1)−(Y| P=0)
δ=(Y| P=1)−(Y| P=0)
δ (delta) = causal effect
δ=(Y| P=1)−(Y| P=0)
δ (delta) = causal effect
P = Program
δ=(Y| P=1)−(Y| P=0)
δ (delta) = causal effect
P = Program
Y = Outcome
δ=(Y| P=1)−(Y| P=0)
δ (delta) = causal effect
P = Program
Y = Outcome
δ=Y1−Y0
Fundamental problem
of causal inference
Fundamental problem
of causal inference
δi=Y1i−Y0iin real life isδi=Y1i−???
Fundamental problem
of causal inference
δi=Y1i−Y0iin real life isδi=Y1i−???
Individual-level effects are
impossible to observe!
Difference between average/expected value when
program is on vs. expected value when program is off
ATE=E(Y1−Y0)=E(Y1)−E(Y0)
Difference between average/expected value when
program is on vs. expected value when program is off
ATE=E(Y1−Y0)=E(Y1)−E(Y0)
Can be found for a whole population, on average
δ=(ˉY | P=1)−(ˉY | P=0)
Every individual has a
treatment/causal effect
Every individual has a
treatment/causal effect
ATE = average of all
unit-level causal effects
Every individual has a
treatment/causal effect
ATE = average of all
unit-level causal effects
ATE = Average effect
for the whole population
Average treatment on the treated
ATT/TOT
Average treatment on the treated
ATT/TOT
Conditional average treatment effect
CATE
Local average treatment effect (LATE) =
weighted ATE
Narrower effect; only applies to some of the population
Local average treatment effect (LATE) =
weighted ATE
Narrower effect; only applies to some of the population
You can't make population-level
claims with LATE
Local average treatment effect (LATE) =
weighted ATE
Narrower effect; only applies to some of the population
You can't make population-level
claims with LATE
(But that can be okay!)
In RDD, LATE = people in the bandwidth
In RDD, LATE = people in the bandwidth
In RCTs and IVs, LATE = compliers
Complier
Treatment
follows assignment
Always taker
Gets treatment
regardless of assignment
Complier
Treatment
follows assignment
Always taker
Gets treatment
regardless of assignment
Never taker
Rejects treatment
regardless of assignment
Defier
Does the opposite
of assignment
We can generally assume
that defiers don't exist
We can generally assume
that defiers don't exist
In drug trials this makes sense; you can't get access
to medicine without being in treatment group
We can generally assume
that defiers don't exist
In drug trials this makes sense; you can't get access
to medicine without being in treatment group
In development it can make sense; in a bed net RCT,
a defier assigned to treatment would have to
tear down all existing bed nets out of spite
Monotonicity assumption
Monotonicity assumption
Assignment to treatment only
has an effect in one direction
Monotonicity assumption
Assignment to treatment only
has an effect in one direction
Assignment to treatment can only
increase—not decrease—your actual chance of treatment
Intent to treat (ITT)
Effect of assignment (not actual treatment!)
Intent to treat (ITT)
Effect of assignment (not actual treatment!)
Complier Average Causal Effect (CACE)
LATE for the compliers
Complier Average Causal Effect (CACE)
LATE for the compliers
An NGO distributes mosquito bed nets to help
improve health by reducing malaria infection rate
An NGO distributes mosquito bed nets to help
improve health by reducing malaria infection rate
We can read everyone's minds and we know if
people are always takers, never takers, or compliers
But we can't read minds! This is what we actually see:
(Actually this is what we see)
ITT = πcompliers×(T−C)compliers+πalways takers×(T−C)always takers+πnever takers×(T−C)never takersITT = πCCACE+πAATACE+πNNTACE
ITT = πCCACE+πAATACE+πNNTACE
ITT = πCCACE+πAATACE+πNNTACE
Treatment received is same regardless of assignment!
Being assigned to treatment doesn't influence ATs and NTs
ITT = πCCACE+πAATACE+πNNTACE
Treatment received is same regardless of assignment!
Being assigned to treatment doesn't influence ATs and NTs
ITT = πCCACE+πA×0+πN×0
ITT = πCCACE+πAATACE+πNNTACE= πCCACE+πA×0+πN×0ITT = πCCACE
ITT = πCCACE+πAATACE+πNNTACE= πCCACE+πA×0+πN×0ITT = πCCACE
CACE=ITTπC
ITT = πCCACE+πAATACE+πNNTACE= πCCACE+πA×0+πN×0ITT = πCCACE
CACE=ITTπC
ITT and πC are both findable!
ITT = effect of assignment to treatment on outcome
ITT=(ˉy | Treatment)−(ˉy | Control)
ITT = effect of assignment to treatment on outcome
ITT=(ˉy | Treatment)−(ˉy | Control)
bed_nets %>% group_by(treatment) %>% summarize(avg = mean(health))
## # A tibble: 2 × 2## treatment avg## <chr> <dbl>## 1 Control 40.9## 2 Treatment 46.9
ITT = effect of assignment to treatment on outcome
ITT=(ˉy | Treatment)−(ˉy | Control)
bed_nets %>% group_by(treatment) %>% summarize(avg = mean(health))
## # A tibble: 2 × 2## treatment avg## <chr> <dbl>## 1 Control 40.9## 2 Treatment 46.9
itt_model <- lm(health ~ treatment, data = bed_nets)tidy(itt_model)
## # A tibble: 2 × 2## term estimate## <chr> <dbl>## 1 (Intercept) 40.9 ## 2 treatmentTreatment 5.99
People in treatment group who complied are a combination of Always Takers and Compliers
πA+πC=% yes in treatment; orπC=% yes in treatment−πA
πC=% yes in treatment−πA
πC=% yes in treatment−πA
We can assume that the proportion of Always Takers
is the same across treatment and control
πC=% yes in treatment−πA
We can assume that the proportion of Always Takers
is the same across treatment and control
We know how many people were in control but still used nets—that's πA!
πC=% yes in treatment−πA=% yes in treatment−% yes in control
bed_nets %>% group_by(treatment, bed_net) %>% summarize(n = n()) %>% mutate(prop = n / sum(n))
## # A tibble: 4 × 4## # Groups: treatment [2]## treatment bed_net n prop## <chr> <fct> <int> <dbl>## 1 Control No bed net 808 0.805## 2 Control Bed net 196 0.195## 3 Treatment No bed net 388 0.390## 4 Treatment Bed net 608 0.610
πC=% yes in treatment−πA=% yes in treatment−% yes in control
bed_nets %>% group_by(treatment, bed_net) %>% summarize(n = n()) %>% mutate(prop = n / sum(n))
## # A tibble: 4 × 4## # Groups: treatment [2]## treatment bed_net n prop## <chr> <fct> <int> <dbl>## 1 Control No bed net 808 0.805## 2 Control Bed net 196 0.195## 3 Treatment No bed net 388 0.390## 4 Treatment Bed net 608 0.610
# pi_c = prop yes in treatment - # prop yes in controlpi_c <- 0.6104418 - 0.1952191pi_c
## [1] 0.4152227
41.5% compliers!
CACE=ITTπC
CACE=ITTπC
ITT <- tidy(itt_model) %>% filter(term == "treatmentTreatment") %>% pull(estimate)ITT
## [1] 5.987992
pi_c
## [1] 0.4152227
CACE=ITTπC
ITT <- tidy(itt_model) %>% filter(term == "treatmentTreatment") %>% pull(estimate)ITT
## [1] 5.987992
pi_c
## [1] 0.4152227
CACE <- ITT / pi_cCACE
## [1] 14.42116
Bed nets cause 14.4 point
increase in health for compliers
CACE=ITTπC
ITT=(ˉy | Treatment)−(ˉy | Control)
πC = % yes in treatment−% yes in control
LATE for the compliers
LATE for the compliers
If you use assignment to treatment as an instrument,
you can find the causal effect for just compliers
LATE for the compliers
If you use assignment to treatment as an instrument,
you can find the causal effect for just compliers
Instrumental variables in general give you the CACE
model_2sls <- iv_robust(health ~ bed_net | treatment, data = bed_nets)tidy(model_2sls)
## term estimate std.error statistic p.value## 1 (Intercept) 38.12285 0.5150818 74.01320 0.000000e+00## 2 bed_netBed net 14.42116 1.2538198 11.50178 1.086989e-29
Same 14.421 effect!
What if you have a program
that anyone can opt in to?
What if you have a program
that anyone can opt in to?
ACA, voting, employer retirement matching
What if you have a program
that anyone can opt in to?
ACA, voting, employer retirement matching
You can't just look at outcomes
of participants vs. non-participants!
Selection bias!
What if you have a program
that anyone can opt in to?
ACA, voting, employer retirement matching
You can't just look at outcomes
of participants vs. non-participants!
Selection bias!
You can't randomly
assign people to it either
Ethics!
What if you encourage
some people to participate?
What if you encourage
some people to participate?
What if the encouragement is randomized?
What if you encourage
some people to participate?
What if the encouragement is randomized?
Valid treatment/control groups?
What if you encourage
some people to participate?
What if the encouragement is randomized?
Valid treatment/control groups?
Not really…
…but also, kind of!
…but also, kind of!
Encouragement/promotion =
an instrument!
Relevant?
Z → X Cor(Z, X) ≠ 0
Promotion causes people
to use the program. Yep.
Relevant?
Z → X Cor(Z, X) ≠ 0
Promotion causes people
to use the program. Yep.
Exclusive?
Z → X → Y Z ↛ Y Cor(Z, Y | X) = 0
Promotion causes outcome
only through program? Yep.
Relevant?
Z → X Cor(Z, X) ≠ 0
Promotion causes people
to use the program. Yep.
Exclusive?
Z → X → Y Z ↛ Y Cor(Z, Y | X) = 0
Promotion causes outcome
only through program? Yep.
Exogenous?
U ↛ Z Cor(Z, U) = 0
Unobserved things that influence outcome don't also influence promotion?
Yep.
Always Takers
People who will always
enroll in program
Always Takers
People who will always
enroll in program
Never Takers
People who will never
enroll in program
Always Takers
People who will always
enroll in program
Never Takers
People who will never
enroll in program
Compliers / Enrollers-if-Promoted
People who will enroll in the program if encouraged to
id | outcome | program | promotion |
---|---|---|---|
1 | 45 | TRUE | TRUE |
2 | 55 | TRUE | FALSE |
3 | 52 | FALSE | FALSE |
4 | 39 | FALSE | TRUE |
id | outcome | program | promotion |
---|---|---|---|
1 | 45 | TRUE | TRUE |
2 | 55 | TRUE | FALSE |
3 | 52 | FALSE | FALSE |
4 | 39 | FALSE | TRUE |
iv_robust(outcome ~ program | promotion)
id | outcome | program | promotion |
---|---|---|---|
1 | 45 | TRUE | TRUE |
2 | 55 | TRUE | FALSE |
3 | 52 | FALSE | FALSE |
4 | 39 | FALSE | TRUE |
iv_robust(outcome ~ program | promotion)
This will show the LATE for promoted-ees!
id | outcome | program | promotion |
---|---|---|---|
1 | 45 | TRUE | TRUE |
2 | 55 | TRUE | FALSE |
3 | 52 | FALSE | FALSE |
4 | 39 | FALSE | TRUE |
iv_robust(outcome ~ program | promotion)
This will show the LATE for promoted-ees!
Says nothing about the effect of the program on Always Takers or Never Takers
Fuzzy discontinuities imply noncompliance
Fuzzy discontinuities imply noncompliance
Address noncompliance with
instrumental variables
Instrument = above/below cutoff
i.e. what they were supposed to do
Instrument = above/below cutoff
i.e. what they were supposed to do
(This is just like the CACE we just did!)
Relevant?
Z → X Cor(Z, X) ≠ 0
Cutoff causes program? Yep.
Relevant?
Z → X Cor(Z, X) ≠ 0
Cutoff causes program? Yep.
Exclusive?
Z → X → Y Z ↛ Y Cor(Z, Y | X) = 0
Cutoff causes outcome
only through program? Yep.
Relevant?
Z → X Cor(Z, X) ≠ 0
Cutoff causes program? Yep.
Exclusive?
Z → X → Y Z ↛ Y Cor(Z, Y | X) = 0
Cutoff causes outcome
only through program? Yep.
Exogenous?
U ↛ Z Cor(Z, U) = 0
Unobserved things that influence outcome don't also influence cutoff?
It's an arbitrary cutoff, so sure.
Effect is only for
(1) compliers (2) near the cutoff
Be specific when talking about effects;
definitely don't make population-level claims
Step 1: Center running variable + make threshold variable
tutoring_centered <- tutoring %>% mutate(entrance_centered = entrance_exam - 70, below_cutoff = entrance_exam <= 70)head(tutoring_centered, 6)
## # A tibble: 6 × 6## id entrance_exam tutoring exit_exam entrance_centered below_cutoff## <int> <dbl> <lgl> <dbl> <dbl> <lgl> ## 1 1 92.4 FALSE 78.1 22.4 FALSE ## 2 2 72.8 FALSE 58.2 2.77 FALSE ## 3 3 53.7 TRUE 62.0 -16.3 TRUE ## 4 4 98.3 FALSE 67.5 28.3 FALSE ## 5 5 69.7 TRUE 54.1 -0.288 TRUE ## 6 6 68.1 TRUE 60.1 -1.93 TRUE
Step 2: Use cutoff as instrument in 2SLS model
# Bandwidth ± 10fuzzy1 <- iv_robust( exit_exam ~ entrance_centered + tutoring | entrance_centered + below_cutoff, data = filter(tutoring_centered, entrance_centered >= -10 & entrance_centered <= 10))tidy(fuzzy1)
## term estimate std.error statistic p.value## 1 (Intercept) 60.1413558 1.01765573 59.097939 9.746624e-200## 2 entrance_centered 0.4366281 0.09929619 4.397229 1.407213e-05## 3 tutoringTRUE 9.7410444 1.91184891 5.095091 5.384163e-07
Use the fuzzy
argument in rdrobust()
Important! Specify actual treatment status,
not the instrument of above/below the cutoff
rdrobust(y = tutoring$exit_exam, x = tutoring$entrance_exam, c = 70, fuzzy = tutoring$tutoring) %>% summary()
## First-stage estimates.## ## =============================================================================## Method Coef. Std. Err. z P>|z| [ 95% C.I. ] ## =============================================================================## Conventional -0.708 0.073 -9.751 0.000 [-0.850 , -0.565]