D3. 缺漏值的处理

整理人: 欧旭(浙江大学) Email:

实证分析中的原始数据资料往往存在缺漏值,而不同数据来源对于缺漏值的标记符号也存在一定差异。本讲将通过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      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 命令将 exceltxt 等格式的文件导入 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         80

4. 删除缺漏值

若整个回归分析中只想用不包含缺漏值的变量,还可以用 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. 扩展阅读