*! version 1.0 Alfonso Miranda-Caso-Luengo, November 26 2002    (SJ4-1: st0057)
*! FIML endogenous-switch Poisson Regression

program define espoisson, eclass 
	version 6
	if replay() { 
		if "`e(cmd)'" != "espoisson" { error 301 }
		else espDisplay `0'
 		}
	else espEstimate `0'	
end

program define espEstimate, eclass
	syntax varlist [if] [in] , EDummy(varname) /*
	*/ [Switch(varlist) Quadrature(integer 6) /*
	*/ SIGMA0(real 1) RHO0(real 0.1) /*
        */ EXS *] 
	
	/* Obtaining dependent variable and explanatory variables */  

	gettoken endgv exogv : varlist, parse("")

	/* Selecting sample */  

	marksample touse
	markout `touse' `varlist'

	/* defining some globals */ 
	  	
   	 global S_quad   "`quadrature'"
	 global S_edum "`edummy'"


	/* Diverting to exsp if EXS option active */
	
	if "`exs'"!="" {
			#delimit ;
			exspoisson `endgv' `exogv' `if' `in', edummy(`edummy') 
			s(`switch') q(`quadrature') 
			sigma0(`sigma0') ;
			#delimit cr
			exit
			}
	
	/* Get points and weights for Gaussian-Hermite quadrature. */
	
	tempvar  x w
	qui gen double `x' = 0 
	qui gen double `w' = 0 
  	ghquad `x' `w', n(`quadrature')
	local j = `quadrature'
	while `j' >0 { 
				    scalar x`j' = `x'[`j']
				    local j = `j' -1
				  }
	local j = `quadrature'
	while `j' >0 {
				   scalar w`j' = `w'[`j']
				   local j = `j' - 1 
				  }
	

	/* GETTING INITIAL VALUES */ 
	
	 di _skip(3)
	 qui probit `edummy' `switch' if `touse'  

	 tempname b b1 b2 ch cr b0 bi
	 
	 mat `b'=e(b)
	 xcolnames `b', head(switch)
	 
	 di as txt "Getting Initial Values:"
	 qui poisson  `endgv' `exogv' if `touse'
	
	 mat `b1' = e(b)
	 mat `b2' = (`b1',`b')
	 matrix `ch' = ln(`sigma0') 
	 matrix colnames `ch' = lnsigma:_cons
	 matrix `cr' = `rho0'
	 matrix colnames `cr' = rho:_cons
	 matrix `b0' = (`b2',`ch',`cr')

	 ml model d0 espoisson_ll ("`endgv'": `endgv' = `exogv') /* 
	 */ (switch:`switch')(lnsigma:)(rho:) /* 
         */ if `touse', init(`b0')

	 qui ml search rho: 14 -14
	 mat `cr' = ML_b[1,"rho:_cons"]
	 mat `bi' = (`b2',`ch',`cr')
	 
         /* FITTING FULL MODEL */ 
	
	 di _skip(3)
	 di in gr "Fitting Full model:"
	 
	 ml model d0 espoisson_ll ("`endgv'": `endgv' = `exogv') /* 
	 */ (switch:`switch')(lnsigma:)(rho:)/* 
         */ if `touse', init(`bi', skip) max `options' search(off)  

	 estimates local cmd "espoisson"
	 estimates local edummy "`edummy'"
	 est local predict "espoisson_p"
	 est local quad "`quadrature'"
	  	
	/* Display Results */

	espDisplay 
end
	
	
program define espDisplay 

      	di _skip(12)
	di _n as txt /*
	*/ "Endogenous-Switch Poisson Regression"
	di as text "(`e(quad)' quadrature points)"  
   	
	ml di, neq(2)plus
	_diparm lnsigma, exp pr label("sigma")
      _diparm rho, f((exp(2*@)-1)/(exp(2*@)+1)) /*       
      */ d(4*exp(2*@)/(exp(2*@)+1)^2) label("rho") pr
	di in gre in smcl "{hline 13}{c BT}{hline 64}" 
end