温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装命令如下:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
⛳ 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-
目录
在实证分析中,虚拟变量应用较为广泛,例如可以作为被解释变量 (是否创业、是否上大学等),解释变量 (DID 中经常用到),控制变量 (是否城镇、是否老年人、是否党员等),并且相对简单。即便如此,生成虚拟变量仍有诸多细节需要注意,否则会导致虚拟变量存在偏差。
为此,本文将对 Cox 和 Schechter (2019) 关于如何生成虚拟变量的文章进行简要介绍,以帮助大家对 Stata 生成虚拟变量的要点及注意事项有更好的理解。
对于分类变量,我们是无法直接放入模型中进行回归的,例如微观调查数据中,个体的受教育程度 (小学、初中、高中等)。此时,一般会有两种处理方法:
下面是基于 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
上述命令执行后,会生成教育水平对应的虚拟变量,分别为 edu1、edu2、edu3、edu4、edu5、edu6、edu7、edu8,对应原始教育水平的 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==.)
);
对于一些连续变量,我们可能会按照取值是否大于均值将其分为高低两类。例如,当收入水平 (连续变量) 超过全样本均值时,虚拟变量取值为 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
查阅一下数值分布,是否有异常。如果有异常值,则需要先对异常值进行处理。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)
上文都是基于某一个变量生成虚拟变量,在处理数据过程中,可能需要借助多个变量来生成虚拟变量。例如,生成一个家庭是否有未成年人的虚拟变量时,我们需要结合年龄 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。
inlist()
命令语法为 inlist(z, var1, var2,...)
。该命令具体含义是 var1,var2,...中任意一个变量取值为 z,则虚拟变量取值为 1,否则为 0。
具体来看,前文已经生成了 edu1、edu2、edu3、edu4、edu5、edu6、edu7、edu8 等 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)
inrange()
命令语法为 inrange(var, a, b)
。该命令具体含义为,当变量 var 的取值介于 [a, b] 之间时,虚拟变量取值为 1,否则为 0。与上文类似,我们生成中等收入 (收入介于 6-20 万) 虚拟变量为例。inrange()
命令实现如下:
. gen middle_income = inrange(income, 60000, 200000)
虚拟变量的生成方式有很多,并且不同的命令的便捷程度也不一样。但是,无论使用哪种方式,在生成虚拟变量之前都需要对相关变量进行检查,以确保无异常值或缺失值。否则,按照以下方式处理:
若需实操本文介绍的命令,也可以使用 sysuse "nlsw88.dta", clear
调入 Stata 自带数据文件 nlsw88.dta 进行练习。
Note:产生如下推文列表的 Stata 命令为:
lianxh 虚拟变量 缺失值 补漏 egen, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh