Мата в файлах .ado

В настоящее время я пишу небольшую программу Stata в файле .ado. В этом файле .ado я хочу использовать Mata, чтобы использовать функции оптимизации(). Когда я набираю end для выхода из MATA, файл .ado читает это как конец программы (я думаю). Как мне это сделать? Я действительно новичок как в Stata, так и в Mata, и особенно в использовании их обоих одновременно. Вот пример моего кода:

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

Заранее спасибо.


person Stefan Hansen    schedule 27.11.2012    source источник


Ответы (1)


Вы должны поместить код Mata в отдельный блок в конце.

Схематично,

program 

end 

mata: 

end

Кроме того, не используйте имя программы test, которое является названием официальной команды.

Также см

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

для правильного написания Stata, Mata.

person Nick Cox    schedule 27.11.2012
comment
Спасибо за ответ. Сделав это, я смогу вызвать локальный lambda_c (который я нахожу в коде Mata) в программе Stata, даже если код Mata появится позже? Что касается имени test, я просто использовал его здесь, но спасибо :) - person Stefan Hansen; 27.11.2012
comment
да. Ключевым моментом здесь является то, что этот код просто определяет программу. Вся программа должна быть определена, прежде чем ее можно будет запустить. То, что идет первым, на самом деле несущественно, за исключением проблемы, которую вы обнаружили, что end должен ссылаться на предыдущий открыватель. Тем не менее, я не понимаю, что эта программа собирается делать, но нет смысла определять lambda_c до вызова функции Mata (тоже не причинит вреда). - person Nick Cox; 27.11.2012
comment
Большое спасибо. Это действительно отличный ответ. Итак, вы говорите, что мне не нужно где-либо определять lambda_c, и что st_local("lambda_c",strofreal(temp)) создаст локальный объект с именем lambda_c со значением, заданным temp? Просто чтобы быть уверенным. - person Stefan Hansen; 27.11.2012
comment
Правильно: если вашей функции Mata не нужно присваивать значение lambda_c, тогда Mata с радостью создаст ее в вызывающей программе. - person Nick Cox; 27.11.2012