查看原文
其他

快来get缺失值的正确打开方式

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王   滢,河南大学经济学院

本文编辑:陈梦华

技术总编:李婷婷

Stata&Python云端课程来啦!

     寒雪梅中尽,春风柳上归。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》;原价600元的正则表达式课程,现在仅需49.9元,详情请查看推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》;原价600元的基本字符串函数课程,现在仅需49.9元,更多信息请查看推文《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程;原价600元的网络爬虫课程,现在仅需49.9元,更多信息请查看推文《与春天有个约会,爬虫俱乐部重磅推出网络爬虫专题课程》原价600元的文本分析课程,现在仅需49.9元,更多信息请查看推文与春天有个约会,爬虫俱乐部重磅推出文本分析网络课程。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!



一、导读在实证研究过程中,我们不可避免地会遇到数据缺失的问题。Stata中缺失值可以分为两类:一是字符型缺失值,即空字符串 " "(空);二是数值型缺失值,包含了"."(点)和26类拓展型缺失值(.a , .b , .c........, .z)。如果我们不能对数据中的缺失值进行恰当的处理,贸然删除很容易对结果产生极大的影响。今天小编就为大家整理了几种可以便捷查看和填充缺失值的妙招,快来get缺失值的正确打开方式吧!


二、缺失值一目了然

我们在将数据导入到Stata后,通常需要对于数据的完整性进行检查,通过接下来介绍的mdescnmissingmissings三个命令,都可以快速查看数据的缺失值情况。废话不多说,我们直接上例子。

1.mdesc

mdesc命令可以报告所有变量的总数、缺失值数量及缺失值占比。接下来我们就来看看这个命令是怎么使用的吧~

ssc install mdesc,replace sysuse nlsw88.dta,clear //调用Stata自带的nlsw88.dta数据集mdesc //如果查看指定变量的缺失值情况,则在mdesc后加变量名,不指定默认查看所有变量的缺失值情况

mdesc,any //只要有任何变量存在缺失值,就认作1次缺失值情况,并报告样本总观测值数量和缺失值情况与占比
mdesc,all //当某一行所有的变量都为缺失值时,才认作1次缺失值情况,并报告样本总观测值数量和缺失值情况与占比

相对的,利用mdesc也可以查看非缺失值的情况:

mdesc,none //只要有任何变量存在非缺失值,就认作1次非缺失值情况,并报告样本总观测值数量和非缺失值情况与占比

2.nmissing

nmissing命令与mdesc命令用途相同,但是它在报告时只会显示含有缺失值的变量情况,而不会报告缺失值所占比例,相比mdesc命令更为简略。

ssc install nmissing,replace sysuse nlsw88.dta,clear nmissing //在命令后不指定变量,则默认报告所有含有缺失值的变量情况


nmissing,min(100) //选项min(100)将限定报告缺失值个数大于100个的变量




注意没有nmissing,max(#)这一选项,所以要查看缺失值个数小于某一值时的变量信息,不能使用nmissing,max(#),会出现错误。


3.missings

missings命令是nmissing命令的改良版本,它可以对于数据中的缺失值信息进行更加详细的报告。

ssc install missings,replace sysuse nlsw88.dta,clear missings report //在命令后不指定变量,则默认报告所有含有缺失值的变量情况,与nmissing命令类似

missings report,sort show(4) //对于所有含有缺失值的变量,按照含有缺失值的个数从小到大进行排序,报告缺失值个数排名前四的变量情况

missings list,min(2) //详细报告含有至少2个缺失值的观测值那一行的行信息

missings table //以表格的形式列出不同缺失值个数的分布和占比

missings tag,gen(miss2) //生成一个新变量miss2,显示该行缺失值的个数






三、缺失值填充补齐

  有时我们经常会遇到数据存在大量缺失值的情况,如果是在样本比较小的情况下,删除所有缺失值,很有可能会导致结果有偏,并且造成数据的损失。这时候,我们就需要对缺失值进行适当的填充补齐,下面介绍的mvencodecarryforwardtsfillfillin这几个命令都可以便捷地满足我们的愿望。一起来看看吧~

1.mvencode

通过mvencode命令可以快捷地实现从缺失值到数值型的转化。下面我们通过一个简单的例子来说明它的用法。

clear allinput x y1    31   .a.    ..    22    2.    . 3    .4    .5   .a6   .z.a   6end //输入包含缺失值的两列数据list此时原始数据显示如下:

mvencode _all,mv(0) override //将所有类型的缺失值全部替换为0listmv选项用来设置编译后的数值;override选项常常与mvencode命令伴随使用,表示对于缺失值进行强制编译。

如上图所示,所有的缺失值都替换为了0。

2.carryforward

carryforward命令,顾名思义,就是能够以数据中的非空前值来填充缺失值。

ssc install carryforward,replace clear allinput x y1   31  .a.   ..   22   2.   .   3   . 4   .5  .a6  .z.a  6end //输入数据list

carryforward x,gen(x1) cfindic(x2) list上述程序表示的是,对x列的缺失值进行填充,原则为将缺失值前一行的非空数值作为填充值填入,并生成新的一列变量x1来显示已填充好的数值。同时生成一个新的0,1变量x2,当该变量为0时,则表示其对应的是原始数据;而当其为1时,表示对应的是填充的数据。

如上显示,新的变量x1下报告的是将x填充完成后的数据,x2下报告的是数据的来源(来自于原始数据x或已填充的数据x1)。例如,第六行的变量x的缺失值根据前一行的非缺失值"2"填入,则x1变量下第六行显示为2,x2下第六行显示为"1",即表示其来自于填充的数据。

carryforward x,replace carryalong(y)listcarryalong()选项表示当对x填充缺失值时,指定变量y伴随着x的填充进行相应的填充,即使y中本身没有缺失值,也会按照x的填充原则覆盖原始数据。

我们由上图可以看出,在命令执行后,原本x中的缺失值都得到了填充,同时相应行的y也伴随着x的填充用前一行的值对于原始数据进行了覆盖。例如:原本第三行变量x,y均为缺失值 "." (点),现在x变量的第三行以非空前值 "1"填入,同时y变量也随着x的填充以前值(即缺失值 ".a") 填入;类推,x变量的第四行为填充的非空前值 "1",这时y变量虽然是非缺失值 "2",仍会随着x的填充以前值 ".a"填入,覆盖原始数据 "2"。

carryforward y,gen(y1) //生成一个新变量y1显示对于变量y填充后的结果carryforward y,gen(y2) extmiss //生成一个新变量y2显示对于变量y填充后的结果list x y y1 y2选项extmiss指定下,拓展型缺失值(.a,.b,.c,....,.z)将会被视为非缺失值,不参与填充。

如上所示,变量y1,y2均是对于变量y填充后的结果,但二者的区别在于,变量y1对于y中所有的缺失值类型都进行了填充,而变量y2在选项extmiss的限定下,只对于数值型缺失值 "."(点)进行了填充,而拓展型缺失值(.a, .b, .c,......., .z)则被视为了非缺失值。

3.tsfill

tsfill命令可以针对于数据中隐性的缺失值(不以缺失值符号显示)进行填充补齐,从而让缺失值所在空位一目了然。对于面板数据,它默认根据每个截面的时间变量的跨度填充数据,所以在使用前必须使用xtset对于数据的截面变量和时间变量进行说明。

webuse tsfillxmpl2,clear //调用数据list

我们可以看到原始数据中edlevel代表个体,year代表时间,对于个体2来说从1989年到1992年以每年为间隔,缺少了1991年的数据。接下来就可以利用tsfill命令对于缺失的时间进行填充:

xtset edlevel year //指明截面变量和时间变量tsfill //对缺失时间进行填充list

可以看到个体2截面数据中缺失的年份1991年已经得到了填充。

如果要对于整个面板数据的时间变量进行填充,可以利用full选项:

tsfill,full //对于整个面板数据时间变量


可以看到,相对于不加full选项只对个体2中的截面数据进行填充,这里则是对于整个面板数据,即包含个体1和个体2从1988年到1992年所有的数据进行了填充补齐,使得原始数据成为了平衡面板数据。

4.fillin

除了上面介绍的tsfill命令,对于面板数据进行填充也可以选择fillin命令来做到:

webuse tsfillxmpl2,clear //调用数据fillin edlevel year //fillin后加上至少两个以上需要填充的变量名即可list结果下:

  结果报告与上面使用tsfill,full命令得到的结果是一样的,同时生成了新的变量_fillin对于数据来源进行区分,如果数据是原始存在的, _fillin就显示为0,如果数据是通过fillin命令填充的,则显示为1。

限于篇幅,今天对于缺失值处理的相关介绍就到这里啦!

熟练掌握这些命令,就可以轻松get数据缺失值的正确打开方式。大家在处理数据缺失值时,用到过什么好用的命令呢?欢迎在留言区分享哦!

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐
         frame框架——我到底在哪个“房间”

如何使用Pandas读取txt文件?

基于MySQL数据库实现增量式爬取

寻找春日气息|本月最受欢迎的景点都在这里!

问世间情为何物,大数据也想参悟——后考研时代,何以解忧?唯有数据!

Python与数据库交互—浅述pymysql

偷懒小妙招|selenium之玩转鼠标键盘操作--鼠标篇

大家用Stata来“找茬”

“粉墨登场”——多期双重差分法(DID)的Stata操作

Python与百度地图合璧,绘制棒呆的热力地图

【数据可视化】统计图绘制神器:Seaborn

检索Stata推文的“任意门”学会了这些,分分钟提升你的毕业体验

【爬虫实战】双一流大学的月关注度

【爬虫实战】“中国人不吃这一套”——人民日报微博评论分析

进化的标签管理助手——elabel命令

“学术明星”——双重差分法(DID)的Stata操作

偷懒小妙招| selenium之玩转鼠标键盘操作(上)

【爬虫实战】南京地铁又上热榜——客流量分析

renfiles:批量重命名文件的利器

Stata中字符串的处理

物以类聚——浅述k-means聚类算法

我在哪里?调用高德API获取地址经纬度信息

超级简单的条件函数,轻松生成虚拟变量

Python云端课程福利大放送!0基础也能学~

【爬虫实战】“我们,继续新故事”——爬取LOL英雄皮肤

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存