Stata:虚拟变量专题-生成与使用

发布时间:2021-04-04 阅读 2757

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

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

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

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

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

⛳ Stata 系列推文:

作者:冷萱(西南财经大学)
邮箱lx@smail.swufe.edu.cn

编者按:本文主要摘译自下文,特此致谢!
Source:Cox N J, Schechter C B. Speaking Stata: How best to generate indicator or dummy variables[J]. The Stata Journal, 2019, 19(1): 246-259. -PDF-


目录


1. 引言

在实证分析中,虚拟变量应用较为广泛,例如可以作为被解释变量 (是否创业、是否上大学等),解释变量 (DID 中经常用到),控制变量 (是否城镇、是否老年人、是否党员等),并且相对简单。即便如此,生成虚拟变量仍有诸多细节需要注意,否则会导致虚拟变量存在偏差。

为此,本文将对 Cox 和 Schechter (2019) 关于如何生成虚拟变量的文章进行简要介绍,以帮助大家对 Stata 生成虚拟变量的要点及注意事项有更好的理解。

2. 分类变量生成虚拟变量

对于分类变量,我们是无法直接放入模型中进行回归的,例如微观调查数据中,个体的受教育程度 (小学、初中、高中等)。此时,一般会有两种处理方法:

  • 一是将受教育程度转换为受教育年限,即连续变量;
  • 二是将受教育程度转换为不同类别的虚拟变量。

下面是基于 CFPS2018 个人问卷中的受教育水平生成虚拟变量的具体命令。其中,CFPS2018 个人问卷数据需到「中国家庭追踪调查」官网申请下载。

. use cfps2018person_201911.dta, clear

. tab cfps2018edu, gen(edu)

     CFPS2018个人问 |
       卷受访者已完 |
       成的最高学历 |      Freq.     Percent        Cum.
--------------------+-----------------------------------
        文盲/半文盲 |      7,661       23.45       23.45
               小学 |      7,194       22.02       45.47
               初中 |      9,202       28.17       73.64
高中/中专/技校/职高 |      4,915       15.05       88.69
               大专 |      2,041        6.25       94.94
           大学本科 |      1,529        4.68       99.62
               硕士 |        118        0.36       99.98
               博士 |          7        0.02      100.00
--------------------+-----------------------------------
              Total |     32,667      100.00

上述命令执行后,会生成教育水平对应的虚拟变量,分别为 edu1edu2edu3edu4edu5edu6edu7edu8,对应原始教育水平的 8 个类别。具体来看,当个体受教育水平为文盲/半文盲时,edu1=1,否则 edu1=0,以此类推。

. sum edu1-edu8

 Variable |     Obs      Mean    Std. Dev.   Min   Max
----------+-------------------------------------------
     edu1 |  32,667   .234518    .4237037      0     1
     edu2 |  32,667  .2202222    .4144028      0     1
     edu3 |  32,667   .281691    .4498304      0     1
     edu4 |  32,667  .1504576    .3575249      0     1
     edu5 |  32,667   .062479    .2420271      0     1
----------+-------------------------------------------
     edu6 |  32,667  .0468056    .2112256      0     1
     edu7 |  32,667  .0036122    .0599939      0     1
     edu8 |  32,667  .0002143    .0146371      0     1

注意事项

  • 使用 tab 生成虚拟变量时,要注意异常值对结果的影响。例如,某些受访者拒绝回答自己受教育程度,数据对应编码可能为 -2 或其他。因此,在正式生成虚拟变量前要检查相关变量的类别是否有异常值。如果有异常值,可以选择进行填补或定义为缺失值 (recode cfps2018edu (-2==.));
  • 以上生成的 8 个虚拟变量不能同时放入回归方程中进行分析,因为需要选择一组作为对照组。如果全部纳入回归,Stata 则会自动剔除一类作为对照组;
  • 将以上 7 个教育程度的虚拟变量纳入回归方程时,对于虚拟变量系数的解读需要尤其注意。这里每一组的参照组均为未纳入回归方程的那一组。例如,未将 edu1 (文盲/半文盲) 纳入方程,那么 edu2 (小学) 的系数解读应该为,相对于文盲或半文盲,上过小学对被解释变量有多大影响,其他以此类推。

3. 连续变量生成虚拟变量

对于一些连续变量,我们可能会按照取值是否大于均值将其分为高低两类。例如,当收入水平 (连续变量) 超过全样本均值时,虚拟变量取值为 1 (高收入人群),反之取值为 0 (低收入人群)。

. sum income

Variable |    Obs      Mean    Std. Dev.   Min     Max
---------+--------------------------------------------
  income | 32,669  14043.73    29701.14     -8  840000

. gen high_income = (income> `r(mean)')

上述生成虚拟变量的方式主要是借助了一个逻辑判断,即当 = 后面为真时,取值为1,否则为 0。当然,我们也可以使用类似的命令生成一个中等收入 (收入介于 6-20 万) 虚拟变量。

. gen middle_income = (income >= 60000) & (income <= 200000)

注意事项

  • 这里依然需要注意数据的异常值。较为细心的读者可能已经发现,在sum income 呈现的结果中,最小值为-8,这是一个不好的信号。建议在清理每一个变量时,先使用 tab 查阅一下数值分布,是否有异常。如果有异常值,则需要先对异常值进行处理。
  • 缺失值在 Stata 中默认为最大的数值。直接使用 tab varname 时,结果并不会呈现缺失值的分布。但是,在使用连续变量生成虚拟变量时,如果遗漏了缺失值就可能造成结果错误。例如,个体还没参加工作,对应个体收入水平可能定义为缺失值 ".",但 Stata 默认 "." 为无穷大。正确的做法是在命令后面加上 if !missing(income)
. sum income

 Variable |    Obs      Mean   Std. Dev.  Min        Max
----------+---------------------------------------------
   income | 32,669  14043.73   29701.14    -8     840000

. gen high_income = (income > `r(mean)') if !missing(income)

4. 生成虚拟变量的进阶做法

4.1 根据多个变量生成虚拟变量

上文都是基于某一个变量生成虚拟变量,在处理数据过程中,可能需要借助多个变量来生成虚拟变量。例如,生成一个家庭是否有未成年人的虚拟变量时,我们需要结合年龄 age 和家庭编码 fid18 来进行处理。

. egen any_children = max(age < 18), by(fid18)

上述命令的具体含义为,生成一个虚拟变量 any_children,并以家庭编码 fid18 作为分组依据,以 max(age < 18) 为判断条件。其中,max(age < 18) 可以理解为 max(1 if age < 18; 0 otherwise),这里 max 为取 0 和 1 较大值。之所以如此,是考虑到家庭成员不止一个,但是只要家里有小于 18 岁的个体,any_children 就取值为 1,否则为 0。

4.2 借助 inlist() 命令生成虚拟变量

inlist() 命令语法为 inlist(z, var1, var2,...)。该命令具体含义是 var1var2,...中任意一个变量取值为 z,则虚拟变量取值为 1,否则为 0。

具体来看,前文已经生成了 edu1edu2edu3edu4edu5edu6edu7edu8 等 8 个虚拟变量,现在我们想在上述变量基础上生成一个新的虚拟变量,即个体是否完成初中及以上教育 (edu3 对应是否完成初中教育)。实现上述过程的两种方法如下:

*-方法1
. generate middle_school_1 =  ///
          (edu3 == 1) | (edu4 == 1) | ///
          (edu5 == 1) | (edu6 == 1) | ///
          (edu7 == 1) | (edu8 == 1)

*-方法2
. generate middle_school_2 = inlist(1, edu1, edu2, edu3, edu4, edu5, edu6, edu7, edu8)

4.3 借助 inrange() 命令生成虚拟变量

inrange() 命令语法为 inrange(var, a, b)。该命令具体含义为,当变量 var 的取值介于 [a, b] 之间时,虚拟变量取值为 1,否则为 0。与上文类似,我们生成中等收入 (收入介于 6-20 万) 虚拟变量为例。inrange() 命令实现如下:

. gen middle_income = inrange(income, 60000, 200000)

5. 总结

虚拟变量的生成方式有很多,并且不同的命令的便捷程度也不一样。但是,无论使用哪种方式,在生成虚拟变量之前都需要对相关变量进行检查,以确保无异常值或缺失值。否则,按照以下方式处理:

  • 如果有异常值则需要处理 (填补) 为正常值或缺失值;
  • 如果存在缺失值,要注意 Stata 会将其识别为最大的数字。在生成虚拟变量时候要格外小心。

若需实操本文介绍的命令,也可以使用 sysuse "nlsw88.dta", clear 调入 Stata 自带数据文件 nlsw88.dta 进行练习。

6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 虚拟变量 缺失值 补漏 egen, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

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

课程主页

课程主页

关于我们

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

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

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

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

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