Stata:虚拟变量专题-生成与使用
New!
lianxh
命令发布了: GIF 动图介绍
随时搜索 Stata 推文、教程、手册、论坛,安装命令如下:
. ssc install lianxh
作者:冷萱(西南财经大学)
邮箱: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. 引言
2. 分类变量生成虚拟变量
3. 连续变量生成虚拟变量
4. 生成虚拟变量的进阶做法
4.1 根据多个变量生成虚拟变量
4.2 借助 inlist() 命令生成虚拟变量
4.3 借助 inrange() 命令生成虚拟变量
5. 总结
6. 相关推文
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
上述命令执行后,会生成教育水平对应的虚拟变量,分别为 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==.)
);以上生成的 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,...)
。该命令具体含义是 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)
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