0

这个问题是这个问题的延续但是由于可以在不知道我之前的问题的情况下回答它,我认为发布一个新问题是解决问题的方法(如果不是这种情况,我很抱歉)。在上一个问题中,有人告诉我,将 Mata 代码放在 .ado 文件的末尾会使本地var2代码在 Stata 代码中可用。一个最小的例子如下:

program define hello
args var1
local sum_var=`var1'+`var2'
disp `sum_var'
end

mata
void cens_func(todo, x, y, g, H)
{
y = (x-1)^2
}

S = optimize_init()
optimize_init_evaluator(S, &cens_func())
optimize_init_which(S, "min")
optimize_init_params(S, 2)
temp=optimize(S)
st_local("var2",strofreal(temp))
end

不幸的是,它没有运行。我收到无效的语法错误。首先使用 Mata 代码在 .do 文件中运行它,不会导致错误。我在这里想念什么?提前致谢。

4

3 回答 3

1

具体来说,您没有定义var2这样就应该导致 a 的第一次分配local失败,因为 Stata 会看到一个悬挂的加号。

如果仅仅是因为 Stata 代码从未调用过 Mata 函数,那么在任何情况下都没有机会进行此操作。

通常,诸如“未运行”甚至“语法错误”之类的报告并不能提供真正的信息,因为它们无法向其他人提供有关正在发生的事情的真正线索。Stata 在这里没有错,因为它提供了调试工具,因此set trace on您可以看到哪条线路出现故障。

将其作为 do-file 运行只是定义了一个程序;它不能证明它是合法的,甚至是正确的。

根据这个证据,您应该尝试编写一些更简单的程序,然后才能真正实现它。即使从手册中复制一些示例程序也会有所帮助。

于 2012-11-28T12:17:28.707 回答
1

我经常这样做:

program define... 
  tempvar var2
  gen `var2' = <<whatever>>
  mata: myroutine("`var2'")
end

mata:
void myroutine(string scalar inputvar)
{
  real vector v
  st_view(v,.,inputvar)
  <<use v somehow>>
}
end

您还调用 usest_store来编写一个新的 Stata 变量。我的代码只是将它读入 Mata。

于 2012-12-21T16:09:21.197 回答
1

我会参考我昨天的回答。Mata 将创建一个新的本地,或更改一个现有的本地,但在创建之前您不能使用本地。与Mata没有任何关系改变了这一点。

在从 Stata 调用 Mata 时,请参阅help m1_ado

因此,在您的代码中,您需要在尝试使用var2Mata 函数创建之前调用 Mata var2

于 2012-11-28T12:58:22.827 回答