【问题标题】:Bootstrapping Stepwise Regression in Stata在Stata中引导逐步回归
【发布时间】:2013-07-10 05:05:18
【问题描述】:

我正在尝试在 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

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

【问题讨论】:

  • 可以说,您应该考虑将从逐步回归中剔除的系数设置为零,而不是缺失值。其他模型选择方法(例如套索)明确地执行此操作。零是回归系数的有效值,它给出与模型相同的拟合值,系数由sw...维护,从统计角度来看,这是一种有趣且错误的方法。但这是讨论 CV 的重点,而不是 SO :)。

标签: simulation stata statistics-bootstrap


【解决方案1】:

通过使用_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

【讨论】:

  • 我认为程序仍然存在第一次模拟中没有被逐步回归选择的变量在之后的任何模拟中都不会被选择的问题。我已在主要问题中添加了此问题的示例。
  • 我想我现在明白了这个问题,我已经相应地编辑了答案。
猜你喜欢
  • 2020-08-03
  • 2021-04-05
  • 2019-01-05
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2018-08-31
  • 1970-01-01
相关资源
最近更新 更多