*! frontierhtail version 1.0.0
*! Performs stochastic frontier regression
*! for heavy tail data
*! Diallo Ibrahima Amadou
*! All comments are welcome, 14oct2011


/* Main Program */
capture program drop frontierhtail
program frontierhtail, eclass byable(onecall) sortpreserve properties(swml)
        version 11
        if _by() {
                  local by "by `_byvars' `_byrc0':"
        }
	if replay() {
		    if (`"`e(cmd)'"' != "frontierhtail") error 301
                    if _by() {
                              error 190
                    }
		    Replay `0'
	}
	else  `by' Estimate `0'
end


/* Estimation Program */
program Estimate, eclass byable(recall) sortpreserve
	syntax varlist(fv) [if] [in] 		///
		[fweight pweight ] [,	        ///
		vce(passthru)			///
		noLOg				///
		noCONStant			///
		HETero(varlist fv)              ///
		noLRTEST			///
		OFFset(varname numeric)		///
		EXPosure(varname numeric)	///
                Level(cilevel)			///
		EForm				///
                init(passthru)                  ///
		*				///
	]
	mlopts mlopts, `options'
	local cns `s(constraints)'
        local title "title("Stochastic Frontier For Heavy Tail Data")"
	gettoken lhs rhs : varlist
	_fv_check_depvar `lhs'
	if "`weight'" != "" {
		local wgt "[`weight'`exp']"
	}
	if "`log'" != "" {
		local qui quietly
	}
	if `"`hetero'"' == "" {
		local diparm diparm(lnsigma, exp label("sigma"))  ///
                             diparm(lntheta, exp label("theta"))
	}
	if "`offset'" != "" {
		local offopt "offset(`offset')"
	}
	if "`exposure'" != "" {
		local expopt "exposure(`exposure')"
	}
	if "`init'" == "" {
	                   quietly regress `lhs'
	                   local bc0=_b[_cons]
	                   local initopt "init(/xb=`bc0' /lnsigma=0 /lntheta=0) repeat(5)"
        }
        else {
              local initopt "`init'"
        }
	marksample touse
	markout `touse' `hetero' `offset' `exposure'
	_vce_parse `touse', opt(Robust oim opg)		///
		argopt(CLuster): `wgt' , `vce'
	if "`constant'" == "" {
		`qui' di as txt _n "Fitting constant-only model:"
               ml model lf frontierhtail_lf		///
		  (xb: `lhs' =, `offopt' `expopt' ) 	///
		  (lnsigma: `hetero')		        ///
		  (lntheta:)                            ///
		  `wgt' if `touse',			///
		  `log'					///
		  `mlopts'				///
		  `initopt'                             ///
		   nocnsnotes				///
		   missing				///
		   maximize                             ///
	           `title'
		if "`lrtest'" == "" {
			local contin continue search(off)
		}
		else {
			tempname b0
			mat `b0' = e(b)
			local contin init(`b0') search(off)
		}
		`qui' di as txt _n "Fitting full model:"
	}
	ml model lf1 frontierhtail_lf1			///
		(xb: `lhs' = `rhs',                     ///
                      `constant' `offopt' `expopt')	///
		(lnsigma: `hetero')		        ///
		(lntheta:)                              ///
		`wgt' if `touse',			///
		`vce'					///
		`log'					///
		`mlopts'				///
		`contin'				///
		`diparm'				///
                 missing				///
		 maximize                               ///
		 `title'
	if "`hetero'" == "" {
		ereturn scalar k_aux = 2
	}
	else	ereturn scalar k_aux = 0
	ereturn local predict frontierhtail_p
	ereturn local cmd frontierhtail
	ereturn local  cmdline "frontierhtail `0'"
	Replay , level(`level') `eform'
end


/* Replay Program */
program Replay
	syntax [, Level(cilevel) EForm ]
	ml display , level(`level') `eform'
end