global workpath "h:\microfinance\pk" cd "$workpath" global resultsfile pk982.txt global meansfile PK 98 means 2.txt cap log close cap estimates drop * cap erase $resultsfile set more off set matsize 800 cmp setup global indy $cmp_cont scalar C_t = ln(1000) scalar C_v = ln(1) do "PK reproduction 2 routines.do" PrepHHData cap erase "$meansfile" * weighted means and sds of RHS vars in first wave. sd's are displayed as "Root MSE" foreach var in fbraclvpk mbraclvpk fbrdblvpk mbrdblvpk fgramlvpk mgramlvpk scoheadpk afedhighpk amedhighpk afadultdpk amadultdpk sexheadpk ageheadpk landbefpk edheadpk spsislnddpk spbrolnddpk spparlnddpk hdsislnddpk hdbrolnddpk hdparlnddpk nontarpk { cap reg `var' if wave==1 [aw=weightpk] if !_rc { reg qui outreg2 using "$meansfile", noparen noaster ctitle("`var'-wave 1") dec(10) adec(10) addstat("S.d.", e(rmse)) } } * means and sds of dep vars. sd's are displayed as "Root MSE". forvalues varn = 1/9 { if `varn'==6 { preserve * odbc load, exec("select * from [Roodman & Morduch ind]") dsn(PK) clear use "Roodman & Morduch ind 2.dta", clear keep if wave<4 & pksample ren pksamplempk choicempk ren pksamplefpk choicefpk bysort villagepk: egen byte fprogvillpk = max(choicefpk) by villagepk: egen byte mprogvillpk = max(choicempk) gen byte progvillpk = fprogvillpk | mprogvillpk reg age if wave==1 [aw=weightpk] qui outreg2 using "$meansfile", noparen noaster ctitle("age-wave 1") dec(10) adec(10) addstat("S.d.", e(rmse)) reg ed if wave==1 & age>=5 [aw=weightpk] qui outreg2 using "$meansfile", noparen noaster ctitle("ed-wave 1") dec(10) adec(10) addstat("S.d.", e(rmse)) reg edns if wave==1 & age>=5 [aw=weightpk] // education of non-students. students=0 needed to match PK qui outreg2 using "$meansfile", noparen noaster ctitle("edns-wave 1") dec(10) adec(10) addstat("S.d.", e(rmse)) } local var : word `varn' of fproglvpk mproglvpk pcnsexppk fasset fnlasset fwork mwork fedec517 medec517 local varsample : word `varn' of "choicefpk & wave==1" "choicempk & wave==1" /// 1 "!afadultdpk & wave==1" "!afadultdpk & wave==1" /// "sex==0 & age>=16 & age<60" "sex==1 & age>=16 & age<60" /// "wave==1 & sex==0 & age>=5 & age<18" "wave==1 & sex==1 & age>=5 & age<18" * more proper but doesn't match * local varsample : word `varn' of "choicefpk & !afadult & wave==1" "choicempk & !amadult & wave==1" /// 1 "!afadultdpk & wave==1" "!afadultdpk & wave==1" "sex==0 & age>=16 & age<60" /// "sex==1 & age>=16 & age<60" "wave==1 & sex==0" /// "wave==1 & sex==0 & age>=5 & age<18" "wave==1 & sex==1 & age>=5 & age<18" forvalues samplen = 1/5 { local sample : word `samplen' of progid<4 "progid>=4 & progvillpk" progvillpk !progvillpk 1 local samplename : word `samplen' of part non-part prog-vill non-prog-vill all cap reg `var' if `varsample' & `sample' [aw=weightpk] if !_rc { reg qui outreg2 using "$meansfile", noparen noaster ctitle("`var'-`samplename'") dec(10) adec(10) addstat("S.d.", e(rmse)) } } } restore * a la RM 2009--use crcensored instead of nontar, censor credit vars in 2nd stage with log 1000 instead of log 1, vary all vars over time global covsf scoheadpk afedhighpk amedhighpk amadultdpk sexheadpk ageheadpk llandbefpk edheadpk spsislnddpk spbrolnddpk spparlnddpk hdsislnddpk hdbrolnddpk hdparlnddpk _Iwave* _Ivill* global covsm scoheadpk afedhighpk amedhighpk afadultdpk sexheadpk ageheadpk llandbefpk edheadpk spsislnddpk spbrolnddpk spparlnddpk hdsislnddpk hdbrolnddpk hdparlnddpk _Iwave* _Ivill* global creditvars lfbraclvpk lfbrdblvpk lfgramlvpk lmbraclvpk lmbrdblvpk lmgramlvpk global creditw lfproglvpk global creditm lmproglvpk global extracovsy crcensored global nontarvar DefineIndicators preserve recode $creditvars (0 = `=ln(1000)') EstimatePK SaveEstimates, runname(RM2009) * now drop crcensored, like PK global extracovsy EstimatePK SaveEstimates, runname(RM2009_nocrcensored) * in addition, now censor with log 1, like PK restore // ...credit var censoring back at log 1 EstimatePK SaveEstimates, runname(RM2009_nocrcensored_ln1) * instead of fixing censoring issue by censoring with log 1, fix missing nontar global nontarvar nontarpk preserve recode $creditvars (0 = `=ln(1000)') EstimatePK SaveEstimates, runname(RM2009_nocrcensored_nontar) restore // ...credit var censoring back at log 1 * Now do both important fixes--censoring with ln1 and include nontar, like PK EstimatePK SaveEstimates, runname(allrounds) * "replication": fix 1st-stage & credit vars in wave 1; include nontar; drop crcensored; censor with log 1 ResetGlobals DefineIndicators EstimatePKFlip, runname(replication) * LIML-based checks of instrument weakness EstimateLIML SaveEstimates, runname(LIML) global creditvars lfproglvpk1ln1 lmproglvpk1ln1 EstimateLIML SaveEstimates, runname(LIML_2_vars) EstimateLIML if fprogvillpk & mprogvillpk SaveEstimates, runname(LIML_both_only) global creditvars lproglvpk1ln1 global insts zb* choicepk1 EstimateLIML SaveEstimates, runname(LIML_pooled) ResetGlobals * vary sample by gender global creditvars lfbraclvpk1 lfbrdblvpk1 lfgramlvpk1 EstimatePKFlip if !mprogvillpk, femaleonly runname(femaleonly) global creditvars lmbrdblvpk1 lmgramlvpk1 EstimatePKFlip if !fprogvillpk, maleonly runname(maleonly) ResetGlobals EstimatePKFlip if !(fprogvillpk & mprogvillpk), runname(single_gender) EstimatePKFlip if fprogvillpk & mprogvillpk, runname(bothonly) * Dichotomize credit instead preserve Probitize EstimatePKFlip, runname(probit) replace indf = $cmp_cont replace indm = $cmp_cont EstimatePKFlip, runname(LPM) restore * ... instead, expand first-stage equations to full sample preserve replace choicefpk = 1 replace choicempk = 1 EstimatePKFlip, runname(full_sample) restore * ...instead add "instruments" (choice interaction terms) to second stage global extracovsy choicefpk choicempk EstimatePKFlip, runname(choice_in_stage_2) global extracovsy zf* zm* choicefpk choicempk EstimatePKFlip, runname(z_in_stage_2) ResetGlobals * ...instead switch to de jure eligibility preserve global nontarvar nontrgth_dejure gen byte choicef_dejure = !$nontarvar * fprogvillpk gen byte choicem_dejure = !$nontarvar * mprogvillpk gen byte choice_dejure = !$nontarvar * progvillpk foreach var of varlist $covsf { cap drop zf`var' gen double zf`var' = `var' * choicef_dejure } foreach var of varlist $covsm { cap drop zm`var' gen double zm`var' = `var' * choicem_dejure } global insts zf* zm* choicef_dejure choicem_dejure global creditvars lfproglvpk1ln1 lmproglvpk1ln1 EstimateLIML SaveEstimates, runname(LIML_dejure) global creditvars lproglvpk1ln1 global insts zb* choice_dejure EstimateLIML SaveEstimates, runname(LIML_pooled_dejure) global creditvars lfbraclvpk1 lfbrdblvpk1 lfgramlvpk1 lmbraclvpk1 lmbrdblvpk1 lmgramlvpk1 global covsf zf* choicef_dejure, nocons global covsm zm* choicem_dejure, nocons global covsfm zf* zm* choice?_dejure, nocons replace choicefpk = fprogvillpk // instrument all HH in program villages--seems only way to define treatment-control exogenously replace choicempk = mprogvillpk // while embracing all HH that borrowed, including mistargeted ones EstimatePKFlip, runname(dejure) lf global extracovsy choicef_dejure choicem_dejure EstimatePKFlip, runname(dejure_choice_stage_2) lf global extracovsy zf* zm* choicef_dejure choicem_dejure EstimatePKFlip, runname(dejure_z_stage_2) lf ResetGlobals * vary sample by gender (de jure) global creditvars lfbraclvpk1 lfbrdblvpk1 lfgramlvpk1 EstimatePKFlip if !mprogvillpk, femaleonly runname(femaleonly_dejure) global creditvars lmbrdblvpk1 lmgramlvpk1 EstimatePKFlip if !fprogvillpk, maleonly runname(maleonly_dejure) ResetGlobals EstimatePKFlip if !(fprogvillpk & mprogvillpk), runname(single_gender_dejure) EstimatePKFlip if fprogvillpk & mprogvillpk, runname(bothonly_dejure) global creditvars lbraclvpk1 lbrdblvpk1 lgramlvpk1 EstimatePKFlip, runname(agg_gender_dejure) pooled difficult restore * Linear LIML but maintaining PK distinction between 6 credit vars on right of outcome eq and two on left of instrumenting eq preserve replace indf = $cmp_cont replace indm = $cmp_cont gen byte zf1 = choicefpk gen byte zm1 = choicempk replace choicefpk = 1 replace choicempk = 1 global covsf zf*, nocons global covsm zm*, nocons EstimatePKFlip, runname(linear_LIML) ResetGlobals restore * aggregate 2nd-stage credit vars accross gender global creditvars lbraclvpk1 lbrdblvpk1 lgramlvpk1 EstimatePKFlip, runname(agg_gender) pooled ResetGlobals estimates table *, keep($creditvars) t(%4.3f) b(%4.3f) modelwidth(11) eq(1) * Method suggested in text: Model and instrument binary and continuous aspects of credit separately * Doesn't seem to coverge, probably because of poor instruments for borrowing amount /*bysort nh: gen byte fproglvpk1d = fproglvpk[1]>0 bysort nh: gen byte mproglvpk1d = mproglvpk[1]>0 replace fproglvpk1 = fproglvpk1 * fproglvpk1d replace mproglvpk1 = mproglvpk1 * mproglvpk1d cmp (lpcnsexppk = fproglvpk1d fproglvpk1 mproglvpk1d mproglvpk1 $nontarvar $covsy _Ivill*) (fproglvpk1d = $covsf) (fproglvpk1 = $covsf) /// (mproglvpk1d = $covsm) (mproglvpk1 = $covsm) [pw=weightpk], tech(dfp nr) cluster(nh) /// ind($cmp_cont choicefpk*$cmp_probit choicefpk*fproglvpk1d choicempk*$cmp_probit choicempk*mproglvpk1d) cmp (lpcnsexppk = fproglvpk1d fproglvpk1 mproglvpk1d mproglvpk1 $nontarvar $covsy _Ivill*) (fproglvpk1d = $covsf) (fproglvpk1 = $covsf) /// (mproglvpk1d = $covsm) (mproglvpk1 = $covsm) [pw=weightpk] if !((fproglvpk1d & !choicefpk) | (mproglvpk1d & !choicempk)), tech(dfp nr) cluster(nh) /// ind($cmp_cont choicefpk*$cmp_probit choicefpk*fproglvpk1d choicempk*$cmp_probit choicempk*mproglvpk1d) pseudod2 cmp (lpcnsexppk = fproglvpk1d fproglvpk1 mproglvpk1d mproglvpk1 $nontarvar $covsy _Ivill*) (fproglvpk1d = $covsf) (fproglvpk1 = $covsf) /// (mproglvpk1d = $covsm) (mproglvpk1 = $covsm) [pw=weightpk], tech(dfp nr) cluster(nh) /// ind($cmp_cont choicefpk*$cmp_probit choicefpk*$cmp_cont choicempk*$cmp_probit choicempk*$cmp_cont) */ * log female (non-land) assets scalar Y_0 = ln(10) // female non-land asset censoring threshold? (2 is lowest observed value, in wave 2, 10 lowest in wave 1.) gen double lfnlasset = ln(fnlasset) gen double lfasset = ln(fasset) replace lfnlasset = Y_0 if lfnlasset=16 & age<60 & sex==0, runname($depvar) global depvar lmwork global indy cond($depvar<=Y_0, $cmp_left, $cmp_cont) gen byte d = mwork==0 sum d [aw=weightpk], mean di "share of male labor supply obs that are censored:" r(mean) EstimatePKFlip if !amadultdpk & age>=16 & age<60 & sex==1, runname($depvar) * school enrollment global extracovsy age age2 global indy $cmp_probit global depvar fedec517 EstimatePKFlip if wave==1 & sex==0 & age>=5 & age<18, runname($depvar) tech(dfp) global depvar medec517 EstimatePKFlip if wave==1 & sex==1 & age>=5 & age<18, runname($depvar)