* DISCLAIMER: The following code is provided as is and should be used at your own risk. * No user support is available. * Andrew Jones, November 2006 * This program relates to the material described in Chapters 9 and 10 of the book * Jones, A.M., Rice, N., Bago d'Uva, T. & Balia, S. (2007) * "Applied Health Economics", London: Routledge {ISBN: 9780415397728} /* NONLINEAR MODELS FOR PANEL DATA */ * PRELIMINARIES clear set trace off set more off set mem 120m use "bhps.dta" , clear capture log close log using "BHPS-Ex3.log", replace * SET INDIVIDUAL (i) AND TIME (t) INDEXES iis pid tis wavenum sort pid wavenum * GENERATE NON-WHITE gen nonwhite=1 replace nonwhite=0 if race2==1 * CHECK AND RECODE DEPENDENT VARIABLE (HLLT) sum hllt tab hllt gen hprob=hllt recode hprob -9=. recode hprob -1=. recode hprob 2=0 sum hprob *DEFINE GLOBAL FOR VARIABLE LISTS #delimit ; * LIST OF Xit; global xvars "male widowed nvrmar divsep deghdeg hndalev ocse hhsize nch04 nch511 nch1218 age age2 age3 nonwhite prof mantech skillmn ptskill unskill armed lninc"; #delimit cr; /* THE FOLLOWING COMMANDS CREATE INDICATORS OF WHETHER OBSERVATIONS ARE IN THE BALANCED AND UNBALANCED ESTIMATION SAMPLES */ quietly probit hprob $xvars gen insampm = 0 recode insampm 0 = 1 if e(sample) sort pid wavenum gen constant = 1 by pid: egen Ti = sum(constant) if insampm == 1 drop constant sort pid wavenum by pid: gen nextwavem = insampm[_n+1] gen allwavesm = . recode allwavesm . = 0 if Ti ~= 8 recode allwavesm . = 1 if Ti == 8 gen numwavesm = . replace numwavesm = Ti #delimit ; * LIST OF Xit PLUS MUNDLAK SPECIFICATION; by pid: egen mself=mean(selfemp); by pid: egen munemp=mean(unemp); by pid: egen mret=mean(retired); by pid: egen mmat=mean(matleave); by pid: egen mcare=mean(famcare); by pid: egen mstdt=mean(student); by pid: egen msick=mean(ltsick); by pid: egen mprof=mean(prof); by pid: egen mman=mean(mantech); by pid: egen mskmn=mean(skillmn); by pid: egen mptsk=mean(ptskill); by pid: egen munsk=mean(unskill); by pid: egen marm=mean(armed); global xvarm " male widowed nvrmar divsep deghdeg hndalev ocse hhsize nch04 nch511 nch1218 age age2 age3 nonwhite lninc prof mantech skillmn ptskill unskill armed mlninc"; * VARIABLES TO PREDICT ATTRITION IN IPW APPROACH; **** Generate wave one time-invariant variables **** ; sort pid wavenum ; #delimit ; foreach X of varlist male widowed nvrmar divsep deghdeg hndalev ocse hhsize nch04 nch511 nch1218 age age2 age3 nonwhite selfemp unemp retired matleave famcare student ltsick prof mantech skillmn ptskill unskill armed lninc hlghq1 hprob { ; by pid: gen `X't1 = `X'[1] ; } ; **** Generate t-1 variables for x-sectional probits **** ; sort pid wavenum ; foreach X of varlist male widowed nvrmar divsep deghdeg hndalev ocse hhsize nch04 nch511 nch1218 age age2 age3 nonwhite selfemp unemp retired matleave famcare student ltsick prof mantech skillmn ptskill unskill armed lninc hlghq1 hprob sahex sahfair sahpoor sahvpoor { ; by pid: gen `X't_1 = `X'[_n-1] ; } ; global z1 "malet1 widowedt1 nvrmart1 divsept1 deghdegt1 hndalevt1 ocset1 hhsizet1 nch04t1 nch511t1 nch1218t1 aget1 age2t1 age3t1 nonwhitet1 selfempt1 unempt1 retiredt1 matleavet1 famcaret1 studentt1 ltsickt1 proft1 mantecht1 skillmnt1 ptskillt1 unskillt1 armedt1 lninct1 hlghq1t1 hprobt1 sexzero sfazero spozero svpzero"; * DEFINE A GLOBAL FOR THE DEPEPENDENT VARIABLE; global yvar "hprob"; * LIST OF Xit INCLUDING H(t-1); global xvard "hprobt_1 male widowed nvrmar divsep deghdeg hndalev ocse hhsize nch04 nch511 nch1218 age age2 age3 nonwhite prof mantech skillmn ptskill unskill armed lninc"; * GLOBAL FOR MUNDLAK-WOOLDRIDGE SPECIFICATION OF ai; global xvarw "hprobt_1 male widowed nvrmar divsep deghdeg hndalev ocse hhsize nch04 nch511 nch1218 age age2 age3 nonwhite lninc prof mantech skillmn ptskill unskill armed hprobt1 mlninc"; #delimit cr; sort pid wavenum /* EXERCISE 3 - STATIC & DYNAMIC NONLINEAR PANEL DATA MODELS */ * SUMMARY STATISTICS xtsum $yvar $xvarw xtsum $yvar $xvarw if allwavesm==1 ***** STATIC *************************************************** * POOLED PROBIT - DPROBIT USED TO OBTAIN APEs * USING ROBUST INFERENCE TO ALLOW FOR CLUSTERING WITHIN "i" dprobit $yvar $xvars, robust cluster(pid) dprobit $yvar $xvars if allwavesm==1, robust cluster(pid) * MUNDLAK: dprobit $yvar $xvarm, robust cluster(pid) dprobit $yvar $xvarm if allwavesm==1, robust cluster(pid) * PANEL RANDOM EFFECTS (RE) PROBIT xtprobit $yvar $xvars quadchk xtprobit $yvar $xvars if allwavesm==1, intp(24) *quadchk * RE MODEL WITH MUNDLAK xtprobit $yvar $xvarm, intp(24) *quadchk xtprobit $yvar $xvarm if allwavesm==1, intp(24) *quadchk * CONDITIONAL ("FIXED EFFECTS") LOGIT MODEL (FE) clogit $yvar $xvars, group(pid) clogit $yvar $xvars if allwavesm==1, group(pid) ********** DYNAMIC *************** * POOLED PROBIT - DPROBIT USED TO OBTAIN APEs * USING ROBUST INFERENCE TO ALLOW FOR CLUSTERING WITHIN "i" dprobit $yvar $xvard, robust cluster(pid) dprobit $yvar $xvard if allwavesm==1, robust cluster(pid) dprobit $yvar $xvarw, robust cluster(pid) dprobit $yvar $xvarw if allwavesm==1, robust cluster(pid) * PANEL RE PROBIT xtprobit $yvar $xvard, intp(24) *quadchk xtprobit $yvar $xvard if allwavesm==1, intp(24) *quadchk * RE MODEL WITH MUNDLAK-WOOLDRIDGE xtprobit $yvar $xvarw, intp(24) *quadchk xtprobit $yvar $xvarw if allwavesm==1, intp(24) *quadchk * STEWART'S CODE FOR HECKMAN ESTIMATOR OF DYNAMIC PROBIT #delimit ; global z0 "malet1 widowedt1 nvrmart1 divsept1 deghdegt1 hndalevt1 ocset1 hhsizet1 nch04t1 nch511t1 nch1218t1 aget1 age2t1 age3t1 nonwhitet1 proft1 mantecht1 skillmnt1 ptskillt1 unskillt1 armedt1 lninct1"; #delimit cr; redprob $yvar $xvard ($z0), i(pid) t(wavenum) quadrat(24) ****** ATTRITION ******* * Tabulate survival rate etc. gen miss=insampm replace miss=. if insampm==0 summ insampm miss program define table { quietly summ miss if wavenum == 1 scalar N0 = r(N) forvalues j = 2(1)8 { display "wavenum == "`j' quietly summ miss if (wavenum == `j'-1) scalar N1 = r(N) quietly summ miss if (wavenum == `j' & miss[_n-1] ~= .) scalar N2 = r(N) quietly summ miss if (wavenum == `j' & miss[_n-1] == .) scalar N3 = r(N) quietly summ miss if (wavenum == `j') scalar N4 = r(N) scalar dropout = N1 - N2 scalar rejoiner = N3 scalar rattr = ((N1 - N2)/N1) scalar nattr = ((N1 - N4)/N1) scalar surv = N4/N0 display "No. individuals at wave = " `j'-1 " = " N1 display "No. individuals at wave = " `j' " = " N4 display "Survival rate = " surv " Drop outs = " dropout " Re-joiner = " rejoiner display "Raw Attrition rate = " rattr "Net Attrition rate = " nattr display " " } } end table **** Generate weights based on probs from wave specific probits **** forvalues j = 2(1)8 { quietly probit insampm $z1 if (wavenum == `j') predict p`j' , p predict lc`j', xb gen imr`j'=normden(lc`j')/normprob(lc`j') gen ipw`j' = 1/p`j' dprobit insampm $z1 if (wavenum == `j') } gen imr = 0 forvalues k = 2(1)8 { replace imr = imr`k' if wavenum == `k' } gen ipw = 1 forvalues k = 2(1)8 { replace ipw = ipw`k' if wavenum == `k' } drop p2-ipw8 sum ipw imr * POOLED REGRESSIONS WITH WOOLDRIDGE (2002) IPW-1 dprobit $yvar $xvarw [pweight=ipw], robust cluster(pid) dprobit $yvar $xvarw [pweight=ipw] if allwavesm==1, robust cluster(pid) * VERBEEK-NIJMAN TEST FOR ATTRITION IN RE MODELS gen Tld=insampm[_n+1] * SIMPLE STATIC MODELS * i) WITH Ti quietly probit $yvar $xvard Ti, robust cluster(pid) test Ti=0 quietly xtprobit $yvar $xvars Ti, intp(24) test Ti=0 * ii) WITH ALLWAVESM quietly probit $yvar $xvars allwavesm, robust cluster(pid) test allwavesm=0 quietly xtprobit $yvar $xvars allwavesm, intp(24) test allwavesm=0 * iii) WITH Sit+1 quietly probit $yvar $xvars Tld, robust cluster(pid) test Tld=0 quietly xtprobit $yvar $xvars Tld, intp(24) test Tld=0 * DYNAMIC MUNDLAK/WOOLDRIDGE VERSION * i) WITH Ti quietly probit $yvar $xvarw Ti, robust cluster(pid) test Ti=0 quietly xtprobit $yvar $xvarw Ti, intp(24) test Ti=0 * ii) WITH ALLWAVESM quietly probit $yvar $xvarw allwavesm, robust cluster(pid) test allwavesm=0 quietly xtprobit $yvar $xvarw allwavesm, intp(24) test allwavesm=0 * iii) WITH Sit+1 quietly probit $yvar $xvarw Tld, robust cluster(pid) test Tld=0 quietly xtprobit $yvar $xvarw Tld, intp(24) test Tld=0