* Running this code requires three setup steps: * 1) Enter the filepath to your working directory at "global filepath..." below * 2) Download the two datafiles from the replication files for Borjas ILRR 2017: marchcps.dta and cpsorg.dta * 3) Install the user-written program -latabstat- by Ian Watson. To install, type at the command line: net search latabstat version 14.2 clear all set more off global filepath "XXXXXXXXXXXXXXXXXXXX" capture log close cd "$filepath" log using "$filepath/ExtraTables.log", replace ******************************************************************************** * Scatterplot ******************************************************************************** use "$filepath/marchcps.dta", clear gen black = race==200 keep if year!=1980 & year<1993 // Drop years that are not used in Borjas differences-in-differences regression mean black [aw=wtsupp] if metarea==5000 & edcode==1, over(year) mat list e(b) mat march_black = e(b) mat march_black = march_black' mean lweekly [aw=wtsupp] if metarea==5000 & edcode==1, over(year) mat list e(b) mat march_wage = e(b) mat march_wage = march_wage' mat march_compare = march_black,march_wage mat list march_compare ** CPS graph mat years = (1976,1977,1978,1979,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992) mat years=years' mat march_compare = years,march_compare svmat march_compare rename march_compare1 year_black rename march_compare2 march_black_miami rename march_compare3 march_wage_miami graph twoway scatter march_wage_miami march_black_miami if year_black<=1979, msymbol(none) mlabel(year_black) mlabpos(0) mlabcolor(red) /// || scatter march_wage_miami march_black_miami if year_black>=1981 & year_black<=1989, msymbol(none) mlabel(year_black) mlabpos(0) mlabcolor(blue) /// || lfit march_wage_miami march_black_miami, lcolor(gs12) /// scheme(s1color) plotregion(lcolor(none) margin(none)) ylabel(, format(%03.1f)) ytick(4.9(.1)5.8) xlab(0.2(.2)1, format(%03.1f)) xtick(0.2(.1)1) /// ytitle("log wage in sample", margin(medsmall)) xtitle("Black fraction in sample", margin(small)) legend(off) graphregion(margin(large)) /// text(4.7 .17 "Pre-Boatlift in red;", size(small) color(red)) text(4.7 0.35 "post-Boatlift in blue", size(small) color(blue)) /// text(4.7 .9 "Miami only, March CPS", color(gs10) size(small)) cd "$filepath" graph export black_wage_compare.pdf, replace ******************************************************************************** * Regression tables ******************************************************************************** clear all #delimit; set more off; /* First show black indicator varies greatly between cities, and racial composition of sample very different in treatment and control */ use "$filepath/marchcps.dta", replace; generate black=(race==200); /* Note Miami is by far most heavily black, among less-than-high-school than controls, and note Card controls have relatively more blacks among less-thab-high-school */ generate miami=(metarea==5000); latabstat black if edcode==1 & (miami | placebo1), by(metarea) stats(mean) columns(s) format(%03.2f) labelwidth(50); latabstat black if edcode==1 & (miami | placebo2), by(metarea) stats(mean) columns(s) format(%03.2f) labelwidth(50); /* Black dummy varies greatly by city */ reg lweekly black##b5000.metarea age* if edcode==1 & (miami | placebo1); reg lweekly black##b5000.metarea age* if edcode==1 & (miami | placebo2); ******************************************************************************** * Define program to replicate Borjas Table 5 in March CPS ******************************************************************************** capture program drop Table5March; program define Table5March; syntax , [label(string)] [fe(string)] [controls(string)] [outcome(string)]; use "$filepath/marchcps.dta", replace; generate black=(race==200); generate miami=(metarea==5000); gen dropout_black=(black & edcode==1); egen fixedeffects=group(`fe'); replace aweekly=.; forvalues yr = 1976/2003 {; quietly areg lweekly `controls' [aw=wtsupp] if year==`yr', absorb(fixedeffects); predict zw`yr', resid; replace aweekly=zw`yr' if year==`yr'; }; drop zw*; * save "$filepath\junkcps.dta", replace; * recode educ (2 = 0) (10=2.5) (11=1) (12=2) (13=3) (14=4) (20=5.5) (21=5) (22=6) (30=7.5) (31=7) (32=8) (40=9) (50=10) (60=11) (71/72=12), gen(yearseduc); recode educ (2 = 0) (10=4) (11=1) (12=2) (13=3) (14=4) (20=6) (21=5) (22=6) (30=8) (31=7) (32=8) (40=9) (50=10) (60=11) (71/72=12), gen(yearseduc); drop if year==1980; tabulate agecode; *THE COLLAPSE STATEMENT WILL REWEIGH PERSONS; *THOSE WHO WORK MORE WEEKS COUNT MORE; *generate rweight=wtsupp*weeks; ***** Strange to reweight with an endogenous variable (weeks); *generate rweight=wtsupp; generate rweight=wtsupp*weeks; collapse (mean) aweekly educ yearseduc (count) nobs=aweekly [aw=rweight], by(metarea year edcode); reshape wide aweekly nobs educ yearseduc, i(metarea year) j(edcode); recode year (1976/1979 = 1977) (1980 = 1980) (1981/1983 = 1983) (1984/1986 = 1986) (1987/1989 = 1989) (1990/1992 = 1992) (1993/1995 = 1995) (1996/1998 = 1998) (1999/2001 = 2001), gen(yearcode) ; *CARD'S PLACEBO; generate placebo1=(metarea==520 | metarea==3360 | metarea==4480 | metarea==8280); *SAME EMPLOYMENT GROWTH PLACEBO; generate placebo2=(metarea==4481 | metarea==6840 | metarea==5601 | metarea==7400); *USES THE LOW-SKILL EMPLOYMENT PLACEBO; generate placebo3=(metarea==1602 |metarea==3360 | metarea==4480 | metarea==3480); generate miami=(metarea==5000); generate after=(year>1980); generate mp=miami*after; *DEFINES RELEVANT RELATIVE WAGES; *generate aweekly14=aweekly1-aweekly4; *generate aweekly12=aweekly1-aweekly2; *WEIGHT BASED ON NUMBER OF OBSERVATIONS USED TO CALCULATE DEPENDENT VARIABLE; *generate weight14=(nobs1*nobs4)/(nobs1+nobs4); *generate weight12=(nobs1*nobs2)/(nobs1+nobs2); *THE SECOND STAGE REGRESSIONS SHOULD NOT INCLUDE METROPOLITAN AREA FIXED EFFECTS; *THOSE EFFECTS WERE ALREADY ADJUSTED FOR IN THE FIRST STAGE GETTING THE RESIDUALS; *REGRESSIONS WITH PLACEBO1; generate y1=miami*(yearcode==1983); generate y2=miami*(yearcode==1986); generate y3=miami*(yearcode==1989); generate y4=miami*(yearcode==1992); tabulate year, gen(dyear); drop if year==1976 | year>=1993; *tabulate year if placebo1==1; #delimit; eststo Card_`label': areg `outcome' miami after y1 y2 y3 y4 dyear* [aw=nobs1] if (placebo1==1 | miami==1), absorb(metarea) robust; eststo Borjas_`label': areg `outcome' miami after y1 y2 y3 y4 dyear* [aw=nobs1] if (placebo2==1 | miami==1), absorb(metarea) robust; eststo Low_`label': areg `outcome' miami after y1 y2 y3 y4 dyear* [aw=nobs1] if (placebo3==1 | miami==1), absorb(metarea) robust; eststo All_`label': areg `outcome' miami after y1 y2 y3 y4 dyear* [aw=nobs1], absorb(metarea) robust; end; ******************************************************************************** * Define program to replicate Borjas Table 5 in ORG ******************************************************************************** capture program drop Table5ORG; program define Table5ORG; syntax , [label(string)] [fe(string)] [controls(string)] [outcome(string)]; use "$filepath/cpsorg.dta", replace; generate black=(race==2); gen dropout_black=(black & edcode==1); egen fixedeffects=group(`fe'); replace awage=.; forvalues yr = 1977/2003 {; quietly areg lwage `controls' [aw=earnwt] if year==`yr', absorb(fixedeffects); predict zw`yr', resid; replace awage=zw`yr' if year==`yr'; }; drop zw*; *NOTE WILL INCREASE THE 1979 SAMPLE BY USING THE PRE-MARCH 1980 ORG DATA; replace year=1979 if year==1980 & intmonth<=3; drop if year==1980; gen yearseduc = educ if educ>=0 & educ<=12; *THE COLLAPSE STATEMENT WILL REWEIGH PERSONS; *THOSE WHO WORK MORE WEEKS COUNT MORE; generate rweight=earnwt*uhourse; collapse (mean) awage educ yearseduc (count) nobs=awage [aw=rweight], by(metarea year edcode); reshape wide awage nobs educ yearseduc, i(metarea year) j(edcode); recode year (1976/1979 = 1977) (1980 = 1980) (1981/1983 = 1983) (1984/1986 = 1986) (1987/1989 = 1989) (1990/1992 = 1992) (1993/1995 = 1995) (1996/1998 = 1998) (1999/2001 = 2001), gen(yearcode) ; *CARD'S PLACEBO; generate placebo1=(metarea==520 | metarea==3360 | metarea==4480 | metarea==8280); *SAME EMPLOYMENT GROWTH PLACEBO; generate placebo2=(metarea==4481 | metarea==6840 | metarea==5601 | metarea==7400); *USES THE LOW-SKILL EMPLOYMENT PLACEBO; generate placebo3=(metarea==1602 |metarea==3360 | metarea==4480 | metarea==3480); generate miami=(metarea==5000); generate after=(year>1980); generate mp=miami*after; replace placebo1=1 if placebo1==1 | miami==1; replace placebo2=1 if placebo2==1 | miami==1; replace placebo3=1 if placebo3==1 | miami==1; generate y1=miami*(yearcode==1983); generate y2=miami*(yearcode==1986); generate y3=miami*(yearcode==1989); generate y4=miami*(yearcode==1992); tabulate year, gen(dyear); drop if year==1976; drop if year>=1993; tabulate year if placebo1==1; #delimit; eststo Card_`label': areg `outcome' miami after y1 y2 y3 y4 dyear* [aw=nobs1] if (placebo1==1), absorb(metarea) robust; eststo Borjas_`label': areg `outcome' miami after y1 y2 y3 y4 dyear* [aw=nobs1] if (placebo2==1), absorb(metarea) robust; eststo Low_`label': areg `outcome' miami after y1 y2 y3 y4 dyear* [aw=nobs1] if (placebo3==1), absorb(metarea) robust; eststo All_`label': areg `outcome' miami after y1 y2 y3 y4 dyear* [aw=nobs1], absorb(metarea) robust; end; ******************************************************************************** * After programs defined, generate tables ******************************************************************************** cd "$filepath"; est clear; Table5March, label(replication_march) fe(metarea) controls(dage*) outcome(aweekly1); Table5March, label(black_nation_march) fe(metarea) controls(black dage*) outcome(aweekly1); Table5March, label(blackXcity_march) fe(metarea black) controls(black dage*) outcome(aweekly1); Table5March, label(blackXcityed_march) fe(metarea dropout_black) controls(black dage*) outcome(aweekly1); esttab Card_replication_march Borjas_replication_march Card_black_nation_march Borjas_black_nation_march Card_blackXcity_march Borjas_blackXcity_march Card_blackXcityed_march Borjas_blackXcityed_march, keep(y1 y2 y3 y4) se; esttab Card_replication_march Borjas_replication_march Card_black_nation_march Borjas_black_nation_march Card_blackXcity_march Borjas_blackXcity_march Card_blackXcityed_march Borjas_blackXcityed_march using table5_blog.tex, se ar2 compress star(* 0.10 ** 0.05 *** 0.01) replace keep(y1 y2 y3 y4) booktabs alignment(D{.}{.}{-1}) title(Table 5 reanalysis March CPS) scalars(N); est clear; Table5ORG, label(replication_org) fe(metarea) controls(dage*) outcome(awage1); Table5ORG, label(black_nation_org) fe(metarea) controls(black dage*) outcome(awage1); Table5ORG, label(blackXcity_org) fe(metarea black) controls(black dage*) outcome(awage1); Table5ORG, label(blackXcityed_org) fe(metarea dropout_black) controls(black dage*) outcome(awage1); esttab Card_replication_org Borjas_replication_org Card_black_nation_org Borjas_black_nation_org Card_blackXcity_org Borjas_blackXcity_org Card_blackXcityed_org Borjas_blackXcityed_org, keep(y1 y2 y3 y4) se; esttab Card_replication_org Borjas_replication_org Card_black_nation_org Borjas_black_nation_org Card_blackXcity_org Borjas_blackXcity_org Card_blackXcityed_org Borjas_blackXcityed_org using table5_blog.tex, se ar2 compress star(* 0.10 ** 0.05 *** 0.01) append keep(y1 y2 y3 y4) booktabs alignment(D{.}{.}{-1}) title(Table 5 reanalysis ORG CPS) scalars(N); #delimit; est clear; Table5March, label(replication_march) fe(metarea) controls(dage*) outcome(aweekly2); Table5ORG, label(replication_org) fe(metarea) controls(dage*) outcome(awage2); esttab Card_replication_march Borjas_replication_march Card_replication_org Borjas_replication_org using table5_blog.tex, se ar2 compress star(* 0.10 ** 0.05 *** 0.01) append keep(y1 y2 y3 y4) booktabs alignment(D{.}{.}{-1}) title(Table 5 reanalysis High School only) scalars(N); #delimit; est clear; Table5March, label(replication_march) fe(metarea) controls(dage*) outcome(yearseduc1); esttab Card_replication_march Borjas_replication_march using table5_blog.tex, se ar2 compress star(* 0.10 ** 0.05 *** 0.01) append keep(y1 y2 y3 y4) booktabs alignment(D{.}{.}{-1}) title(Table 5 reanalysis education outcome) scalars(N); log close;