*! Marginal Effects for Selection Endogenous
*! Treatment after setpoisson
*! Version 1.0
*! Author: Alfonso Miranda
*! Date: 23.02.2010

capture program drop setpoisson_me
program define setpoisson_me, eclass
version 11

syntax [if] [in], [DMEan DMOde XBQuantile(string) CMOde(string)]

/* check that correct estimates are in memory */

if (e(cmd)!="setpoisson") {
 di red "last estimates not found"
 error 301
}

/* sort out options */

if ("`dmean'" != "" & "`dmode'" != "") {
#delimit ; 
di in red "options" in gre " dmean " in red "and" in gre " dmode " in red 
 "cannot be combined together";
#delimit cr
 error 198
}
if ("`dmean'" != "" | "`dmode'" != "") & "`xbquantile'" != "" {
#delimit ; 
di in red "options" in gre " dmean " in red "and" in gre " dmode " in red 
 "cannot be combined with " in gre "xbquantile";
#delimit cr
 error 198
}
if ("`dmean'" == "" & "`dmode'" == "" & "`xbquantile'" == "") {
 local option_1 = 1
}
if "`dmean'" != "" {
 local option_1 = 1
}
if "`dmode'" != "" {
 local option_1 = 2
}
if "`xbquantile'" != "" {
 local option_1 = 3
 capture assert (`xbquantile'>=0 & `xbquantile'<=1)
 if (_rc==9) {
  di in red "option" in gre " xbquantile " in red "should be a real number in [0,1]"
  exit 198
 }
}
if "`xbquantile'" != "" {
 local qxb = `xbquantile'
}
else {
 local qxb "" 
}
/* get sample */ 
marksample touse

/* clear mata */

clear mata

/* calculate marginal effects */

if ("`cmode'" != "") {
 gettoken cvar atcmode : cmode
 mata: MagEff_setpcmode("e(exedv)"," e(exsv)","e(exordv)","`touse'", "`cvar'",`atcmode')
}
else{
 mata: MagEff_setpoisson("e(exedv)"," e(exsv)","e(exordv)","`touse'", `option_1',`qxb')
}
drop one

/* save ME matrices in e() */

if ("`cmode'" != "") {
 ereturn matrix ME_Poisson = ME_Poisson
}
else {
 ereturn matrix ME_Sel = ME_Sel
 ereturn matrix ME_Poisson = ME_Poisson
 ereturn matrix ME_ET = ME_ET
}
end