2012-11-27 70 views
2

我目前正在一個.ado文件中寫一個小Stata程序。在這個.ado文件中,我想使用Mata來使用optimize()函數。當我輸入end以退出MATA時,.ado文件將此讀作程序結束(我認爲)。我如何去做這件事?我對Stata和Mata都非常陌生,特別是他們同時使用它們。這裏是我的代碼示例:馬塔在.ado文件

program define test 
args epv prev0 prev1 sample_size bin_prev rep 

local prevdiff=`prev1'-`prev0' 
local t=-log(1-`prev0') 
local eventprob=`epv'/`sample_size' 
local lambda_c=0.5 
local lambda_0=1 
local lambda_1=-log(1-`prev0'-`prevdiff')/`t' 

mata 
mata clear 

void cens_func(todo, x, y, g, H) 
{ 
y = "some function of x and the locals" 
} 

S = optimize_init() 
optimize_init_evaluator(S, &cens_func()) 
optimize_init_which(S, "min") 
optimize_init_params(S, 1) 
temp=optimize(S) 
st_local("lambda_c",strofreal(temp)) 

end 

some Stata code here 

end 

在此先感謝。

回答

2

你應該把Mata代碼放在一個單獨的塊中。

示意,

program 

end 

mata: 

end 

另外,不要使用該程序的名稱test,這是一個官方的命令的名稱。

而且,看到

http://www.stata.com/support/faqs/resources/statalist-faq/#spell

正確拼寫的Stata,馬塔。

+0

感謝您的回覆。通過這樣做,即使Mata代碼之後出現,我是否能夠在Stata程序中調用本地的'lambda_c'(我在Mata代碼中找到)?關於名稱'測試',這只是我在這裏用過的東西,但是謝謝:) –

+0

是的。關鍵是這個代碼只是定義了一個程序。整個程序需要在運行之前進行定義。實際上首先是非物質的,除了你發現'end'需要引用前一個開叫者的問題。也就是說,我不明白這個程序會做什麼,但是在調用Mata函數之前定義'lambda_c'沒有意義(也沒有傷害)。 –

+0

非常感謝。這真是一個很好的答案。所以你說的是,我不需要在任何地方定義'lambda_c',並且'st_local(「lambda_c」,strofreal(temp))'將會創建一個名爲'lambda_c'的本地值, temp'?只是要確定。 –