Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:周圆 (中山大学)
邮箱:zhouy678@mail2.sysu.edu.cn
目录
Bootstrap 在中文中被译为自举,字面意思是提着靴子上的带子把自己提起来,在 Stata 中可以翻译为自抽样、自举法、靴带法。它是一种增广样本的统计方法,为解决小样本问题提供了很好的思路,可以用于参数估计、估计标准误和置信区间、假设检验等。对于以下的线性模型,根据样本生成过程的不同,Bootstrap 可分为经典 Bootstrap 和 Bayes Bootstrap。
经典 Bootstrap 的核心思想是:通过对原样本的观测值进行有放回地抽样,生成一系列 bootstrap 经验样本,进而通过对经验样本的计算获得统计量的分布,以达到统计推断的目的。其背后逻辑在于将原样本当成总样本,也就是说,假设原样本包含总样本的全部信息,可以通过从原样本进行抽样后再统计推断。
具体而言,假设原始样本为
例如,原始独立同分布的样本为
由于是有放回的抽样,在任何一次抽样中,原样本中每一个观测值被抽中的概率都为
然后,再对原样本进行多次有放回抽样。记 W 为随机变量 X 的抽中次数,
由 bootstrap 样本的生成过程可知,在某个经验样本中,有些观测值可能被多次抽中,而有些观测值可能一次都没有被抽中。因此,经典 Bootstrap 存在一个缺陷:bootstrap 样本中可能会出现某些观测值被抽中次数极高而其余观测值从未被抽中的情形,这会导致根据不同经验样本估计出来的参数估计量差异较大,最终得到的参数估计量的标准误较大,精度较小。
上述问题在下面的 Bayes Bootstrap 中得到了一定解决。
作为经典 Bootstrap 法的补充,Bayes Bootstrap 是由 Rubin (1981) 提出的,在操作和逻辑上都与经典 Bootstrap 很相似。两者的关键区别在于观测值权重的生成过程的不同。Bayes Bootstrap 的核心思想是:定义每一次抽样过程中原样本中任一观测值被抽中的概率是均值为
也就是说,令
具体而言,假设原始样本为
记
将两种方法进行对比,可得到以下几点结论:
因此,与经典 Bootstrap 方法对比,Bayes Bootstrap 方法的优势如下:每一个观测值的权重都会大于 0,意味着在每一个 Bootstrap 样本,每一个观测值至少被抽到一次,这使得 bootstrap 样本变得更加平滑,避免了极端情况的发生。在下面的命令 exbsample
与命令 bsample
对比部分,这一点会充分体现。
命令 exbsample
用于生成 Bayes Bootstrap 方法中需要用到的经验样本的权重。这个权重可由从泊凇分布或者指数型分布 (两个分布的均值均为 1) 中重复抽取而产生。
两者相比,后者比前者具有先天优势:从指数型分布抽取的权重全为正数,导致原样本的每一个观测点都会在经验样本中出现,从而减少了极端情况的发生。
* 命令安装
ssc install exbsample, replace
* 命令语法
exbsample # [if] [in] [weight] [using filename] [, options]
其中,#
代表需要的经验样本的数目,if
代表条件语句,in
代表范围语句。options
代表其他选项,主要包括:
stub (name)
:给生成的权重变量添加变量名前缀 name
,系统默认值为 boot
。distribution (poisson or exponential)
:设定权重分布的类型,系统默认为 exponential
,即指数型分布。poisson
代表泊松分布。norescale
:取消让每一个经验样本中的权重之和等于观测值数目,或者取消让每一个类别的经验样本中的权重之和等于该类别的观察值数目 (进行聚类分析时)。balance (#)
:要求抽取每一个观测值的先验概率尽可能相等。seed (#)
:设定随机种子数 #
。strata (varlist)
:请求根据变量 varlist
进行分层抽样。svysettings
:要求聚类和分层抽样的信息能够在数据集的设定中显示出来。idvars (varlist)
:要求将权重数据和变量 varlist
同时储存在一个 frame 或者数据文件,以便与当前内存的数据进行匹配。frame (name [, linkvarname (varname) replace nofrlink])
:把生成的权重数据储存在一个新的单独的名为 name
的数据框 (frame) 中。此外,在 nofrlink
没有被定义的情况下,通过 linkvarname (name)
在新 frame 与现在的 frame 间建立起名为 name
的连结 (系统默认为 BOOTSTRAPLINk
)。replace
:要求在 frame、file 或权重变量存在的情况下,替换它们的名称。nodots
:不展示点。在演示范例前,先执行如下格式设定命令:
. set cformat %4.3f
. set pformat %4.3f
. set sformat %4.2f
范例一演示了利用 Bayes Bootstrap 法估计普通 OLS 回归模型的均方根误差 rmse 的标准误。思路如下:
exbsample
命令,从指数型分布中抽取获得经验样本的权重,重复 499 次操作以获得均方差根 (rmse) 的分布,最后计算出其标准误。具体操作过程如下所述。首先,导入 nlsw88.dta 数据。
. sysuse "nlsw88.dta", clear
接着,利用命令 exbsample
从指数型分布中重复抽样,获得 499 份经验样本的权重。
. exbsample 499, stub(rw)
然后,利用循环结构,获得每一份经验样本的均方根误差 rmse,并生成均方根误差矩阵 v。
. forvalues i = 1/499{
2. quietly regress wage age race married tenure [iw=rw`i']
3. scalar rmse`i'=e(rmse)
4. mat v = (nullmat (v), rmse`i')
5. }
最后,将均方根误差矩阵 v 转化为均方差根误差的变量 rmse,并估计 rmse 的标准误。
. mat v=v'
. svmat v, names(rmse)
. sum rmse1
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
rmse1 | 499 5.627058 .2497832 4.919367 6.405003
可以看出,最后得到的 rmse 的标准误为 0.250。画出 rmse 的频率直方图。
. histogram rmse1, title ("均方根误差 rmse 的频率直方图")
例二演示了利用 Bayes Bootstrap 法来获得普通 OLS 回归模型中的变量系数估计值的标准误和置信区间。这里同样使用 nlsw88.dta 数据,具体操作步骤如下所述。
首先导入数据,并利用命令 exbsample
从指数型分布中重复抽样,获得 499 份经验样本的权重。
. sysuse "nlsw88.dta", clear
. exbsample 499, stub(rw)
然后,利用 svy bootstrap
进行 Bootstrap 推断。在运行命令 svy bootstrap
之前,必须运行 svyset
命令,以确定运行涉及的数据集。
. svyset, bsrweight(rw1-rw499)
. svy bootstrap: regress wage age race married tenure
Survey: Linear regression Number of obs = 2,231
Population size = 2,231
Replications = 499
Wald chi2(4) = 144.42
Prob > chi2 = 0.0000
R-squared = 0.0452
------------------------------------------------------------------------------
| Observed Bootstrap Normal-based
wage | coefficient std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age | -0.107 0.038 -2.84 0.005 -0.181 -0.033
race | -1.233 0.242 -5.10 0.000 -1.707 -0.759
married | -0.657 0.267 -2.46 0.014 -1.180 -0.135
tenure | 0.193 0.018 10.48 0.000 0.157 0.229
_cons | 12.842 1.620 7.93 0.000 9.667 16.018
------------------------------------------------------------------------------
以变量 tenure 为例。结果显示,变量 tenure 系数的标准误为 0.018,其置信区间为 [0.157, 0.229]。
bsample
是 Stata 中对样本观测值进行有放回抽样的基本命令,可用于得到经典 Bootstrap 方法需要的经验样本。
* 命令语法
bsample [exp] [if] [in] [, options]
其中,exp
为表达式,用于指定抽取的样本个数。options
包括以下四种:
strata (varlist)
:请求根据变量 varlist
进行分层抽样。cluster (varlist)
:请求对 (多路径) 聚类进行检验,重新对估计过程进行设置;idcluster (newvar)
:创造一个新变量 newvar
,用来识别每一个聚类。weight (varname)
:将抽取的样本频数存放在变量 varname
(已定义) 中。此时,只有 varname
的值改变,而原始数据不会改变。使用命令 bsample
进行 N 次有放回的抽样后,得到一个观测值频数之和为 N 的经验样本。如上所述,可以知道,在这个经验样本中,观测值的样本频数的取值范围为 [0, N]。将命令 bsample
与命令 exbsample
对比,可得到以下几点结论。
bsample
是直接对观测值 (X,Y) 进行抽样;命令 exbsample
是对观测值的权重进行抽样。exbsample
包含但不限于命令 bsample
能够实现的功能。由上所述可知,当命令 exbsample
从泊凇分布中抽取经验样本的权重时,其本质上与命令 bsample
相同,得到的结果都为离散权重。此外,命令 exbsample
还能从指数型分布中抽取经验样本的权重,这可以抽取严格为正的连续权重。这里用 nlsw88.dta 演示对比分别用命令 bsample
和命令 exbsample
进行重复抽样的效果,具体操作如下所述。首先,导入数据。
. sysuse "nlsw88.dta", clear
然后,利用命令 bsample
进行重复抽样获得一个经验样本。其中,变量 bootstrap_weights 储存该经验样本中观测值的整数权重。
. gen bootstrap_weights = 0
. bsample, weight(bootstrap_weights)
. tab bootstrap_weights // 显示观测值抽中次数的统计情况
bootstrap_w |
eights | Freq. Percent Cum.
------------+-----------------------------------
0 | 839 37.36 37.36
1 | 812 36.15 73.51
2 | 407 18.12 91.63
3 | 143 6.37 98.00
4 | 34 1.51 99.51
5 | 11 0.49 100.00
------------+-----------------------------------
Total | 2,246 100.00
可以看出,该经验样本中有 823 个观测值的整数权重为 0,有 8 个观测值的整数权重为 5。接着,利用命令exbsample
进行从泊凇分布中重复抽样,得到观测值离散权重的经验样本。
. exbsample 1, stub(rw) distribution(poisson) // 获得整数权重
. tab rw1
rw1 | Freq. Percent Cum.
------------+-----------------------------------
0 | 826 36.78 36.78
.9833625 | 798 35.53 72.31
1.966725 | 435 19.37 91.67
2.950087 | 144 6.41 98.09
3.93345 | 35 1.56 99.64
4.916812 | 5 0.22 99.87
5.900175 | 2 0.09 99.96
6.883537 | 1 0.04 100.00
------------+-----------------------------------
Total | 2,246 100.00
可以看出,利用命令 exbsample
从泊凇分布重复抽样得到的经验样本中,有 845 个观测值的权重为 0,有 2 个观测值的权重为 5.900175。该结果与用上面用命令 bsample
抽样得到的结果类似。
利用命令 exbsample
进行从指数型分布中重复抽样,得到观测值连续权重的经验样本。
. exbsample 1, stub(dw) // 获得连续权重
. sum bootstrap_weights rw1 dw1
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
bootstrap_~s | 2,246 1 1.012175 0 5
rw1 | 2,246 1 .9990838 0 6.883537
dw1 | 2,246 1 .9357645 .0000271 9.316383
可以看出,三种权重中只有 dw1 的权值严格为正,且按方差从大到小排序,依次是
命令 boottest
是由 Roodman (2019) 编写的基于 wild (cluster) bootstrap 法 (原始自助法) 的命令。wild (cluster) bootstrap 可应用于工具变量、最大似然估计模型和误差项 (可能是很多方式) 聚集在一起的情况。boottest
提供了几种 Bootstrap 算法 (用于生成模拟数据集的算法),以及在数据集上运行的几种测试。
命令 boottest
的详细介绍,可参考连享会推文 Stata:原始聚类自助法(wild cluster bootstrap)-boottest。
将命令 boottest
与命令 exbsample
进行比较,可得到以下几点结论:
exbsample
是 Bayes Bootstap 方法的 Stata 工具,适用于独立同分布的样本。也就是说,原始样本是同方差的。而命令 boottest
是 wild cluster bootstrap 方法的 Stata 工具,适用于具有异方差的原始样本,如存在较少的集群、较少的实验组或者弱工具变量。exbsample
只能用来进行重复抽样,生成经验样本。而命令 boottest
在提供几种 Bootstrap 算法来生成经验样本的同时,还提供了在数据集上运行的几种测试。这里使用 nlsw88.dta 演示分别使用命令 exbsample
和命令 boottest
检验变量系数的零假设。在这里,我们使用 wage (妇女工资) 对 tenure (工作年限),ttl_exp (总工作经验),collgrad (是否毕业) 进行回归。设置抽取 499 个经验样本,随机种子数为 123。在考虑异方差时,将原样本在行业层面 (industry) 进行聚类。
先利用命令 exbsample
检验变量 tenure 系数的零假设。具体操作如下所述。
首先,计算出采取 Bayes Bootstrap 方法的变量 tenure 系数的
. sysuse "nlsw88.dta", clear
. exbsample 499 , stub(rw) seed(123)
. svyset, bsrweight(rw1-rw499)
. svy bootstrap: regress wage tenure ttl_exp collgrad
Survey: Linear regression Number of obs = 2,231
Population size = 2,231
Replications = 499
Wald chi2(3) = 332.01
Prob > chi2 = 0.0000
R-squared = 0.1270
------------------------------------------------------------------------------
| Observed Bootstrap Normal-based
wage | coefficient std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
tenure | 0.032 0.025 1.29 0.197 -0.017 0.081
ttl_exp | 0.274 0.030 9.03 0.000 0.214 0.333
collgrad | 3.252 0.291 11.17 0.000 2.681 3.822
_cons | 3.390 0.297 11.41 0.000 2.808 3.972
------------------------------------------------------------------------------
根据公式计算出变量 tenure 系数的 t 统计量为 0.032
然后,利用循环结构,得到出变量 tenure 系数的 t 统计量的分布。
. forvalues i = 1/499{
2. quietly regress wage tenure ttl_exp collgrad [iw=rw`i']
3. scalar t_tenure`i'=_b[tenure]/_se[tenure]
4. mat k = (nullmat(k), t_tenure`i')
5. }
. mat k=k'
. svmat k,names(t_tenure_exbsample)
利用命令 boottest
检验变量 tenure 的零假设。首先,安装 boottest
命令。
* 命令安装
· ssc install boottest, replace
然后,我们利用变量 wage 对 tenure,ttl_exp,collgrad 进行回归,并在行业层面 ( industry) 进行聚类。
. regress wage tenure ttl_exp collgrad, cluster(industry)
Linear regression Number of obs = 2,217
F(3, 11) = 56.79
Prob > F = 0.0000
R-squared = 0.1255
Root MSE = 5.402
(Std. err. adjusted for 12 clusters in industry)
------------------------------------------------------------------------------
| Robust
wage | Coefficient std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
tenure | 0.030 0.028 1.08 0.304 -0.032 0.093
ttl_exp | 0.273 0.047 5.81 0.000 0.170 0.376
collgrad | 3.255 0.397 8.21 0.000 2.382 4.129
_cons | 3.420 0.285 11.98 0.000 2.792 4.048
------------------------------------------------------------------------------
接着,利用 boottest
进行检验,并储存为模拟分布。
. boottest tenure, svmat seed(123) nograph reps(499)
Wild bootstrap-t, null imposed, 499 replications, Wald test, bootstrap clustering by industry, Rademacher weights:
tenure
t(11) = 1.0772
Prob>|t| = 0.2725
95% confidence set for null hypothesis expression: [−.02972, .1344]
上述 boottest
检验所设定的前提条件为联合零假设的 wild bootstrap-t 检验,施加了选项 null
,使用权重为 Rademacher 权重。根据上述结果可知,由于遵循 Stata 约定,waldtest 使用 boottest
进行反向推断,得出 tenure 系数的 95% 置信区间为 [-0.02972, 0.1344]。所以在 5% 的显著性水平下不能拒绝了变量 tenure 系数为 0 的假设。
最后,我们将 Bootstrap 的准 r(dist)
,
. mat v = r(dist)
. svmat v, names(t_tenure_boottest)
. twoway (kdensity t_tenure_exbsample1) (kdensity t_tenure_boottest1), ///
> legend(order(1 "exbsample" 2 "boottest" ) ring(0) pos(1)) ///
> title("变量tenure系数的t统计量") ytitle("kdensity")
下面,我们画出两种方法得到的变量 tenure 系数的
Rubin (1981) 提出,Bayes Bootstrap 方法和经典 Bootstrap 在理论和逻辑上都一致,两者的不同在于数据的生成过程不一样。因此,在大多数 Bootstrap 方法应用的场景,Bayes Bootstrap 方法也有用武之地。自 Rubin 首次提出至今,Bayes Bootstrap 方法的理论体系一直在不断发展和完善。
此外,在热门的机器学习领域,Bayes Bootstrap 方法也有应用。比如,Xu 等 (2022) 将 Bayes Bootstrap 方法应用于拉索模型 (Lasso),进行统计推断。
Note: 产生如下推文列表的 Stata 命令为:
lianxh bootstrap 标准误, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh