[关闭]
@liuyuxi 2021-07-27T10:14:24.000000Z 字数 4195 阅读 40

缺失值处理

stata


总结

1.《Stata:缺失数据的简单填补 fillmissing》,汪欧米伽公众号,汪奕鹏

在填补缺失数据前,应对所用数据集的数据缺失情况进行检查,常用的Stata命令包括mdescmisstable sumfmissnmissing等。
fillmissing的使用分组内非首尾非连续缺失、组内首尾非连续缺失、组内非首尾连续缺失以及组内首尾连续缺失四种情况。
............
fillmissing命令是可以通过结合with(linear)选项以利用数据的线性趋势来进行填补的,默认用with(any)选项(即使用未缺失的任意值)来进行填补,with(previous)、with(next)、with(first)、with(last)、with(mean)、with(median)、with(min)、with(max)类似。[bysort varlist]: fillmissing x,with(linear)。 bysort意味着命令fillmissing支持分组填补,这在面板数据中较为常用,而当不需进行分组填补时,[bysort varlist]:部分可省略。
with(linear)选项并不能真正linear,它只能正常地补上组内非首尾缺失的缺失数据,对于组内首尾缺失,则是分别默认使用with(next)with(previous)选项替换。如存在组内首尾缺失的情况,有两种方案解决:(1)删除这类样本后使用fillmissing填补其他缺失数据;(2)先人工补上组内首尾缺失数据,随后使用fillmissing补上其他缺失数据。
............
特点:功能多样,然而仅with(linear)实用。极易使用,几乎没有学习成本,比carryforward容易上手。
............
其他插补方法mi(多重插补法)、carryforward(非空前值填补法)、ipolate(线性函数插补法)

2.《快来get缺失值的正确打开方式》,爬虫俱乐部 “Stata and Python数据分析”公众号

通过mvencode命令可以快捷地实现从缺失值到数值型的转化。
mvencode _all,mv(0) override //将所有类型的缺失值全部替换为0
carryforward命令,顾名思义,就是能够以数据中的非空前值来填充缺失值。carryforward x,gen(x1) cfindic(x2),上述程序表示的是,对x列的缺失值进行填充,原则为将缺失值前一行的非空数值作为填充值填入,并生成新的一列变量x1来显示已填充好的数值。同时生成一个新的0,1变量x2,当该变量为0时,则表示其对应的是原始数据;而当其为1时,表示对应的是填充的数据。carryforward x,replace carryalong(y),carryalong()选项表示当对x填充缺失值时,指定变量y伴随着x的填充进行相应的填充,即使y中本身没有缺失值,也会按照x的填充原则覆盖原始数据。carryforward y,gen(y1) //生成一个新变量y1显示对于变量y填充后的结果
carryforward y,gen(y2) extmiss //生成一个新变量y2显示对于变量y填充后的结果

3.《Stata处理面板数据中的缺失值和不合理值》, Anime Bae公众号

处理思路

   1.处理缺失的情况:
        1.1 ipolate:依旧缺失的个体,只有删去;存在0和负数的个体
   2.处理负数的情况:
        2.1 第一期为负数,则使用第二期的值填补
        2.2 最后一期为负数,则使用倒数第二期填补
        2.3 其他情况的负数处理,处理完毕,不存在这种情况。
   3.处理为0的个体:
        3.1 若存在期数内全为0,删去
        3.2 存在期数为1期或2期,删去
        3.3 存在期数3期及以上,将0转为缺失值,再使用ipolate进行填补
            3.3.1 依旧缺失的个体,说明其有数据的只有一期,只有删去;依然会存在0和负数
                3.3.1.1 处理由ipolate产生出来的负数
                    3.3.1.1.1 第一期为负数,则使用第二期的值填补
                    3.3.1.1.2 最后一期为负数,则使用倒数第二期填补
                    3.3.1.1.3 其他情况的负数处理,只有删去
                3.3.1.2 处理由ipolate产生出来的0
                    3.3.1.2.1 第一期为0,则使用第二期的值填补
                    3.3.1.2.2 最后一期为0,则使用倒数第二期填补
                    3.3.1.2.3 其他情况的处理,只有删去

首先使用inspect命令简单检视一下数据的基本情况:缺多少个,为0的有多少个..等等。用法:inspect varname // 查看某变量的缺失情况
inspect 查看所有变量的缺失情况

............
对于只存在一期,或者存在多期但是只有一期不缺的企业,ipolate无法插补。ipolate用法:

  1. bysort id : ipolate `r(var)' year , gen(`r(var)'1) epolate //`r(var)'正好为配合longcount使用,longcount会将缺失变量保存在`r(var)'中。

处理第一期与最后一期问题的方法

  1. **2.1 第一期为负数,则使用第二期的值填补
  2. bysort id (year) : replace 全部从业人员年平均人数人1 = 全部从业人员年平均人数人1[2] if 全部从业人员年平均人数人1 </== 0 & _n == 1
  3. **2.2 最后一期为负数,则使用倒数第二期填补
  4. gsort id -year
  5. bysort id : replace 全部从业人员年平均人数人1 = 全部从业人员年平均人数人1[2] if 全部从业人员年平均人数人1 </== 0 & _n == 1

4.《面板数据缺失值和非正数的处理(2)》, Anime Bae公众号

首先,将所有非正数填为缺失值,因为对于这样的非正数对于我们来说和缺失值没有多大的区别。然后进行插值法进行填补,这里我推荐spline样条插值法进行填补,对于填补为非正数的再次转为缺失值。但是,此时我们的处理方法不在是进行迭代了,而是对被填补变量取一个对数,对这个对数进行填补,然后再取指数还原。因为指数是大于0的,所以填出的数据自然都是正数,满足了我们的要求。
logipo varlist, id() year() method()
method,使用何种方法进行填补。可以选择linear、cubic、spline、pchip和idw,当然最后一种逆距离加权填补法要指定权重变量。(Note:此命令貌似至少需要在stata15.1才能运行)

5.《缺失值能否用零代替?》,连享会。

只有当你有足够理由说明缺失数据的实际值为 0 时,才能将缺失值替换为 0,否则不可。

6.《Stata:缺失值的填充和补漏》,连享会。

主要介绍了 Stata 中较为常用的缺失数据处理命令 tsfillipolate
tsfill 的主要作用是对数据中时间变量的缺失值进行填补或扩充。
ipolate只能填补数值范围内的缺漏值,无法填补数值范围外的缺漏值,即只能用于「插值」。若要进行「外推」,我们还需要在 ipolate命令后加上 epolate 选项

  1. *-进行插值和外推
  2. ipolate ymissing x, gen(y1)
  3. ipolate ymissing x, gen(y2) epolate

7.《Stata数据处理:一文读懂微观数据库清理(上)》,连享会

4.1.3 缺失值的查验和处理
第一个思路:通过统计值进行推断。为了消除极端值的影响,采用去掉极端值的均值数据对原有价格数据进行弥补。.........中位数和众数较少受极端值的影响,所以也可以直接采用价格中位数或众数对原有价格数据进行弥补
第二个思路:通过插值进行补漏。对于长时期数据,可以根据时间变量进行插值来对缺失值进行弥补bysort vid:ipolate plantarea year, gen(temp_plantarea) epolate
replace plantarea_new=temp_plantarea if plantarea_new==. & !missing(temp_plantarea)
drop temp_plantarea
sum plantarea_new plantarea //补漏后进行查验对比
label var plantarea_new "种植面积(补漏后)"

第三个思路:采用周围非缺失值来填补缺失值
*采用上一年非缺失值进行弥补
gen plantarea2=plantarea
by vid :replace plantarea2=plantarea[_n-1] ///
if missing(plantarea2) //其中两个缺失值的前一年取值也为缺失值
sum plantarea2 plantarea //补漏后进行查验*采用上一年非缺失值进行弥补
save "sale_data_reg", replace //完成数据清理,进行保存供分析所用

此外,还可通过参考相似样本进行取值、多重补漏分析以及一些非参数方法进行补漏。有几类问题,即使存在缺失值也不应该对其进行弥补一是具有主观性的问题,二是样本值的缺失是随机的,此时对数据进行缺失值的弥补反而会造成偏误

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注