D3. 缺漏值的处理
整理人: 欧旭(浙江大学) Email: ouxu1126@163.com
实证分析中的原始数据资料往往存在缺漏值,而不同数据来源对于缺漏值的标记符号也存在一定差异。本讲将通过4个小节重点介绍实证分析中不同类型缺漏值的处理。
1. 缺漏值定义/简介
Stata中,缺漏值统一用符号 . 表示,其取值大于任意自然数。
通过以下实例,了解不同命令对缺漏值的处理:
*- 调用Stata自带数据——汽车价格资料
sysuse auto,clear
*- 统计1978年汽车维修次数超过4次的车辆数
** 命令1:summarize,可简写为sum
sum rep78 if rep78>4
Variable | Obs Mean Std. Dev. Min Max
----------+-------------------------------------
rep78 | 11 5 0 5 5summarize主要用于展示基本统计量,缺漏值不参与基本统计,所以该命令会忽略缺漏值的情况。根据上述结果obs=11,可知维修次数超过4次的有11辆车
** 命令2:count
* 错误用法
count if rep78>4
16
* 正确用法
count if rep78>4 & rep78!=.
11count是用于计数的命令,缺漏值大于任意自然数。当统计超过 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 |
|----------------------|
1. | 2 -97 -999 N/A |
2. | 6 2 3 8 |
3. | 3 5 -999 7 |
4. | 5 -97 0 N/A |
+----------------------+其中,缺漏值在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 |
|-------------------|
1. | 2 . . N/A |
2. | 6 2 3 8 |
3. | 3 5 . 7 |
4. | 5 . 0 N/A |
+-------------------+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
Source | SS df MS Number of obs = 2,213
---------+------------------------- F(3, 2209) = 37.70
Model | 3592.478 3 1197.49 Prob > F = 0.0000
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
------------------------------------------------------------
wage | Coeff SE t P>|t| [95% CI]
---------+--------------------------------------------------
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 804. 删除缺漏值
若整个回归分析中只想用不包含缺漏值的变量,还可以用 keep 保留非缺漏值的样本:
keep if yes==1 //或drop if yes!=1之后就可按照常规方法用 tabstat 展示基本统计量、reg等进行回归分析。
*-Table 1 Also see: R1_regress, R3_table
tabstat 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
esttab, nogap stat(r2_a N)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.