在Stata中引导逐步回归

时间:2013-07-10 05:05:19

标签: simulation stata statistics-bootstrap

我正在尝试在Stata中引导逐步回归并提取引导系数。我有两个单独的ado文件。 sw_pbs是用户使用的命令,它调用helper命令sw_pbs_simulator。

program define sw_pbs, rclass
    syntax varlist, [reps(integer 100)]
    simulate _b, reps(`reps') : sw_pbs_simulator `varlist'
end


program define sw_pbs_simulator, rclass
    syntax varlist

    local depvar : word 1 of `varlist'
    local indepvar : list  varlist - depvar
    reg `depvar' `indepvar'
    local rmse = e(rmse)
    matrix b_matrix = e(b)'
    gen col_of_ones = 1
    mkmat `indepvar' col_of_ones, mat(x_matrix)
    gen errs = rnormal(0, `rmse')
    mkmat errs, mat(e_matrix)
    matrix y = x_matrix * b_matrix + e_matrix
    svmat y
    sw reg y `indepvar', pr(0.10) pe(0.05)
    drop col_of_ones errs y

end

输出是自举系数的数据集。我的问题是输出似乎取决于第一个逐步回归模拟的结果。例如,如果我有自变量var1 var2 var3 var4并且第一个逐步模拟仅包含模型中的var1和var2,则后续模型中只会出现var1和var2。如果第一个模拟包括var1 var2和var3,那么只有var1 var2和var3将出现在后续模型中,假设它们是重要的(如果不是它们的系数将显示为点)。

例如,下面列出了错误的输出。如果变量lweight,age,lbph,svi,gleason和pgg45没有出现在第一个模拟中,它们就不会出现。

_b_lweight  _b_age  _b_lbph _b_svi  _b_lcp  _b_gleason  _b_pgg45    _b_lpsa
                       .4064831                        .5390302
                       .2298697                        .5591789
                       .2829061                        .6279869
                       .5384691                        .6027049
                       .3157105                        .5523808

我希望模型中未包含的系数始终在数据集中显示为点,我希望后续模拟看起来不依赖于第一次模拟。

1 个答案:

答案 0 :(得分:3)

通过使用_b作为捷径,第一次迭代定义了simulate在所有后续迭代中存储哪些系数。这对大多数模拟程序来说都很好,因为那些会使用一组固定的系数,而不是你想要与sw结合使用的系数。因此,我调整了程序以明确列出要存储的系数(可能在未选中时丢失)。

我还更改了您的程序,以便通过避免mkmatsvmat并将这些计算替换为predictgenerate来更快地运行。我还对其进行了更改,使其更符合Stata社区中的约定,即在用户通过指定clear选项明确请求后,命令将仅替换内存中的数据集。最后,我确保使用tempvartempname在程序中创建的变量和标量的名称与内存中已存在的名称不冲突。这些也将在程序结束时自动删除。

clear all
program define sw_pbs, rclass
    syntax varlist, clear [reps(integer 100)]

    gettoken depvar indepvar : varlist
    foreach var of local indepvar {
        local res "`res' `var'=r(`var')"
    }

    simulate `res', reps(`reps') : sw_pbs_simulator `varlist'
end

program define sw_pbs_simulator, rclass
    syntax varlist
    tempname rmse b
    tempvar yhat y
    gettoken depvar indepvar : varlist
    reg `depvar' `indepvar'
    scalar `rmse' = e(rmse)
    predict double `yhat' if e(sample) 
    gen double `y' = `yhat' +  rnormal(0, `rmse') 
    sw reg `y' `indepvar', pr(0.10) pe(0.05)

    // start returning coefficients
    matrix `b' = e(b)
    local in : colnames `b'
    local out : list indepvar - in
    foreach var of local in {
        return scalar `var' = _b[`var']
    }
    foreach var of local out {
        return scalar `var' = .
    }
end