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

时间:2013-06-17 21:07:54

标签: stata simulate

我编写了一个用于模拟多重回归结果的小程序。我可以逐行运行(使用实际值而不是语法命令),但是当我把它放在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的熟练程度不足以知道简单的答案是什么。任何建议都会非常有用。

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误:

  1. 您的计划powersim3需要选项ry1()ry2()r12()n()。在致电simulate时,您省略了这些选项。
  2. 您的程序必须首先删除变量y x1 x2;否则它将在第二次迭代时返回错误,然后在尝试generate已存在的变量时返回错误。
  3. syntax语句包含遗漏空格的各种问题。
  4. 解决所有问题,一个有效的例子是:

    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(),以便用户可以指定复制次数。其余选项由*的{​​{1}}命令中的syntax捕获。这意味着用户指定的任何其他选项都存储在本地宏powersim3中。这些选项都传递给`options'命令。

    * ---开始文件powersim3.ado

    powersim3_simulator

    * ---结束文件powersim3.ado

    * ---开始文件powersim3_simulator.ado

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

    * ---结束文件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 只是一个帮助程序,通常你可以在同一个.ado文件中添加帮助程序,就像这样

    * ---开始foo.ado文件

    powersim3_simulator

    * ---结束foo.ado文件

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