@liuyuxi
2021-07-27T10:14:24.000000Z
字数 4195
阅读 40
stata
总结
检查缺失值:mdesc
、misstable sum
、fmiss
、nmissing
、inspect
mdesc //所有变量的缺失数量及缺失比例
misstable sum //所有含缺失值变量的缺失数量,及这些变量的最大最小值。
fmiss //所有变量的缺失数量(相对不如mdesc,约等于mdesc的精简版)
nmissing //所有含缺失值变量的缺失数量(misstable sum的精简版)
inspect hospital investment consumption fdi ofdi finance_ratio
// 未指定要查看的变量时,默认给出所有变量的信息,其特点是除缺失值数之外,还会给出(1)变量的分布情况;(2)变量的正负值及零值的个数。
相对而言,nmissing最简洁,inspect信息最多但不好读,misstable sum恰好介于nmissing与inspect之间,兼具共同优点。mdesc、fmiss连未缺失的都给出了,不如前三个简单。
fillmissing
、carryforward
、ipolate
、mi
mvencode
、tsfill
1.《Stata:缺失数据的简单填补 fillmissing
》,汪欧米伽公众号,汪奕鹏
在填补缺失数据前,应对所用数据集的数据缺失情况进行检查,常用的Stata命令包括
mdesc
、misstable sum
、fmiss
、nmissing
等。
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
用法:
bysort id : ipolate `r(var)' year , gen(`r(var)'1) epolate //`r(var)'正好为配合longcount使用,longcount会将缺失变量保存在`r(var)'中。
处理第一期与最后一期问题的方法
**2.1 第一期为负数,则使用第二期的值填补
bysort id (year) : replace 全部从业人员年平均人数人1 = 全部从业人员年平均人数人1[2] if 全部从业人员年平均人数人1 </== 0 & _n == 1
**2.2 最后一期为负数,则使用倒数第二期填补
gsort id -year
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 中较为常用的缺失数据处理命令
tsfill
和ipolate
。
tsfill
的主要作用是对数据中时间变量的缺失值进行填补或扩充。
ipolate
只能填补数值范围内的缺漏值,无法填补数值范围外的缺漏值,即只能用于「插值」。若要进行「外推」,我们还需要在ipolate
命令后加上epolate
选项。
*-进行插值和外推
ipolate ymissing x, gen(y1)
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 //完成数据清理,进行保存供分析所用
此外,还可通过参考相似样本进行取值、多重补漏分析以及一些非参数方法进行补漏。有几类问题,即使存在缺失值也不应该对其进行弥补:一是具有主观性的问题,二是样本值的缺失是随机的,此时对数据进行缺失值的弥补反而会造成偏误。