0

假设我有四个标量:调用它们dea_1 dea_2 dea_3 dea_4。它们是程序的输出 samprogram(此处未显示)。

现在我bootstrap在 Stata 中使用带有这些标量的命令来获取引导的标准错误。

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

在这方面的任何帮助将不胜感激。

4

2 回答 2

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]中的更多讨论

(稍后)请注意,与您的断言相反,代码

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
}

但是当你可以在一个电话中做你想做的事情时,这将是一个坏主意。

于 2013-06-16T23:50:04.190 回答
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)
于 2013-06-17T08:03:28.037 回答