第26章 Stata中的数据清洗
26.1 数据清洗的基本过程
26.1.1 变量的自然描述与计算机描述
作为现实生活的抽象,变量有其取值。例如性别变量有“男”“女”等取值,收入变量有0元、1000元等等取值。经过抽象,这些取值可以被划分为四类变量:定类变量、定序变量、定距变量、定比变量。在社会变量中,一般后两者可以合并为定量变量。不同层次的变量可以适用于不同的数学计算。
但是在计算机中,变量需要以一串二进制码来存储。在Stata中,数据有两种基本存储类型,即字符型和数值型(如无必要,一般都以数值型存储)。因此,对于现实生活的变量,尤其是类别变量,我们需要对其进行相应的编码。例如“男”的编码为1,“女”的编码为0。在计算机存储中,我们便存储相应的编码,而非字符“男”“女”。
在Stata中,数值型变量有一类取值为缺失值。缺失值在Stata中表为:.a
到.z
,以及.
。若无特殊申明,Stata在计算中会自动跳过这些缺失值。
数据清洗中,我们一般面临两种缺失值,其一为系统缺失值,即上文所述,这是针对计算机变量而言的缺失。其二为问卷的缺失值,这些缺失值往往是调查中由于拒绝回答、不知道等原因造成的,需要区别于系统缺失值,是针对调查结果的现实含义而言的。一般而言,问卷缺失值会具有其独特的编码。例如,以负数或是极大的数表示之,并加之以对应的值标签。这就涉及到标签操作。
26.1.2 标签操作
所谓标签,就是对变量编码的“备注”。这里介绍变量标签(variable label)和值标签(value label)。
首先介绍变量标签。在Stata中,我们当然可以按照变量的现实含义为变量命名。但是出于简便的原则,我们会用一些诸如a1,a2的名称来命名变量。或者,当有好几种相近的变量,比如自己的收入和家庭的收入,我们也会用类似的方法为变量命名。这个时候,我们就需要为变量标签附上标签,以说明这个变量的含义。在Stata中,使用如下操作附加变量标签:
label variable VarName "变量描述"
其次介绍值标签。例如当变量gender取值1时,表示的现实含义是“性别为男”。那么,我们就对gender变量附加值标签。值标签会存储在数据文件的特定位置,并且与变量相独立。同一个值标签可以用于多个变量。在Stata中,使用如下操创建或修改值标签:
label define LabelName Value1 "Value’s Label 1" Value2 "Value’s Label2"
label define LabelName ValueNew "Value’s Label New", add
建立好值标签后,我们需要将值标签附加给变量。可以一次给多个变量附加上同一个标签。操作为:
label value VarList LabelName
可以通过describe
命令来查看一个变量的变量标签和值标签。不一样的是,变量标签的内容会直接显示,而值标签仅显示其标签名。需要用label list
命令查看具体的内容。操作如下:
label list LabelName
26.1.3 数据清洗的流程
数据清洗的流程如下:
- 是否有ID?ID是否唯一?
- 数据中是否有重复的条目?若有,则核查。
- 选择需要的变量,逐个审视。
- 是否已经有变量标签与值标签?(操作见第一章第二节)
- 变量的取值是否需要处理?
- 定性变量:非法值与缺失值;定量变量:异常值与缺失值。(操作见第二章)
- 多变量之间的逻辑关系检查,包括硬逻辑与软逻辑。
- 是否需要生成新变量?(操作见第二章)
- 保存do文件,以便核查。
26.2 数据清洗的操作
26.2.1 查看数据与生成新变量
数据清洗通常需要先查看数据的值的分布与值标签(当然事先也要知道变量是做什么的,也就是查看变量标签)。并在此基础上清洗数据。有时候也需要生成新变量。
查看变量标签和值标签名使用命令describe
。该命令还能显示数据的存储格式。值标签内容的查看详见第一章第二节。
查看数据的分布,可以使用summarize
命令和tab
命令。分组查看,根据适用性,可以选择前缀命令by
或命令自带选项by
(详见help by
和各命令的帮助文件)。summarize
命令的结果解释详见第二编第一章。
一般而言,我们不修改原始变量,而是生成新变量做清洗操作。生成新变量可以用generate
命令、egen
命令和clonevar
命令,等等。修改变量的值可以用replace
命令。生成和修改变量的过程中,通常需要加上if
限制。recode
命令可以同时完成上述三个工作。以上几个命令的用法如下:
generate NewVar = OldVar
generate NewVar = #
clonevar NewVar = OldVar
egen NewVar = Function(Para.)
replace Var1 = # if Var1 == #
recode VarName (#/#=#), gen(NewVar)
以上只是列举几种用法。更多用法可以查看帮助文件。
26.2.2 类别变量的清洗
类别变量有三种值,一种为缺失值,一种为非法值,一种为合法值。数据清洗需要处理缺失值与非法值。
这里的缺失值,指的是问卷的缺失值。因为系统缺失值无需处理。通常而言的策略,是将问卷缺失值转化为系统缺失值。
非法值,则指不在类别变量的编码内的值。例如,假定“性别”变量只有2个取值:“男”的编码为1,“女”的编码为2,而计算机中的变量却有一处取值为10。对于非法值,可以核查。如果无法核查,则以缺失值处理。
特别地,当变量是二分变量时,一般会将之转化为01变量。这样有助于后续的运算。
26.2.3 连续变量的清洗
连续变量有三种值,一种为缺失值,一种为异常值,一种为正常值。数据清洗需要处理缺失值与异常值。
这里的缺失值,指的是问卷的缺失值。因为系统缺失值无需处理。通常而言的策略,是将问卷缺失值转化为系统缺失值,或是均值插补与多重插补。
异常值,一般而言指偏离中心过远的值。可以以样本均值±3个样本标准差以外的值视作异常值。对异常值,通常而言的策略,是将问卷缺失值转化为系统缺失值,或是均值插补与多重插补。当然,异常值的判断是一件复杂的工作,需要结合具体情况。