I have the following rough code (it needs further amendements):
Code:
capture program drop marginteff
program define marginteff, rclass
version 10
syntax varlist(min=3 max=3 numeric fv ts), grp(varlist min=1 max=1 numeric) [MIXed] [savedata(string) savegraph(string)]
marksample touse
tokenize `varlist'
local var1="`1'" 
local var2="`2'"
local var12="`3'"
tokenize `grp'
local g="`1'"
tempname B
tempname xb
tempvar rslope
tempvar rint
tempvar cross
tempvar cross_se
tempvar m_cross
tempvar m_cross_se
tempvar m_m_cross
tempvar m_m_cross_se
tempvar t_m_cross
tempvar t_m_m_cross
tempvar rslope
tempvar rint
tempvar prob
mat `B' = e(b)
mat score double `xb' = `B' if `touse'
if "`mixed'"==""{
    qui predict `prob', pr
    qui predictnl `cross'=(_b[`var1']+_b[`var12'])*(invlogit(`xb'-_b[`var2']*`var2'-_b[`var12']*`var12'+_b[`var2']+_b[`var12']*`var1'))*(1-(invlogit(`xb'-_b[`var2']*`var2'-_b[`var12']*`var12'+_b[`var2']+_b[`var12']*`var1')))-_b[`var1']*(invlogit(`xb'-_b[`var2']*`var2'-_b[`var12']*`var12'))*(1-(invlogit(`xb'-_b[`var2']*`var2'-_b[`var12']*`var12'))) if `touse', se(`cross_se')
}
else if "`mixed'"!=""{
    qui predict `prob', mu
    qui predict `rslope' `rint' if `touse', reffect
    qui su `rslope' `rint'
    qui predictnl `cross'=(_b[`var1']+_b[`var12']+`rslope')*(invlogit(`xb'-_b[`var2']*`var2'-_b[`var12']*`var12'+_b[`var2']+(_b[`var12']+`rslope')*`var1'+`rint'))*(1-(invlogit(`xb'-_b[`var2']*`var2'-_b[`var12']*`var12'+_b[`var2']+(_b[`var12']+`rslope')*`var1'+`rint')))-(_b[`var1']+`rslope')*(invlogit(`xb'-_b[`var2']*`var2'-_b[`var12']*`var12'+`rslope'*`var1'+`rint'))*(1-(invlogit(`xb'-_b[`var2']*`var2'-_b[`var12']*`var12'+`rslope'*`var1'+`rint'))) if `touse', se(`cross_se')
}
bysort `g': egen `m_cross'=mean(`cross') if `touse'
qui su `m_cross'
label variable `m_cross' "(Avg) Interaction term"
scalar `m_m_cross'=r(mean)
bysort `g': egen `m_cross_se'=mean(`cross_se') if `touse'
qui su `m_cross_se'
label variable `m_cross_se' "(Avg) S.E."
scalar `m_m_cross_se'=r(mean)
gen `t_m_cross'=`m_cross'/`m_cross_se' if `touse'
quietly su `t_m_cross'
label variable `t_m_cross' "(Avg) T-statistic"
scalar `t_m_m_cross'=r(mean)
if "`savedata'"!=""{
    preserve 
    keep `m_cross' `m_cross_se' `t_m_cross'
    restore
}  
if "`savegraph'"!=""{
    preserve
    twoway(scatter `m_cross' `prob')
    "`savegraph'"
    restore
}
label variable `m_cross' "Cross effect"
label variable `m_cross_se' "Standard Errors"
label variable `t_m_cross' "t-test"
su `m_cross' `m_cross_se' `t_m_cross'
di
di
di "Significance test for cross term"
di as text _dup(50) "-"
  di as text "     t-statistic  = " in  result %9.3f `m_m_cross'
  di as text "     s.e.         = " in  result %9.3f            `m_m_cross_se'
  di as text "     t-test       = " in  result %9.3f `t_m_m_cross'
  di as text "     P>|t|        = "   in  result %9.3f ttail(10000,`t_m_m_cross')
di as text _dup(50) "-"
endCode:
marginteff y x1 x2 x12, mixed savedata(New_Analysis\Results\dataint.dta) savegraph(New_Analysis\Results\my_graph)
A second issue I have is that before generating the summariy statistics of `m_cross' `m_cross_se' `t_m_cross' I try to label them. But it seems Stata cannot do that.
Code:
 Variable |        Obs        Mean    Std. dev.       Min        Max
-------------+---------------------------------------------------------
    __000007 |    186,443    .0121636    .0029053   .0055672   .0186525
    __000008 |    186,443    .0059492    .0016279   .0025022   .0092233
    __00000B |    186,443    2.106395    .3716783   .7090537   2.815147Thanks for your kind help.
Dario
0 Response to Saving option within a program
Post a Comment