【问题标题】:user program not recognized by simulate command in StataStata中的模拟命令无法识别用户程序
【发布时间】:2013-06-19 19:16:33
【问题描述】:

我编写了一个小程序来模拟多重回归结果。我可以逐行运行它(使用实际值而不是语法命令),但是当我把它放在 ado 中时,它不能正常工作。

基本思想是使用drawnorm 生成数据集,对其运行回归,然后使用simulate 选项反复进行。我正在使用单个命令行[powersim3, ry1(.30) ry2(.30) r12 (.30) n (282)] to run the syntax below (encased in the *****)

******
 program define powersim3, rclass
 syntax, ry1(real)ry2(real)r12(real)n(
real) [my(real 0)m1(real
0)m2(real 0)m3(real 0)sy(real 1) ///
    s1(real 1)s2(real 1)s3(real 1)alpha(real .05)help]
matrix m = (`my', `m1', `m2')
matrix sd = (`sy', `s1', `s2')
matrix r = (1, `ry1', `ry2'\ `ry1' , 1 , `r12'\ `ry2' , `r12', 1)
drawnorm y x1 x2, n(`n') corr(r) means(m) sds(sd)
regress y x1 x2
end

simulate _b _se, reps(10000): powersim3
*****

问题似乎是simulate 命令无法识别上面的powersim3 命令(如果您不使用模拟,这将有效)。我希望这里有一个简单的解决方案——但我对 Stata 的熟练程度不高,无法知道简单的答案是什么。任何建议都会非常有帮助。

【问题讨论】:

  • 我认为您需要使用 eclass 而不是 rclass 。详情here
  • eclass 提供了相同的错误消息。此外,这不是我想应用引导程序的问题。我每次都想要一个新的随机样本,因为这将更正确地估计底层构造(Power)
  • 交叉发布到Statalist。最好明确声明。
  • 我的道歉回复:国家主义者。有没有办法删除这些消息?这里的界面要简单得多。
  • 您对 Statalist 的关注度越来越高。那里没有追溯删除:见stata.com/support/faqs/resources/statalist-faq/#comment 但是如果您更喜欢这个论坛,请不要在Statalist上发帖!

标签: stata simulate


【解决方案1】:

您的代码中有几个错误:

  1. 您的程序powersim3 需要选项ry1()ry2()r12()n()。在您致电 simulate 时,您省略了这些选项。
  2. 您的程序必须从删除变量 y x1 x2 开始;否则它将在第二次迭代和稍后返回错误,因为它会尝试generate 已经存在的变量。
  3. syntax 语句包含空格被遗漏的各种问题。

解决所有这些问题,一个工作示例是:

clear all
program define powersim3, rclass
    syntax, ry1(real) ry2(real) r12(real) n(real) ///
    [ my(real 0) m1(real 0) m2(real 0) m3(real 0) sy(real 1) ///
    s1(real 1) s2(real 1) s3(real 1) alpha(real .05)]

    drop _all

    tempname m sd r
    matrix `m' = (`my', `m1', `m2')
    matrix `sd' = (`sy', `s1', `s2')
    matrix `r' = (1, `ry1', `ry2'\ `ry1' , 1 , `r12'\ `ry2' , `r12', 1)
    drawnorm y x1 x2, n(`n') corr(`r') means(`m') sds(`sd')
    regress y x1 x2
end

simulate _b _se, reps(10000): ///
    powersim3, ry1(.30) ry2(.30) r12(.30) n(282)

编辑

为了将整个过程打包到一个命令中,您需要存储两个 .ado 文件:powersim3.ado 和 powersim3_simulator.ado。前者是用户调用的命令,后者是simulatepowersim3内调用的命令。由于powersim3 将擦除当前内存中的所有数据并将其替换为模拟结果,因此我坚持让用户指定clear 选项。这种保护措施是 Stata 世界的惯例。我添加了一个选项reps(),以便用户可以指定复制次数。其余选项由powersim3syntax 命令中的* 捕获。这意味着用户指定的任何其他选项都存储在本地宏`options' 中。这些选项都传递给powersim3_simulator 命令。

*--- 开始文件 powersim3.ado

program define powersim3
    syntax , clear [ reps(integer 100) * ]
    simulate _b _se, reps(`reps') : powersim3_simulator, `options'
end

*--- 结束文件 powersim3.ado

*--- 开始文件 powersim3_simulator.ado

program define powersim3_simulator
    syntax, ry1(real) ry2(real) r12(real) n(real)                ///
        [ my(real 0) m1(real 0) m2(real 0) m3(real 0) sy(real 1) ///
        s1(real 1) s2(real 1) s3(real 1) alpha(real .05)]

    drop _all

    tempname m sd r
    matrix `m' = (`my', `m1', `m2')
    matrix `sd' = (`sy', `s1', `s2')
    matrix `r' = (1, `ry1', `ry2'\ `ry1' , 1 , `r12'\ `ry2' , `r12', 1)
    drawnorm y x1 x2, n(`n') corr(`r') means(`m') sds(`sd')
    regress y x1 x2
end

*--- 结束文件 powersim3_simulator.ado


powersim3_simulator 只是一个辅助程序,通常您可以在同一个 .ado 文件中添加辅助程序,类似这样

*--- 开始 foo.ado 文件

program define foo
    ...
    bar
    ...
end

program define bar
    ...
end

*--- 结束 foo.ado 文件

这很方便,因为它减少了程序所需的文件数量,但在这种情况下这不起作用。原因是程序bar(或在您的情况下为powersim3_simulator)将是程序foo(或在您的情况下为powersim3)的本地程序,这意味着simulate将无法找到它.所以对于这个问题,你真的需要存储两个 .ado 文件来做你想做的事。

【讨论】:

  • 感谢您为此所做的工作。上面的代码确实可以运行,但它并不是我所追求的。我的愿望是设置整个部分——从清除所有到模拟到使用单个用户提供的命令行运行(例如,powersim3、ry1(.30) ry2(.30) r12(.30) n(282)) .我的意图是在 ado 文件中捕获其余部分。
  • @ChrisAberson 好的,我想我现在明白了这个问题。我已经编辑了我的答案。
  • 非常感谢您的帮助和慷慨。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多