如何在Stata中结合人口权重与Bootstrapping计算分位数?
在Stata中为加权分位数计算添加Bootstrapping功能
方法一:按年份分组直接使用Bootstrap命令
Stata的bootstrap命令支持结合权重与分组操作,可直接基于加权分位数结果执行Bootstrap抽样,步骤如下:
运行以下代码,指定Bootstrap重复次数(建议至少1000次)、随机种子(保证结果可复现),并按year分组计算:
bootstrap p10=r(p10) p90=r(p90) p95=r(p95) p99=r(p99), by(year) reps(1000) seed(1234) nowarn: summarize income, detail [iweight=wg]
by(year):对每个年份的观测独立执行Bootstrap抽样reps(1000):设置Bootstrap重复抽样次数,数值越大结果越稳定seed(1234):固定随机种子,确保结果可重复summarize income, detail [iweight=wg]:带权重计算分位数,r(p10)等为命令返回的分位数结果
运行后会输出每个年份各分位数的Bootstrap估计值、标准误及置信区间。
方法二:自定义程序批量处理所有年份
如果需要更灵活的结果输出格式,可以自定义程序计算所有年份的加权分位数,再用bootstrap包裹执行:
- 定义计算分位数的程序:
program define weighted_yearly_quantiles, rclass collapse (p10) p10=income (p90) p90=income (p95) p95=income (p99) p99=income [iweight=wg], by(year) // 将每个年份的分位数以标量形式返回 forvalues i = 1/`=_N' { local current_year = year[`i'] return scalar p10_`current_year' = p10[`i'] return scalar p90_`current_year' = p90[`i'] return scalar p95_`current_year' = p95[`i'] return scalar p99_`current_year' = p99[`i'] } end
- 执行Bootstrap抽样:
bootstrap, reps(1000) seed(1234): weighted_yearly_quantiles
- 后续可通过
estimates命令导出结果,或手动整理返回的标量值。
注意事项
- 权重适配:你的代码使用
iweight(频数权重),Stata的bootstrap会自动按权重对应的频数进行有放回抽样,符合加权Bootstrap的逻辑。 - 计算效率:
reps()数值越大计算时间越长,可根据需求调整,最低建议不低于500次。
内容的提问来源于stack exchange,提问作者mostlyharmless563
相关产品推荐
相关产品推荐

