【问题标题】:Mata in .ado files.ado 文件中的 Mata
【发布时间】:2023-03-16 21:04:02
【问题描述】:

我目前正在 .ado 文件中编写一个小的 Stata 程序。在这个 .ado 文件中,我想使用 Mata 来使用 optimize() 函数。当我键入 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

提前致谢。

【问题讨论】:

    标签: stata


    【解决方案1】:

    您应该将 Mata 代码放在最后的单独块中。

    示意图,

    program 
    
    end 
    
    mata: 
    
    end
    

    另外,不要使用程序名称test,这是官方命令的名称。

    另见

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

    为了正确的拼写Stata,Mata。

    【讨论】:

    • 感谢您的回复。通过这样做,我是否能够在 Stata 程序中调用本地 lambda_c(我在 Mata 代码中找到),即使 Mata 代码随后出现?关于名字test,只是我在这里用过的名字,但是谢谢:)
    • 是的。这里的关键是这段代码只是定义了一个程序。在运行之前需要定义整个程序。先来的其实无关紧要,只是你发现end的问题需要参考前面的开场白。也就是说,我不明白这个程序要做什么,但是在调用 Mata 函数之前定义 lambda_c 没有意义(也没有伤害)。
    • 非常感谢。这真的是一个很好的答案。所以你的意思是,我不需要在任何地方定义lambda_cst_local("lambda_c",strofreal(temp)) 将创建一个名为lambda_c 的本地名称,其值为temp?只是为了确定。
    • 正确:如果您的 Mata 函数不需要被赋予 lambda_c 的值,那么 Mata 会很乐意在调用程序中创建它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多