2013-09-05 50 views
1

我想學習Stata中的ml編程。作爲其中的一部分,我正在運行一個程序myprobit(該代碼採用最大似然估計與Gould,Pitblado和Sribney的Stata進行比較)。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

您向程序提供了5個參數,但需要6個參數。因此,本地宏g1未定義,當您嘗試使用replace變量時,它會咬人。

Stata告訴你一些這個。該行

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

表明,當地的宏g1被解釋爲無,即是空字符串,那麼塔塔抱怨,因爲它replace後需要一個變量名。

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

也是有問題的,當操作者==>>=

這些是我注意到的問題;可能有其他人。

+0

感謝您的回答。至於'g1',這本書說它是'ml'程序生成的'double'變量,所以我們只需用代碼中提供的分析梯度替換'ml'程序計算出的數值梯度。是的,運算符==>應該被替換爲> =。 – Metrics