您的代码中有几个错误:
- 您的程序
powersim3
需要选项ry1()
、ry2()
、 r12()
和n()
。在您给您的电话中simulate
省略了这些选项。
- 你的程序必须从删除变量 y x1 x2 开始;否则它将在第二次迭代时返回错误,然后在尝试
generate
使用已经存在的变量时返回错误。
- 该
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。前者是用户调用的命令,后者是simulate
内部调用的命令powersim3
。由于powersim3
将擦除当前内存中的所有数据并将其替换为模拟结果,因此我坚持让用户指定该clear
选项。这种保护措施是 Stata 世界的惯例。我添加了一个选项reps()
,以便用户可以指定复制次数。其余选项由*
的syntax
命令捕获powersim3
。这意味着用户指定的任何其他选项都存储在本地宏`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 文件来做你想做的事。