D3. 缺漏值的处理
整理人: 欧旭(浙江大学) Email: ouxu1126@163.com
实证分析中的原始数据资料往往存在缺漏值,而不同数据来源对于缺漏值的标记符号也存在一定差异。本讲将通过4个小节重点介绍实证分析中不同类型缺漏值的处理。
1. 缺漏值定义/简介
Stata中,缺漏值统一用符号 .
表示,其取值大于任意自然数。
通过以下实例,了解不同命令对缺漏值的处理:
*- 调用Stata自带数据——汽车价格资料sysuse auto,clear
*- 统计1978年汽车维修次数超过4次的车辆数
** 命令1:summarize,可简写为sumsum rep78 if rep78>4
Variable | Obs Mean Std. Dev. Min Max
----------+------------------------------------- rep78 | 11 5 0 5 5
summarize
主要用于展示基本统计量,缺漏值不参与基本统计,所以该命令会忽略缺漏值的情况。根据上述结果obs=11,可知维修次数超过4次的有11辆车
** 命令2:count
* 错误用法count if rep78>4
16
* 正确用法count if rep78>4 & rep78!=.
11
count
是用于计数的命令,缺漏值大于任意自然数。当统计超过 4 次的个数时,也会考虑缺漏值;若要剔除缺漏值,需添加附加条件rep78!=.
- 需注意:
- 有些命令,如
sum
,regress
,generate
等,会自动忽略缺漏值; - 有些命令,如
count
,keep
等,则会将.
视为一个无穷大的数值。
- 有些命令,如
2. 缺漏值的标记和转换
一般在数据资料中,缺漏值的标记方式有:N.A.
、N/A
、-97
、-99
、-999
、-9999
等方式。
通过以下数据文件演示如何在Stata中将数据资料中缺漏值的不同标记方式统一转换为 .
,可以通过 import
命令将 excel、txt 等格式的文件导入 Stata,导入后数据资料如下所示:
list
.
+----------------------+y x1 x2 x3 |
|
|----------------------|N/A |
1. | 2 -97 -999
2. | 6 2 3 8 |
3. | 3 5 -999 7 |N/A |
4. | 5 -97 0 +----------------------+
其中,缺漏值在x1中用-97表示,x2中用-999表示,x3中用 N/A 表示。x3因为缺漏值的标记符号为英文字母而被Stata识别为字符变量,后续需要将其转化成数值变量。因此,在缺漏值处理中,我们需要对x1和x2中数值型缺漏值进行标记转换,也需要对x3中字符型缺漏值进行标记转换。
2.1 数值型缺漏值的转换:mvdecode
mvdecode x1 x2,mv(-97 -999)
命令 mvdecode
中“mv”表示多变量,“decode”表示重新编码,后面的选项mv(#)可填写实例中数值型缺漏值的标记符号,多个标记符号间需用空格区分。 mvencode
可将缺漏值 .
转换为数值型取值,这里不多做演示。
转换后结果:
list
.
+-------------------+y x1 x2 x3 |
|
|-------------------|N/A |
1. | 2 . .
2. | 6 2 3 8 |
3. | 3 5 . 7 |N/A |
4. | 5 . 0 +-------------------+
2.2 文字型缺漏值的转换
对于文字型缺漏值,可以通过使用 replace
命令直接进行转换。
** 错误方式replace x3 = . if x3== "N/A" .
以上命令会显示错误信息”type mismatch”,因为 replace
前后的变量类型不一致。此处,x3 应该为字符型变量,而 .
在此识别为数值型变量,因此需要添加双引号用 "."
来将其表示为字符型。转换为字符型变量后可用 destring
将字符型变量x3转换为数值型变量。
** 正确方式replace x3="." if x3=="N/A"
destring x3,replace
处理后结果显示:
list
.
+---------------------+y x1 x2 x3 |
|
|---------------------|
1. | 2 . . . |
2. | 6 2 3 8 |
3. | 3 5 . 7 |
4. | 5 . 0 . | +---------------------+
经过以上基本处理后,可以进行统计和回归分析。
3. 标记不包含缺漏值的样本
通过以下实例展示如何标记不包含缺漏值的样本。
调用美国1988年妇女工资数据资料,首先展示基本统计量:
sysuse "nlsw88.dta", clear
sum wage industry tenure hours
Variable | Obs Mean Std. Dev. Min Max
----------+---------------------------------------------------
wage | 2,246 7.766949 5.755523 1.004952 40.74659
industry | 2,232 8.189516 3.010875 1 12
tenure | 2,231 5.97785 5.510331 0 25.91667 hours | 2,242 37.21811 10.50914 1 80
以上结果显示各变量的观测值个数并不完全相同,说明部分变量存在缺漏值。若在此数据基础上直接进行回归分析,如下结果所示,参与回归的样本数仅为2213,低于wage变量对应的2246个观测值。
sysuse "nlsw88.dta", clear
reg wage industry tenure hours
of obs = 2,213
Source | SS df MS Number F(3, 2209) = 37.70
---------+------------------------- F = 0.0000
Model | 3592.478 3 1197.49 Prob >
Residual | 70175.16 2,209 31.7678 R-squared = 0.0487
---------+------------------------- Adj R-squared = 0.0474
Total | 73767.64 2,212 33.3488 Root MSE = 5.6363
------------------------------------------------------------SE t P>|t| [95% CI]
wage | Coeff
---------+--------------------------------------------------
industry | 0.065 0.040 1.63 0.104 -0.013 0.143
tenure | 0.159 0.022 7.21 0.000 0.116 0.202
hours | 0.075 0.012 6.42 0.000 0.052 0.098_cons | 3.549 0.571 6.21 0.000 2.428 4.669
------------------------------------------------------------
在学术论文中,描述性统计量中的样本个数应该与参与回归的样本个数一致,在本实例中即指应该针对2213个样本进行描述性统计。因此,需将各变量的样本数进行统一。
在Stata中,可以在回归后利用 ereturn list
呈现一些相关的返回信息数据,信息数据主要包括以下四部分:scalars(常数,如N是样本数,r2_a是调整后的\(R^2\))、macros(暂元)、matrices(矩阵)、function(函数)。其中,function中的 e(sample)
是我们关心的部分,它只有0和1两种取值:0值表示该行观测值未参与之前的回归,1值表示该行观测值参与之前的回归。因此我们可用 e(sample)
识别参与了回归的样本。
- 基本思路:先做回归,再对参与回归的样本描述基本统计量,以获得样本完全一致的各变量的基本统计量。
reg wage industry tenure hours
ereturn list
sum wage industry tenure hours if e(sample)
sum wage industry tenure hours if e(sample)==1 * 等价于
结果显示:
Variable | Obs Mean Std. Dev. Min Max
---------+-------------------------------------------------
wage | 2,213 7.816986 5.774846 1.004952 40.74659
industry | 2,213 8.18075 3.014709 1 12
tenure | 2,213 6.003314 5.510447 0 25.91667 hours | 2,213 37.25395 10.46896 1 80
现在各变量的样本数已完全一致。
若觉得用条件语句 if e(sample)==1
较繁琐,可先生成一个虚拟变量标记参与回归的样本,然后选择虚拟变量的相应取值作为限定条件进行描述性统计。
gen yes = e(sample) //标记样本,非缺漏值取值1,缺漏值则取值0
sort yes //针对yes变量的取值升序排序
sum wage industry tenure hours if yes==1
结果显示:
Variable | Obs Mean Std. Dev. Min Max
---------+------------------------------------------------
wage | 2,213 7.816986 5.774846 1.004952 40.74659
industry | 2,213 8.18075 3.014709 1 12
tenure | 2,213 6.003314 5.510447 0 25.91667 hours | 2,213 37.25395 10.46896 1 80
4. 删除缺漏值
若整个回归分析中只想用不包含缺漏值的变量,还可以用 keep
保留非缺漏值的样本:
keep if yes==1 //或drop if yes!=1
之后就可按照常规方法用 tabstat
展示基本统计量、reg
等进行回归分析。
*-Table 1 Also see: R1_regress, R3_tabletabstat wage industry tenure hours, stat(N mean sd min max) format(%6.3f) column(stat)
*-Table 2 Also see: R8_esttab reg wage i.industry tenure hours
N) esttab, nogap stat(r2_a
5. 扩展阅读
- 刘梓茵, 2023, Stata数据处理:缺失值类型及应对方法, 连享会 No.1196.
- 刘炜, 2020, Stata:缺失值的填充和补漏, 连享会 No.176.
- 初虹, 2022, Stata:fillmissing-缺失值填充-数值和文字的前后填充!, 连享会 No.1050.
- 夏书浩, 2021, Stata:让缺失值一览无余, 连享会 No.607.
- 孟佳音, 2021, Stata数据处理:缺失值与多重补漏分析(一), 连享会 No.693.
- 孟佳音, 2021, Stata数据处理:缺失值与多重补漏分析(三), 连享会 No.695.
- 孟佳音, 2021, Stata数据处理:缺失值与多重补漏分析(二), 连享会 No.694.
- 孟佳音, 2021, Stata:缺失值与多重补漏-misstable-D204, 连享会 No.822.
- 孟佳音, 2021, Stata:面板数据缺失值与多重补漏分析-twofold, 连享会 No.741.
- 秦范, 2021, 缺失值能否用零代替?-L117, 连享会 No.663.
- 范唯, 2022, Stata数据处理:缺失值填充-autofill-carryforward, 连享会 No.1130.
- 连享会, 2020, Stata数据处理:面板数据的填充和补漏, 连享会 No.193.
- 郑宇, 2024, Stata教程:数据处理, 连享会 No.1386.
- 陈滨志, 2020, Stata缺失值专题:多重补漏分析, 连享会 No.454.
- 黄海嫦, 2023, 缺失值处理:虚拟变量调整法靠谱吗?, 连享会 No.1215.