/* M Perraillon - RDD Decemeber 2020 */ use "H:\Teaching\Methods 2020\lectures\Week 10 RDD\code\LMB Data.dta", clear describe score demvoteshare age sex medianincome pcturban pctblack * Treatment variable gen d = 1 replace d = 0 if demvoteshare < 0.5 * Summary statistics sum demvoteshare age sex medianincome pcturban pctblack if d==1 sum demvoteshare age sex medianincome pcturban pctblack if d==0 * Summary stats around a window sum demvoteshare age sex medianincome pcturban pctblack if d==1 & (demvoteshare>.40 & demvoteshare<.60) sum demvoteshare age sex medianincome pcturban pctblack if d==0 & (demvoteshare>.40 & demvoteshare<.60) * Graph scatter score demvoteshare, msize(tiny) xline(0.5) xtitle("Democrat vote share") ytitle("ADA score") graph export lee1.png, replace * Smoothing to see trends * Lowess capture drop lowess_y_d1 lowess_y_d0 lowess score demvoteshare if d ==1, gen (lowess_y_d1) nograph bw(0.5) lowess score demvoteshare if d ==0, gen (lowess_y_d0) nograph bw(0.5) scatter score demvoteshare, msize(tiny) xline(0.5) xtitle("Democrat vote share") /// ytitle("ADA score") || /// line lowess_y_d1 demvoteshare if democrat ==1, sort color(red) || /// line lowess_y_d0 demvoteshare if democrat ==0, sort color(red) legend(off) /// title("Lowess") graph export lee_lowess.png, replace * Jitter scatter score demvoteshare, msize(tiny) xline(0.5) xtitle("Democrat vote share") /// ytitle("ADA score") jitter(5) graph export lee_j.png, replace * Binned graph qui cmogram score demvoteshare, cut(.5) scatter line(.5) qfit graph export lee_binned.png, replace * with linear plot qui cmogram score demvoteshare, cut(.5) scatter line(.5) lfit graph export lin.gph, replace * lowess smoothing qui cmogram score demvoteshare, cut(.5) scatter line(.5) lowess /// title("Lowess trend") graph export cmlowes.png, replace graph combine lin.gph lowess.gph, xcommon col(1) graph export lin_low.png, repl /// -- Parametric model gen x_c = demvoteshare - 0.5 gen x2_c = x_c^2 reg score i.d##c.x_c, robust predict double yhatm1 if e(sample) scatter score demvoteshare, msize(tiny) xline(0.5) xtitle("Democrat vote share") /// ytitle("ADA score") || /// line yhatm1 demvoteshare if democrat ==1, sort color(red) || /// line yhatm1 demvoteshare if democrat ==0, sort color(red) legend(off) /// title("Linear") graph export lee_xc.png, replace * Quadratic reg score i.d##(c.x_c##c.x_c), robust predict double yhatm2 if e(sample) scatter score demvoteshare, msize(tiny) xline(0.5) xtitle("Democrat vote share") /// ytitle("ADA score") || /// line yhatm2 demvoteshare if democrat ==1, sort color(red) || /// line yhatm2 demvoteshare if democrat ==0, sort color(red) legend(off) /// title("Quadratic") graph export lee_xc2.png, replace * Quadractic around a window reg score i.d##(c.x_c##c.x_c) if (demvoteshare>.40 & demvoteshare<.60), robust predict double yhatm2_w if e(sample) scatter score demvoteshare, msize(tiny) xline(0.5 0.4 0.6) xtitle("Democrat vote share") /// ytitle("ADA score") || /// line yhatm2_w`' demvoteshare if democrat ==1, sort color(red) || /// line yhatm2_w demvoteshare if democrat ==0, sort color(red) legend(off) /// title("Quadratic around window") graph export lee_xc2_w.png, replace * Drop quadractic reg score i.d##c.x_c if (demvoteshare>.40 & demvoteshare<.60), robust * No running variable reg score i.d if (demvoteshare>.40 & demvoteshare<.60), robust predict double yhatflat_w if e(sample) scatter score demvoteshare, msize(tiny) xline(0.5 0.4 0.6) xtitle("Democrat vote share") /// ytitle("ADA score") || /// line yhatflat_w demvoteshare if democrat ==1, sort color(red) || /// line yhatflat_w demvoteshare if democrat ==0, sort color(red) legend(off) /// title("Not including running variable in model") graph export lee_flat.png, replace /// --- Include a covariate reg score i.d##(c.demvoteshare##c.demvoteshare) pcturban, robust * Save mean of pcturban qui sum pcturban scalar mu = r(mean) preserve * Hold pcturban at mean replace pcturban = scalar(mu) predict double yhatadj if e(sample) line yhatadj demvoteshare if democrat ==1, sort color(red) || /// line yhatadj demvoteshare if democrat ==0, sort color(red) legend(off) /// xline(0.5) ylabel(-50(50)150) graph export adj.png, replace restore /// - Kernel-weighted local polynomial smoothing capture drop sdem0 sdem1 x0 x1 lpoly score demvoteshare if d == 0, nograph kernel(triangle) gen(x0 sdem0) /// bwidth(0.1) degree(2) lpoly score demvoteshare if d == 1, nograph kernel(triangle) gen(x1 sdem1) /// bwidth(0.1) degree(2) scatter sdem1 x1, color(red) msize(small) msymbol(o) || scatter sdem0 x0, msize(small) msymbol(o) color(red) /// xline(0.5,lstyle(dot)) legend(off) xtitle("Democratic vote share") ytitle("ADA score") graph export lee_lpoly.png, replace list x0 sdem0 x1 sdem1 in 1/5 * second degree capture drop sdem0 sdem1 forat gen forat = 0.5 in 1 lpoly score demvoteshare if democrat == 0, nograph kernel(triangle) gen(sdem0) degree(2) /// at(forat) bwidth(0.1) lpoly score demvoteshare if democrat == 1, nograph kernel(triangle) gen(sdem1) degree(2) /// at(forat) bwidth(0.1) gen dif = sdem1 - sdem0 list sdem1 sdem0 dif in 1/1 * one degree, linear capture drop sdem0 sdem1 forat dif gen forat = 0.5 in 1 lpoly score demvoteshare if democrat == 0, nograph kernel(triangle) gen(sdem0) degree(1) /// at(forat) bwidth(0.1) lpoly score demvoteshare if democrat == 1, nograph kernel(triangle) gen(sdem1) degree(1) /// at(forat) bwidth(0.1) gen dif = sdem1 - sdem0 list sdem1 sdem0 dif in 1/1 * 46.68 * lpoly for each observed x rather than an equally spaced grid lpoly score demvoteshare , kernel(triangle) degree(1) /// at(demvoteshare) bwidth(0.1) capture drop smoothdem0* smoothdem1* x0* x1* local co 0 foreach i in 0.01 0.05 0.1 0.20 0.30 0.40 { local co = `co' +1 lpoly score demvoteshare if democrat == 0, nograph kernel(triangle) gen(x0`co' smoothdem0`co') /// bwidth(`i') degree(2) lpoly score demvoteshare if democrat == 1, nograph kernel(triangle) gen(x1`co' smoothdem1`co') /// bwidth(`i') degree(2) } line smoothdem01 x01, msize(small) color(gray) sort || line smoothdem11 x11, sort color(gray) || /// line smoothdem02 x02, color(black) sort || line smoothdem12 x12, sort color(black) || /// line smoothdem03 x03, color(red) sort || line smoothdem13 x13, sort color(red) || /// line smoothdem04 x04, color(blue) sort || line smoothdem14 x14, sort color(blue) || /// line smoothdem05 x05, color(green)sort || line smoothdem15 x15, sort color(green)|| /// line smoothdem06 x06, color(orange) sort || line smoothdem16 x16, sort color(orange) /// xline(0.5,lstyle(dot)) legend(off) xtitle("Democratic vote share") ytitle("ADA score") /// title("Bandwidths: 0.01, 0.05, 0.1, 0.2, 0.3, 0.4") graph export lee_dif_bws.png, replace // --- Rdrobust ssc install rdrobust, replace * Setting the bandwidth at 0.1 on each side (same as before ) rdrobust score demvoteshare, c(0.5) h(0.1) p(2) * one degree pol rdrobust score demvoteshare, c(0.5) h(0.1) p(1) * same as before, 46.686 count if (demvoteshare>.40 & demvoteshare<.60) di 2428 + 2204 rdrobust score demvoteshare, c(0.5) p(2) bwselect(mserd) * bandwidth depends on smoothing model rdrobust score demvoteshare, c(0.5) bwselect(mserd) * plots rdplot score demvoteshare, c(0.5) h(0.1) p(2) graph export rdplot2.png, replace * restrict to bandwidth rdplot score demvoteshare if 0.4 <= demvoteshare & demvoteshare <= 0.6, c(0.5) h(0.1) p(2) graph export rdplot2_1.png, replace * covariates rdrobust score demvoteshare, c(0.5) bwselect(mserd) covs(pcturban pctblack)