Stata:随机抽样命令介绍-gsample

发布时间:2023-01-02 阅读 681

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:滕泽鹏 (中山大学)
邮箱tengzp@mail2.sysu.edu.cn


目录


1. 简介

本篇推文介绍 Stata 中用于抽样的外部命令:gsample。该命令不仅支持简单随机抽样 (SRS),也支持不等概率抽样 (UPS),并且 SRS 和 UPS 两种方法均提供有放回抽样和无放回抽样。此外,gsample 还支持分层抽样和整群抽样。

2. 命令介绍

命令安装:

ssc install gsample,  replace
ssc install moremata, replace

关于 moremata 更多安装方法,详见连享会推文 moremata程序包手动安装方法

命令语法:

gsample [#|varname] [if] [in] [weight] [, options]

其中,# 表示样本的大小。在不指定 # 时,gsample 默认将内存中的数据替换为随机顺序的采样观测值。指定 # 以后,gsample 会存储一个反映观测值抽样频率的新变量。在不放回抽样的情况下,样本容量必须小于等于数据中的采样单元数,采样单元要么是单个观测值,要么是由 cluster() 选项指定的簇。若没有指定 # 或者所指定的 # 是空值,那么样本大小将自动设定为数据中观测到的单元数。

对于分层抽样,# 表示将从 strata() 选项确定的每个类层中选择 # 个单元。此处也可指定 varname 来替代 #,所指定的 varname 是包含每个类层特定样本容量的变量且需要为常数。

weight 用于设定进行不等概率抽样时的权重,在这种情况下,采样概率将与指定的权重成正比 (此处使用 iweightaweight 亦可,并不影响结果)。如果权重分布过于不均,可能会导致无放回的不等概率抽样 (UPS) 失败。

options 包括:

  • percent:以总体的百分比表示样本量。
  • wor:不放回抽样。
  • alt:使用更高效的 SRSWOR 算法进行不放回简单随机抽样,alt 仅在指定不放回抽样 wor 且未提供权重 weight 时才可用。
  • nowarn:在不等概率不放回抽样 (UPSWOR) 的基础上允许重复,仅在指定不放回抽样 wor 且提供了权重 weight 时可用。
  • strata(varlist):用于指定类层的变量,即在每个类层内选取样本,类层变量可以是数值型的,也可以是字符串型的。
  • rround:对所有类层的样本总量进行随机取整,仅在类层 strata(varlist) 已指定的情况下可用。一般情况下,gsample 将对样本容量进行四舍五入,但使用 rround 后,将在分层抽样的情况下进行随机取整。
  • cluster(varlist):指定识别重抽样簇的变量 (比如初始采样单元),簇变量可以是数值型的,也可以是字符串型的。如果 cluster(varlist)weight 一起使用,则假设每个簇内部权重相同。
  • idcluster(newvar):创建新的簇 ID 变量,在有放回抽样时特别有用。
  • keep:保留不符合 ifin 的观察值以及出现空值或者 0 权重的观察值。不适用该选项时,默认去除这些观察值。
  • generate(newvar):将抽样频率存储在新变量 newvar 中。如果使用了 generate(newvar),数据的原始排序顺序将被保留,对于不满足 ifin 条件的观测值,newvar 将为 0 或 1,如果同时使用了选项 keep,则为 1,否则为 0。
  • replace:覆盖替换现有变量。
  • noprreserve:在运行出现 break 或 error 时不要恢复原始数据,但在使用了选项 generate() 时不可用。

3. Stata 实操

下面使用 Stata 系统数据展示 gsampl 命令的实际用法和效果。

. sysuse "auto.dta", clear // 调用系统数据
. drop in 11/74            // 为便于展示仅使用前 10 个观测值
. sort price
. gen n = _n               // 按照价格对观察值进行排序并编号
. drop rep78 headroom trunk weight foreign displacement turn gear_ratio
. gsample 
. list 

     +--------------------------------------------+
     | make             price   mpg   length    n |
     |--------------------------------------------|
  1. | Buick Riviera   10,372    16      207   10 |
  2. | AMC Pacer        4,749    17      173    5 |
  3. | AMC Spirit       3,799    22      168    1 |
  4. | Buick Opel       4,453    26      170    4 |
  5. | Buick Riviera   10,372    16      207   10 |
     |--------------------------------------------|
  6. | Buick LeSabre    5,788    18      218    8 |
  7. | AMC Spirit       3,799    22      168    1 |
  8. | Buick LeSabre    5,788    18      218    8 |
  9. | AMC Pacer        4,749    17      173    5 |
 1.  | Buick LeSabre    5,788    18      218    8 |
     +--------------------------------------------+

3.1 简单无放回抽样

此处是产生样本容量为总体 65% (无放回的简单随机样本) 的 bootstrap 样本,且内存中的数据将被采样的观测值代替。

. sysuse "auto.dta", clear 
. drop in 11/74 
. sort price
. gen n = _n 
. drop rep78 headroom trunk weight foreign displacement turn gear_ratio
. gsample 65, percent wor 
. list 

     +--------------------------------------------+
     | make             price   mpg   length    n |
     |--------------------------------------------|
  1. | Buick Opel       4,453    26      170    4 |
  2. | Buick Skylark    4,082    19      200    2 |
  3. | Buick Electra    7,827    15      222    9 |
  4. | Buick LeSabre    5,788    18      218    8 |
  5. | AMC Concord      4,099    22      186    3 |
     |--------------------------------------------|
  6. | Buick Riviera   10,372    16      207   10 |
  7. | AMC Spirit       3,799    22      168    1 |
     +--------------------------------------------+

3.2 有放回不等概率抽样

weight[] 所设定的变量为抽样的辅助变量,总体中各观察值被抽中的概率与这些观察值的辅助变量大小成正比。此处以变量 mpg 作为辅助变量来进行展示。

. sysuse "auto.dta", clear 
. drop in 11/74 
. sort price
. gen n = _n 
. drop rep78 headroom trunk weight foreign displacement turn gear_ratio
. gsample 1000 [weight=mpg], generate(fre)
. list 

     +--------------------------------------------------+
     | make             price   mpg   length    n   fre |
     |--------------------------------------------------|
  1. | AMC Spirit       3,799    22      168    1   129 |
  2. | Buick Skylark    4,082    19      200    2   107 |
  3. | AMC Concord      4,099    22      186    3   104 |
  4. | Buick Opel       4,453    26      170    4   140 |
  5. | AMC Pacer        4,749    17      173    5    87 |
     |--------------------------------------------------|
  6. | Buick Century    4,816    20      196    6   106 |
  7. | Buick Regal      5,189    20      200    7    78 |
  8. | Buick LeSabre    5,788    18      218    8    86 |
  9. | Buick Electra    7,827    15      222    9    75 |
 10. | Buick Riviera   10,372    16      207   10    88 |
     +--------------------------------------------------+

上述代码以变量 mpg 作为辅助变量,进行 1000 次有放回随机抽样并形成新变量 fre 以记录每个观察值被抽取的次数。在本次抽样中,10 个初始观察值中 mpg 最大值对应的编号 4 被抽取了 140 次,而 mpg 最小值对应的编号 9 被抽取了 75 次。这样的结果能够很直观地展现出辅助变量对于抽样的影响,即某一观察值的辅助变量值越大,其被抽取的概率越高,这就是不等概率抽样。

3.3 有放回分层抽样

此处以变量 lengthprice 作为分层依据,每个类层抽取 2 个样本,且内存中的数据不会被抽取的观测值代替,而是生成新变量 fre 以记录每个观察值被抽到的次数。

. sysuse "auto.dta", clear 
. drop in 11/74 
. sort price
. gen n = _n 
. drop rep78 headroom trunk weight foreign displacement turn gear_ratio
. gsample 2, strata(length price) generate(fre)
. list 

     +--------------------------------------------------+
     | make             price   mpg   length    n   fre |
     |--------------------------------------------------|
  1. | AMC Spirit       3,799    22      168    1     2 |
  2. | Buick Skylark    4,082    19      200    2     2 |
  3. | AMC Concord      4,099    22      186    3     2 |
  4. | Buick Opel       4,453    26      170    4     2 |
  5. | AMC Pacer        4,749    17      173    5     2 |
     |--------------------------------------------------|
  6. | Buick Century    4,816    20      196    6     2 |
  7. | Buick Regal      5,189    20      200    7     2 |
  8. | Buick LeSabre    5,788    18      218    8     2 |
  9. | Buick Electra    7,827    15      222    9     2 |
 10. | Buick Riviera   10,372    16      207   10     2 |
     +--------------------------------------------------+

可以看出,原始数据并未发生改变,并且由于变量的特征,分层实现了每个观察值作为一个单独的类层,因而每个观察值都被抽样了 2 次。

3.4 rround 的作用

在前面分层抽样的基础上,为更清晰地展示 rround 的作用,采用如下代码进行抽样:

. sysuse "auto.dta", clear 
. drop in 11/74 
. sort price
. gen n = _n 
. drop rep78 headroom trunk weight foreign displacement turn gear_ratio
. gsample 233, percent strata(length price) rround generate(fre)
. gsample 233, percent strata(length price) generate(fre2)
. list 

     +---------------------------------------------------------+
     | make             price   mpg   length    n   fre   fre2 |
     |---------------------------------------------------------|
  1. | AMC Spirit       3,799    22      168    1     2      2 |
  2. | Buick Skylark    4,082    19      200    2     2      2 |
  3. | AMC Concord      4,099    22      186    3     3      2 |
  4. | Buick Opel       4,453    26      170    4     3      2 |
  5. | AMC Pacer        4,749    17      173    5     2      2 |
     |---------------------------------------------------------|
  6. | Buick Century    4,816    20      196    6     2      2 |
  7. | Buick Regal      5,189    20      200    7     2      2 |
  8. | Buick LeSabre    5,788    18      218    8     2      2 |
  9. | Buick Electra    7,827    15      222    9     2      2 |
 10. | Buick Riviera   10,372    16      207   10     3      2 |
     +---------------------------------------------------------+

上列代码对原始数据进行了有放回的分层抽样,以 lengthprice 作为划分类层的依据,每个类层抽取的样本数为类层中观察值总数的 233%,并分别形成了 frefre2 来记录每个原始观察值被抽取的频率。

可以看出,使用了选项 rround 的抽样总共抽取了 23 个样本,而没有使用的抽样总共抽取了 20 个样本。这是因为添加了 rround 后,gsample 会对原始观察值整体进行取整,然后在对各个类层的抽样中,会有一部分类群抽取的样本数量向上取整,从而保证样本数量的充足。此处整体要抽取 23 个样本,由于有 10 个类层,因而在对 7 个类层抽取 2 个样本的同时,会随机挑选 3 个类层抽取 3 个样本。这就是 rround 的作用。

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 抽样 bootstrap, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh