program define poisson2 version 2.1 if ("%_*"=="") { di in red "invalid syntax -- see help poisson2 exit } mac def _options "Ltol(string) Iter(string) Offset(string) Rescale *" mac def _varlist "req ex" mac def _in "opt" mac def _if "opt" mac def _exp "opt" parse "%_*" parse "%_varlist", parse(" ") mac def _dv "%_1" cap assert %_1>=0 & %_1==int(%_1) %_if %_in if (_rc>0) { di in bl "Note: You are responsible for interpretation of non-count dependent variable" } mac shift qui gen _wt = 1 if ("%_exp"!="") { qui replace _wt %_exp } if ("%_rescale"!="") { di in bl "Note: You are responsible for interpretation of rescaled weights" qui summ _wt %_if %_in replace _wt = _wt / (_result(3)) } if ("%_ltol"=="") { mac def _ltol "1e-7" } if ("%_iter"=="") { mac def _iter 100 } if ("%_offset"!="") { mac def _poffset "+%_offset" mac def _offset "-%_offset" } mac def _dll = 1 mac def _niter 0 capture { gen long _lastobs=_n %_if %_in replace _lastobs=. if %_dv==. | _wt==. replace _lastobs=_lastobs[_n-1] if _lastobs==. mac def _lastobs=_lastobs[_N] drop _lastobs summ %_dv %_exp %_if %_in mac def _dvmean = _result(3) gen _predz = log(_result(3)) %_if %_in mac def _nobs = _result(1) gen _epred = _result(3) %_if %_in _crclf _Poisson = %_dv %_if %_in replace _Poisson = sum(_Poisson*_wt) %_if %_in mac def _llconst = _Poisson[%_lastobs] replace _Poisson = cond(%_dv==0,0,%_dv*(log(%_dv)-1)) %_if %_in replace _Poisson = sum(_Poisson*_wt) %_if %_in mac def _llperf = _Poisson[%_lastobs] - %_llconst replace _Poisson= %_dv*_predz - _epred %_if %_in replace _Poisson= sum(_Poisson*_wt) %_if %_in mac def _ll0 = _Poisson[%_lastobs] - %_llconst mac def _myll = %_ll0 di while ((abs(%_dll)>%_ltol*abs(%_myll) & %_niter<%_iter) | (%_niter==0)) { di in gr "Iteration %_niter: Log Likelihood = ", /* */ in ye %_myll replace _Poisson = ((%_dv - _epred)/_epred) + _predz %_offset %_if %_in reg _Poisson %_* =(_epred)*_wt, noscale mac def _regF = _result(6) mac def _regMDF = _result(3) mac def _RMSE = _result(9) drop _predz predict _predz %_if %_in replace _predz = _predz %_poffset replace _epred = exp(_predz) replace _Poisson = %_dv*_predz - _epred %_if %_in replace _Poisson = sum(_Poisson*_wt) %_if %_in mac def _mynll = _Poisson[%_lastobs] - %_llconst mac def _dll = %_mynll - %_myll mac def _myll "%_mynll" mac def _niter = %_niter+1 } * In the future: * replace _Poisson = (%_dv - _epred) * cap noisily _huber _Poisson _epred %_exp %_if %_in replace _Poisson = ((%_dv - _epred)/_epred)/%_RMSE + _predz %_offset di di in gre "Poisson Regression (Log link function)" _col(49) /* */ "Number of obs =" in yel %8.0f %_nobs di in gre "Goodness of fit chi2(" %_nobs-%_regMDF-1 ") =" /* */ in yel %10.3f -2*(%_myll - %_llperf) /* */ _col(49) in gre "Model chi2(%_regMDF) =" /* */ in yel %8.3f 2*(%_myll-%_ll0) mac def S_RSLT2 = 2*(%_myll-%_ll0) mac def S_RSLT3 = %_regMDF di in gre "Prob > chi2 = " /* */ in yel %9.4f chiprob(%_nobs-%regMDF-1,-2*(%_myll-%_llperf)) /* */ _col(49) in gre "Prob > chi2 =" /* */ in yel %8.4f chiprob(%_regMDF,2*(%_myll-%_ll0)) di in gre "Log Likelihood =" in yel %10.3f %_myll qui reg _Poisson %_* =(_epred)*_wt, noscale di di in gre "Variable | Coefficient Std. Error t Prob > |t| Mean" di in gre "---------+" _dup(62) "-" mac def _x = 8-length("%_dv") di _dup(%_x) " " in gre "%_dv |", /* */ in yel _col(61) %10.0g %_dvmean di in gre "---------+" _dup(62) "-" parse "%_* _cons", parse(" ") while ("%_1"!="") { emdef S_t : t %_1 if ("%_1"!="_cons") { cap summ %_1 %_exp %_if %_in mac def _mm = _result(3) } else { mac def _mm 1 } mac def _x = 8-length("%_1") di _dup(%_x) " " in gre "%_1 |", /* */ in yel _col(15) %8.0g _b[%_1], /* */ _col(28) %8.0g abs(_b[%_1]/%S_t), /* */ _col(37) %8.3f %S_t, /* */ _col(46) %8.3f tprob(%_nobs-%_regMDD-1,%S_t),/* */ _col(57) %10.0g %_mm mac shift } di in gre "---------+" _dup(62) "-" mac def S_RSLT1 = %_nobs } mac def _rc = _rc cap drop _Poisson cap drop _predz cap drop _epred cap drop _wt exit %_rc end