Stata中的最大似然编程

时间:2013-09-05 17:24:29

标签: optimization stata

我正在尝试在Stata中学习ml编程。作为其中的一部分,我正在运行一个程序myprobit(该代码来自Gould,Pitblado和Sribney的Stata最大似然估计)。

capture program drop myprobit
program define myprobit
args todo b lnf g negH g1
tempvar xb lj
mleval `xb'=`b'
quietly{
gen double `lj'=normal(`xb') if $ML_y1==1
replace `lj'=normal(-`xb') if $ML_y1==0
mlsum `lnf'=ln(`lj')
if (`todo'==0|`lnf'>= .) exit
replace `g1'= normalden(`xb')/`lj' if $ML_y1==1
replace `g1'=-normalden(`xb')/`lj' if $ML_y1==0
mlvecsum `lnf' `g'=`g1', eq(1)
if (`todo'==1|`lnf'==>.)exit
mlmatsum `lnf' `negH'=`g1'*(`g1'+`xb'),eq(1,1)
}
end

sysuse cancer, clear
gen drug2=drug==2
gen drug3=drug==3
ml model d1 myprobit (died=drug2 drug3 age)
ml check
ml maximize

但是,我收到了错误varlist required: 以下是其执行情况:

------------------------------------------------------------------------------
-> myprobit 1 __000000 __000001 __000002 __000003 
          - `begin'
          = capture noisily version 11: myprobit 1 __000000 __000001 __000002 __000003 
            ---------------------------------------------------------------------------------------------------------------------------------- begin myprobit ---
            - args todo b lnf g negH g1
            - tempvar xb lj
            - mleval `xb'=`b'
            = mleval __000005=__000000
            - quietly{
            - gen double `lj'=normal(`xb') if $ML_y1==1
            = gen double __000006=normal(__000005) if died==1
            - replace `lj'=normal(-`xb') if $ML_y1==0
            = replace __000006=normal(-__000005) if died==0
            - mlsum `lnf'=ln(`lj')
            = mlsum __000001=ln(__000006)
            - if (`todo'==0|`lnf'>= .) exit
            = if (1==0|__000001>= .) exit
            - replace `g1'= normalden(`xb')/`lj' if $ML_y1==1
            = replace = normalden(__000005)/__000006 if died==1
varlist required
              replace `g1'=-normalden(`xb')/`lj' if $ML_y1==0
              mlvecsum `lnf' `g'=`g1', eq(1)
              if (`todo'==1|`lnf'==>.)exit
              mlmatsum `lnf' `negH'=`g1'*(`g1'+`xb'),eq(1,1)
              }
            ------------------------------------------------------------------------------------------------------------------------------------ end myprobit ---
          - `end'
          = set trace off
------------------------------------------------------------------------------
Fix myprobit.
r(100);

end of do-file

注意:如果可能性评估程序更改为do,程序将运行时不会出错。 任何有关这方面的建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

您为程序提供了5个参数,但需要6个参数。因此,未定义本地宏g1,当您尝试replace它命名的变量时,它会咬人。

Stata告诉你其中的一些。行

- replace `g1'= normalden(`xb')/`lj' if $ML_y1==1
= replace = normalden(__000005)/__000006 if died==1

显示本地宏g1被解释为空,即空字符串,因此Stata会抱怨,因为它需要replace之后的变量名称。

该行

if (`todo'==1|`lnf'==>.)exit

也存在问题,因为运营商==>应为>=

这些是我注意到的问题;可能还有其他人。