ML两步法 可以采用二步法进行ML估计,以下将会以一段样例代码展示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 webuse school, clear set seed 1capture program drop mybiprobitprogram mybiprobitargs lnf m1 m2 athrho zb1 lns1tempvar rhoqui :gen double `rho' =tanh (`athrho' )qui :replace `lnf' =ln (normalden ($ML_y3 ,`zb1' ,exp (`lns1' )))qui :replace `lnf' =`lnf' +ln (binormal (`m1' ,`m2' ,`rho' )) if $ML_y1 ==1 & $ML_y2 ==1qui :replace `lnf' =`lnf' +ln (binormal (`m1' ,-`m2' ,-`rho' )) if $ML_y1 ==1 & $ML_y2 ==0qui :replace `lnf' =`lnf' +ln (binormal (-`m1' ,`m2' ,-`rho' )) if $ML_y1 ==0 & $ML_y2 ==1qui :replace `lnf' =`lnf' +ln (binormal (-`m1' ,-`m2' ,`rho' )) if $ML_y1 ==0 & $ML_y2 ==0end gen z=logptax-rnormal()ml model lf mybiprobit (private:private=logptax loginc years) (vote:vote=logptax loginc years) /athrho (zb1:logptax=loginc years z) /lns1ml maximize,matrix b=e (b)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 capture program drop mybiprobitivprogram mybiprobitivargs lnf mm1 g1 mm2 g2 athrho zb1 lns1tempvar rhoqui :gen double `rho' =tanh (`athrho' )qui :replace `lnf' =ln (normalden ($ML_y3 ,`zb1' ,exp (`lns1' )))tempvar m1 m2qui :gen double `m1' =`mm1' +`g1' *($ML_y3 -`zb1' )qui :gen double `m2' =`mm2' +`g2' *($ML_y3 -`zb1' )qui :replace `lnf' =`lnf' +ln (binormal (`m1' ,`m2' ,`rho' )) if $ML_y1 ==1 & $ML_y2 ==1qui :replace `lnf' =`lnf' +ln (binormal (`m1' ,-`m2' ,-`rho' )) if $ML_y1 ==1 & $ML_y2 ==0qui :replace `lnf' =`lnf' +ln (binormal (-`m1' ,`m2' ,-`rho' )) if $ML_y1 ==0 & $ML_y2 ==1qui :replace `lnf' =`lnf' +ln (binormal (-`m1' ,-`m2' ,`rho' )) if $ML_y1 ==0 & $ML_y2 ==0end ml model lf mybiprobitiv (private:private=logptax loginc years) (g1:) (vote:vote=logptax loginc years) (g2:) /athrho (zb1:logptax=loginc years z ) /lns1, init(b)ml maximize