假设我有四个标量:称之为dea_1 dea_2 dea_3 dea_4
。它们是从程序samprogram
输出的(此处未显示)。
现在我在Stata中使用这些标量的bootstrap
命令来获取引导标准错误。
set seed 123
bootstrap dea_1=r(dea_1)dea_2=r(dea_2)dea_3=r(dea_3)dea_4=r(dea_4), reps(100): samprogram
这很好,但在我的原始程序中,我计算了30个标量,dea_1 dea_2 ... dea_30
。现在我想避免在bootstrap
命令中编写这30个标量中的每一个,为此我写了一个循环如下:
set seed 234
forvalues i in 1(1)30{
local k dea_`i'
bootstrap dea_`k'=r(dea_`k'), reps(100): samprogram
}
这样可行,但一次为每个标量提供输出。但是,我正在寻找代码,避免在bootstrap
命令中编写所有标量,但仍然同时为所有标量提供输出(即类似于以下命令的输出)
set seed 345
bootstrap dea_1=r(dea_1)dea_2=r(dea_2)dea_3=r(dea_3)dea_4=r(dea_4)[omitted]...dea_30=r(dea_30), reps(100): samprogram
在这方面的任何帮助将受到高度赞赏。
答案 0 :(得分:2)
这样可以逐步构建本地宏的内容。
set seed 123
forval i = 1/30 {
local call `call' dea_`i'=r(dea_`i')
}
bootstrap `call', reps(100) : samprogram
如果需要,请事先通过
清空宏local call
http://www.stata-journal.com/sjpdf.html?articlenum=pr0005 [免费.pdf]
中的更多讨论(LATER)请注意,与您的断言相反的是代码
set seed 234
forvalues i in 1(1)30{
local k dea_`i'
bootstrap dea_`k'=r(dea_`k'), reps(100): samprogram
}
不会按预期工作。例如,第一轮,bootstrap
将寻找r(dea_dea_1)
,并且每个样本都会丢失。重复调用bootstrap
的代码可能只是
set seed 234
forvalues i = 1/30 {
bootstrap dea_`i'=r(dea_`i'), reps(100): samprogram
}
但是如果你能在一次通话中做你想做的事情,这将是一个坏主意。
答案 1 :(得分:1)
另一种解决方案是制作您的计划eclass
并将结果返回到矩阵e(b)
。这允许快捷方式bootstrap _b, reps(100): samprogram
。以下是一个例子。这里的关键点是不同的标量存储在行向量`b'
中,该行向量由程序作为行向量e(b)
返回,并带有命令:
ereturn post `b', esample(`touse')
这里有一个完整的例子:
clear all
program define sim, eclass
syntax varlist(numeric) [if] [in], by(varname numeric)
marksample touse
markout `touse' `by'
local k : word count `varlist'
tempname b m0
matrix `b' = J(1,`k',.)
local i = 1
foreach var of local varlist {
sum `var' if `touse' & `by', meanonly
scalar `m0' = r(mean)
sum `var' if `touse' & !`by', meanonly
matrix `b'[1,`i'] = `m0' - r(mean)
local i = `i' + 1
}
ereturn post `b', esample(`touse')
end
sysuse auto
bootstrap _b, reps(100) : sim price mpg length weight trunk, by(foreign)