P5. 随机抽样

整理人:熊禹铭 (中山大学)
E-Mail:

本讲主要介绍两种随机抽样方法:无放回抽样和有放回抽样。

1. 无放回抽样

在 Stata 中,通过 sample 命令实现无放回抽样。

  • 数据产生过程
    clear
    set obs 10
    gen x = _n
    save P4_data1.dta, replace

通过以上命令,我们可以得到一列 1 到 10 的整数,如下图所示。

        x
  1.    1
  2.    2
  3.    3
  4.    4
  5.    5
  6.    6
  7.    7
  8.    8
  9.    9
 10.   10

1.1 按比例抽取

-抽取 30% 的观察值

    use P4_data1, clear
    browse
    sample 30

通过以上命令,可以得到 3 个观察值,例如:

       x
  1.   4
  2.   7
  3.   3

如果对这三行命令重复多次,得到的结果有所差别,这也是所谓“随机”抽样的含义。在 Stata 内部,通过人为设定的随机数发生器来实现随机抽样,所以这样的“随机”抽样虽然名义上是“随机”抽样,但实质上是伪随机的,其中存在一个函数的发生器。

1.2 按计数抽取

-随机抽取 5 个观察值

    use P4_data1, clear
    sample 5, count
    browse

通过以上命令,可以得到 5 个观察值,例如:

       x
  1.   7
  2.   3
  3.   4
  4.   2
  5.   9

同样的,重复多次,得到的结果也是“随机”的。

1.3 分组抽样 (sampling for each group)

分组抽样是更为复杂的抽样,我们可以在每一个组里依次去抽取一定量的观察值。

-范例 1

基于 Stata 中自带的“P4_xtdata.dta”面板数据,如下图所示。

      id   year     x
  1.    1   2001    .1
  2.    1   2002    .2
  3.    1   2003    .3
  4.    1   2004    .4
  5.    2   2001    .5
  6.    2   2002    .6
  7.    2   2003    .7
  8.    2   2004    .8
  9.    3   2001    .9
 10.    3   2002     1
 11.    3   2003   1.1
 12.    3   2004   1.2
 13.    4   2001   1.3
 14.    4   2002   1.4
 15.    4   2003   1.5
 16.    4   2004   1.6
 17.    5   2001   1.7
 18.    5   2002   1.8
 19.    5   2003   1.9
 20.    5   2004     2

这份数据一共有 3 个变量,分别为“id”,“year”,“x”,下表介绍了其具体含义:

变量名 说明
id 公司代码
year 年份
x 研究关注的某个连续变量

使用如下代码:

    use P4_xtdata, clear
    browse
    sample 50, by(id)
    xtset id year

每家公司 4 年的资料我们随机抽取两年(50%), xtset 将其示例成 Panel Data,相当于分别对 id 和 year 逐个进行排序。

抽样结果例如下图所示:

       id   year     x
  1.    1   2002    .2
  2.    1   2004    .4
  3.    2   2003    .7
  4.    2   2004    .8
  5.    3   2002     1
  6.    3   2004   1.2
  7.    4   2003   1.5
  8.    4   2004   1.6
  9.    5   2002   1.8
 10.    5   2003   1.9

如上图,第 1 家公司被抽中 02 和 04 年的观察值,而第二家公司被抽中 03 和 04 年的观察值。

-范例 2

基于 88 年妇女工资资料数据“nlsw88.dta”。

    sysuse nlsw88, clear
    des, short
    sample 50, by(race)
    des, short

使用des, short选项可以在屏幕上列示出数据的基本状况,如下所示,一共包含了 2246 个观察值。

 Contains data from C:\Program Files\Stata16\ado\base/n/nlsw88.dta
 obs:         2,246                          NLSW, 1988 extract
 vars:            17                          1 May 2018 22:52
 Sorted by: idcode

从这份数据中按照种族,每个种族内部分别抽取 50%的观察值,再次利用des, short命令可以查看抽样结果,如下所示,剩下 1124 个观察值,基本接近一半。

 Contains data from C:\Program Files\Stata16\ado\base/n/nlsw88.dta
 obs:         1,124                          NLSW, 1988 extract
 vars:            17                          1 May 2018 22:52
 Sorted by: race

1.3 分块抽样 (sampling blocks)

同样使用“P4_xtdata.dta”面板数据。这里需要介绍一个外部命令 gsample ,即一般化的 sample。

-按计数抽取

   help gsample  //外部命令
   use P4_xtdata, clear
   browse
   gsample 3, cluster(id) wor          //随机抽取三家公司

附加选项 cluster(id) 表示以公司为单位进行抽取,而不是以行(观察值)为单位进行抽取。 附加选项 wor 表示不可重复的抽样,也就是不放回抽样。抽样结果如下图所示:

       id   year     x
  1.    4   2001   1.3
  2.    4   2002   1.4
  3.    4   2003   1.5
  4.    4   2004   1.6
  5.    2   2001    .5
  6.    2   2002    .6
  7.    2   2003    .7
  8.    2   2004    .8
  9.    1   2001    .1
 10.    1   2002    .2
 11.    1   2003    .3
 12.    1   2004    .4

-按比例抽取

 use P4_xtdata, clear
 browse
 gsample 40, cluster(id) wor percent //随机抽取 60% 的公司

2. 有放回抽样

在 Stata 中,通过 bsample 命令来实现有放回抽样,’b’是 bootstrap(自抽样)的简写。

-范例 1: 截面数据

同样使用 1 到 10 的 10 个整数作为总体,代码如下:

 use P4_data1.dta, clear
 browse
 bsample
 sort x

抽样结果如下图所示,其中命令 sort 表示对观察值进行排序,观察值 4 被抽取了四次,6 被抽取了两次。

        x
  1.    2
  2.    4
  3.    4
  4.    4
  5.    4
  6.    6
  7.    6
  8.    8
  9.    9
 10.   10

-范例 2: 面板数据

面板数据同样可以进行有放回的抽样,设置选项 cluster(id) 表示抽样是以公司为单位进行的,或者理解为每次抽取的是公司的编号而不是行(观察值),代码如下:

 use P4_xtdata, clear
 browse

 bsample, cluster(id) idcluster(idnew)
 xtset idnew year

附加选项 idcluster(idnew) 重新确定了抽样样本出现的先后顺序,如下图所示:

  1.    1   2001    .1       1
  2.    1   2002    .2       1
  3.    1   2003    .3       1
  4.    1   2004    .4       1
  5.    1   2001    .1       2
  6.    1   2002    .2       2
  7.    1   2003    .3       2
  8.    1   2004    .4       2
  9.    1   2001    .1       3
 10.    1   2002    .2       3
 11.    1   2003    .3       3
 12.    1   2004    .4       3
 13.    3   2001    .9       4
 14.    3   2002     1       4
 15.    3   2003   1.1       4
 16.    3   2004   1.2       4
 17.    4   2001   1.3       5
 18.    4   2002   1.4       5
 19.    4   2003   1.5       5
 20.    4   2004   1.6       5

id 为 1 的公司被抽取了 3 次,分别被 idnew 标记为 1、2、3,如果多次重复运行代码,抽取的结果会发生变化。

近年中,bootstrap 方法的应用非常广泛。在 Stata 学术论文专题中介绍的面板门限模型中,主要是运用 bootstrap 来进行假设检验。

Note: gsample 可以完全替代 bsample 的功能,且有扩展。

-应用:bootstrap 标准误

可重复的抽样主要应用在 bootstrap 中,我们可以使用 bootstrap 去获取系数的标准误。在 Stata 中做线性回归,想要采用 bootstrap 去获得标准误,只需要在前面附加前缀bootstrap, reps(300):,代表我们进行 300 次可重复抽样,每一次可重复抽样的样本称为经验样本,用经验样本可以估计出变量的系数。 示例代码如下:

 sysuse auto, clear
 bootstrap, reps(300):  ///
     reg price weight mpg foreign, noheader

对于 300 次重复抽样的系数,比如 weight 变量,我们可以计算出一个标准差,它可以作为 weight 变量对应系数的标准误。

-等价写法:

 reg price weight mpg foreign,  ///
     vce(bootstrap, reps(300) seed(1357))

等价写法是把 bootstrap 参数写在 vce() 选项中。

Notes:

    1. 90% 以上的 Stata 命令都支持 vce(bootstrap) 选项。
    1. 本部分的详细介绍见 R7_robustSE.do