0

4 つのスカラーがあるとします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ます。ここで、コマンドでこれら 30 個のスカラーをそれぞれ記述することを避けたいのでbootstrap、この目的のために次のようにループを記述しました。

set seed 234
forvalues i in 1(1)30{
local k dea_`i'
bootstrap dea_`k'=r(dea_`k'), reps(100): samprogram
}

これは機能しますが、各スカラーの出力を一度に 1 つずつ提供します。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

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 に答える