*! version 1.1.0 17sep2004 (c) Edwin Leuven and Barbara Sianesi program define film, rclass version 8.0 syntax varlist(min=3) [if] [in], [ROBust ATE COMmon LINear(varlist) CLuster(varname) Level(real 95) SHOW] marksample touse tokenize `varlist' args outcome treated macro shift 2 local X `*' tempvar support qui g byte `support' = 1 if ("`common'"!="") { qui probit `treated' `X' `linear' if `touse' tempvar pscore qui predict double `pscore' if `touse' qui sum `pscore' if `touse' & `treated'==0, mean qui replace `support' = 0 if `touse' & (`pscore'r(max)) & `treated'==1 if ("`ate'"!="") { qui sum `pscore' if `touse' & `treated'==1, mean qui replace `support' = 0 if `touse' & (`pscore'r(max)) & `treated'==0 di as text "Imposing common support on `treated'=1 (att), `treated'=0 (atu) and both (OLS and ate)" } else di as text "Imposing common support on `treated'=1 (OLS and att)" label var `support' "Common Support" label def `support' 1 "On" 0 "Off" label val `support' `support' tab `treated' `support' } quietly regress `outcome' `treated' `X' `linear' if `touse' & `support'==1, `robust' cluster(`cluster') return scalar ols = _b[`treated'] return scalar ols_se = _se[`treated'] return scalar ols_p = 2*(1-norm(abs(_b[`treated']/_se[`treated']))) di as text "{hline 70}" di as text _col(15) %9s "est." _col(25) %9s "s.e." _col(35) %9s "p-value" _col(50) %9s "[`level'% Conf. Interval]" di as text "{hline 70}" di as text "OLS" _col(15) as res %9.0g _b[`treated'] _col(25) %9.0g _se[`treated'] _col(35) %9.0g 2*(1-norm(abs(_b[`treated']/_se[`treated']))) _col(50) %9.0g _b[`treated'] - invttail(e(df_r), (100-`level')/200)*_se[`treated'] _col(60) %9.0g _b[`treated'] + invttail(e(df_r), (100-`level')/200)*_se[`treated'] di as text "FILM" if ("`ate'"!="") local effects att atu ate else local effects att qui foreach effect of local effects { tempvar esample g `esample' = (`treated'==("`effect'"=="att") | `treated'==("`effect'"!="atu")) if `touse' cap drop `XD' local XD foreach var of varlist `X' { sum `var' if (`esample'==1 & `support'==1), mean g _`treated'X`var' = `treated'*(`var' - r(mean)) local XD `XD' _`treated'X`var' } regress `outcome' `treated' `X' `XD' `linear' if (`esample'==1 & `support'==1) | `esample'==0, `robust' cluster(`cluster') if ("`show'"!="") est store Interactions if ("`effect'"=="att") { tempname Fstat pvalue testparm `XD' scalar `Fstat' = r(F) scalar `pvalue' = r(p) } return scalar `effect' = _b[`treated'] return scalar `effect'_se = _se[`treated'] return scalar `effect'_p = 2*(1-norm(abs(_b[`treated']/_se[`treated']))) noi di as text "- `effect' " _col(15) as res %9.0g _b[`treated'] _col(25) %9.0g _se[`treated'] _col(35) %9.0g 2*(1-norm(abs(_b[`treated']/_se[`treated']))) _col(50) %9.0g _b[`treated'] - invttail(e(df_r), (100-`level')/200)*_se[`treated'] _col(60) %9.0g _b[`treated'] + invttail(e(df_r), (100-`level')/200)*_se[`treated'] drop `XD' } di as text "{hline 70}" di as txt "F-test of no heterogeneous effects: " as txt "F = " as res %6.2f `Fstat' as txt _col(15) " Prob>F = " as res %6.4f `pvalue' di as text "{hline 70}" if ("`show'"!="") { local length 0 foreach v of local X { local length = max(`length',length("`v'")) } local length = `length' + length("`treated'") + 4 est table Interactions, keep(`XD') star(0.10 0.05 0.01) stats(N df_m r2) varwidth(`length') est clear } end