我正在尝试在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
我希望模型中未包含的系数始终在数据集中显示为点,我希望后续模拟看起来不依赖于第一次模拟。
答案 0 :(得分:3)
通过使用_b
作为捷径,第一次迭代定义了simulate
在所有后续迭代中存储哪些系数。这对大多数模拟程序来说都很好,因为那些会使用一组固定的系数,而不是你想要与sw
结合使用的系数。因此,我调整了程序以明确列出要存储的系数(可能在未选中时丢失)。
我还更改了您的程序,以便通过避免mkmat
和svmat
并将这些计算替换为predict
和generate
来更快地运行。我还对其进行了更改,使其更符合Stata社区中的约定,即在用户通过指定clear
选项明确请求后,命令将仅替换内存中的数据集。最后,我确保使用tempvar
和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