3

我正在尝试在 Stata 中引导逐步回归并提取引导系数。我有两个单独的 ado 文件。sw_pbs 是用户使用的命令,它调用了辅助命令 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

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

4

1 回答 1

3

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

mkmat我还更改了您的程序,通过避免和svmat替换这些计算predict,它们将运行得更快generate。我还对其进行了更改,以使其更符合 Stata 社区中的约定,即只有在用户通过指定clear选项明确要求它之后,命令才会替换内存中的数据集。tempvar最后,我使用and确保在程序中创建的变量和标量的名称不会与内存中已经存在的名称冲突tempname。这些也将在程序结束时自动删除。

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
于 2013-07-10T08:14:35.653 回答