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

Stata中的simulate命令无法识别用户程序,stata,simulate,Stata,Simulate,我写了一个模拟多元回归结果的小程序。我可以逐行运行它(使用实际值而不是语法命令),但是当我把它放在ado中时,它不能正常工作 基本思想是使用drawnorm生成一个数据集,对其运行回归,然后使用simulate选项反复执行。我使用单个命令行[powersim3,ry1(.30)ry2(.30)r12(.30)n(282)]来运行下面的语法(封装在*******) 问题似乎是simulate命令无法识别上面的powersim3命令(如果您不使用simulate,则此操作有效)。我希望这里有一个简单

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

基本思想是使用
drawnorm
生成一个数据集,对其运行回归,然后使用
simulate
选项反复执行。我使用单个命令行
[powersim3,ry1(.30)ry2(.30)r12(.30)n(282)]来运行下面的语法(封装在*******)


问题似乎是
simulate
命令无法识别上面的
powersim3
命令(如果您不使用simulate,则此操作有效)。我希望这里有一个简单的解决方案——但我对Stata不够精通,不知道简单的答案是什么。任何建议都会非常有用。

您的代码中有几个错误:

  • 您的程序
    powersim3
    需要选项
    ry1()
    ry2()
    r12()
    n()
    。在调用
    simulate
    时,您忽略了这些选项
  • 程序必须从删除变量y x1 x2开始;否则,它将在第二次迭代时返回错误,稍后它将尝试生成已经存在的变量
  • 语法
    语句包含各种省略空格的问题
  • 解决所有这些问题的一个有效示例是:

    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。前者是用户调用的命令,后者是在
    powersim3
    中进行
    simulate
    调用的命令。由于
    powersim3
    将删除内存中当前的所有数据,并用模拟结果替换,因此我坚持用户指定
    清除
    选项。这项保障措施是国家的惯例。我添加了一个选项
    reps()
    ,以便用户可以指定复制的数量。其余选项由
    powersim3
    语法中的
    *
    命令捕获。这意味着用户指定的任何其他选项都存储在本地宏
    `options'
    中。这些选项都传递给
    powersim3\u模拟器
    命令

    *---开始文件powersim3.ado

    program define powersim3
        syntax , clear [ reps(integer 100) * ]
        simulate _b _se, reps(`reps') : powersim3_simulator, `options'
    end
    
    *---结束文件powersim3.ado

    program define powersim3
        syntax , clear [ reps(integer 100) * ]
        simulate _b _se, reps(`reps') : powersim3_simulator, `options'
    end
    
    *---开始文件powersim3\u 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\u 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\u simulator
    只是一个帮助程序,通常可以在同一个.ado文件中添加帮助程序,类似这样

    *---开始foo.ado文件

    program define foo
        ...
        bar
        ...
    end
    
    program define bar
        ...
    end
    
    *---end foo.ado文件


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

    我认为您需要使用
    eclass
    而不是
    rclass
    。详细信息电子课堂提供相同的错误消息。而且,这不是我想要应用引导的问题。我希望每次都从人群中随机抽取一个新样本,因为这将更准确地估计交叉发布到Statalist的底层结构(功率)。最好明确声明。我的道歉是:斯塔利斯特。有没有办法删除这些邮件?这里的界面简单得多。你在Statalist上得到了更好的关注。这里没有追溯删除:看,但如果你喜欢这个论坛,不要在Statalist上发布!谢谢你在这方面的工作。上面的代码确实可以运行,但它并不完全是我想要的。我的愿望是使用一个用户提供的命令行(例如,powersim3、ry1(.30)ry2(.30)r12(.30)n(282))设置整个程序——从清除到模拟。我的目的是在一个ado文件中捕获其余内容。@ChrisAberson好的,我想我现在明白这个问题了。我已经编辑了我的答案。非常感谢你的帮助和慷慨。非常感谢。