load("job_displacement_data.RData")
Exercise 2b
For this exercise, we will revisit the job displacement example from Exercise 1, but we will try out some alternative identification strategies: (i) change-in-changes, (ii) conditioning on lagged outcomes, and (iii) interactive fixed effects.
To start with, load the data from the file job_displacement_data.RData
by running
which will load a data.frame
called job_displacement_data
. This is what the data looks like
head(job_displacement_data)
id year group income female white occ_score
1 7900002 1984 0 31130 1 1 4
2 7900002 1985 0 32200 1 1 3
3 7900002 1986 0 35520 1 1 4
4 7900002 1987 0 43600 1 1 4
5 7900002 1988 0 39900 1 1 4
6 7900002 1990 0 38200 1 1 4
You can see that the data contains the following columns:
id
- an individual identifieryear
- the year for this observationgroup
- the year that person lost his/her job.group=0
for those that do not lose a job in any period being considered.income
- a person’s wage and salary income in this yearfemale
- 1 for females, 0 for maleswhite
- 1 for white, 0 for non-white
For the results below, we will mainly use the qte
, pte
, and ife
packages. pte
and ife
in particular are new packages, so we will download the newest versions of these from GitHub. We will also need the BMisc
and dplyr
packages.
::install_github("bcallaway11/qte")
devtools::install_github("bcallaway11/pte")
devtools::install_github("bcallaway11/ife")
devtools::install_github("bcallaway11/BMisc")
devtoolsinstall.packages("dplyr")
and then the packages can be loaded by
library(qte) # for change-in-changes
library(pte) # for lagged outcomes
library(ife) # for interactive fixed effects
library(BMisc)
library(dplyr)
Below, we will basically try to replicate Question 1 from Exercise 1, but use alternative identification strategies.
Question 1 — change-in-changes
Use the qte
package to compute all available group-time average treatment effects, an event study, and an overall average treatment effect. The function that can deal with multiple periods and variation in treatment timing is called cic2
. In the results below, I also allow for one year of anticipation based on our discussion in the previous exercise.
Question 2 — lagged outcome
Use the pte
package to compute all available group-time average treatment effects, an event study, and an overall average treatment effect. The function pte_default
can allow for conditioning on lagged outcomes (it can also allow for a number of other extensions as well — see documentation) In the results below, I also allow for one year of anticipation based on our discussion in the previous exercise.
Question 3 — interactive fixed effects
Use the ife
package to compute all available group-time average treatment effects, an event study, and an overall average treatment effect. The function that can deal with multiple periods and variation in treatment timing is called staggered_ife2
— this function will use the groups to identify causal effect parameters and does not require us to specify additional instruments. We will allow for one interactive fixed effect, by setting nife=1
, but you can try other values. ife
does not currently support allowing for anticipation, so we will remove it for these results.
Question 4
What do you make of the results in this excercise relative to each other and relative to the previous results from Exercise 1 that used difference-in-differences?