首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Stata中的simulate命令无法识别用户程序

Stata中的simulate命令无法识别用户程序
EN

Stack Overflow用户
提问于 2013-06-18 05:07:54
回答 1查看 654关注 0票数 0

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

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

代码语言:javascript
复制
******
 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命令(如果您不使用simulate,这是可行的)。我希望这里有一个简单的解决方案--但我对Stata还不够熟练,不知道简单的答案是什么。任何建议都会非常有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-18 16:24:45

您的代码中有几个错误:

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

修复所有这些,一个有效的例子是:

代码语言:javascript
复制
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命令。

*- begin文件powersim3.ado

代码语言:javascript
复制
program define powersim3
    syntax , clear [ reps(integer 100) * ]
    simulate _b _se, reps(`reps') : powersim3_simulator, `options'
end

*- end file powersim3.ado

*-开始文件powersim3_simulator.ado

代码语言:javascript
复制
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文件

代码语言:javascript
复制
program define foo
    ...
    bar
    ...
end

program define bar
    ...
end

*-结束foo.ado文件

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17156909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档