carryforward——填充缺失值

2016-12-16 司海涛 爬虫俱乐部 爬虫俱乐部

各位读者早上好。昨天的推文由于编辑错误所以删除,今天补发。给大家造成不便请原谅。不过我们明天还会再发一篇新推文哒!


哈喽,诸君安。很多时候,我们从网络或者某些数据库等下载的数据,会有很多缺失值,而这样的数据不符合使用要求的,我们要对其进行处理。carryforward命令可以帮助我们轻松补全缺失值。接下来,和小编一起学习它吧!


carryforward简介


carryforward是用前一个

non-missingvalues填充缺失值。其语法结构如下:



可以看到,carryforward有非常丰富的options,之后我们会介绍一些常用的选项。


carryforward基本用法为:

carryforward +变量名称(可多个),replace| gen(新的变量名称)


这里如果用replace选项,表示在原有变量的所在列直接填充缺失值,如果用gen()选项,表示生成一个已填充缺失值的新变量,而原有变量所在列的数据保持不变。


栗子说明--基金经理变更数据整理


在有关基金经理变更的一项研究中,我们遇到了一个比较特殊的数据,从wind数据库下载到的历任基金经理记录存在一个Excel文件中,将Excel文件另存为文本格式,导入stata中经初步整理,得到如下形式:(为了方便大家使用数据,下边给出手动输入部分数据的程序)


clear

set more off

input str25 fund_id str25 fund_name str30 manager

000001.OF 华夏成长 "王亚伟(20011219-20050412)"

"田擎(20040227-20051029)" "" ""

"巩怀志(20051029-)" "" ""

000011.OF 华夏大盘精选 "蒋征(20040811-20060524)"

"王亚伟(20051231-)" "" ""

000021.OF 华夏优势增长 "张益驰(20061124-)"

000031.OF 华夏复兴 "童汀(20070910-)"

"孙建冬(20080123-)" "" ""

000041.OF 华夏全球精选 "杨昌桁(20071009-)"

"周全(20071009-)" "" ""

001001.OF 华夏债券AB "朱爱林(20021023-20040227)"

"韩会永(20040227-)" "" ""

end

compress


运行上述程序可以得到12行的数据,如下图所示:




我们如果要进行事件研究,我们需要得到一个基金经理变更的事件列表。也就是说,在这个列表中,每一个经理变更作为数据的一个行。即下方所示数据:




首先,对数据进行初步处理:

replace manager = fund_id if manager=="" //fund_id中基金经理的名称转移到manager所在列

replace fund_id = "" if fund_name==""  //fund_id中基金经理名称的信息变为缺失值,方便接下来填充缺失值




我们看到只需对缺失值填充,就能得到我们想要的结果。

当然我们可以通过以下程序达到我们的目的:

replace fund_id = fund_id[_n-1] if fund_id==""

replace fund_name = fund_name[_n-1] if fund_name==""


但是,用carryforward命令会更加简洁清晰。程序如下:

carryforward fund_id fund_name,replace




这样,我们通过一行简单的命令就填充了fund_id fund_name两个变量所在列的缺失值。


carryforward的语法结构可以看到,其后还可以跟 [if exp] [in range]条件语句,事实上用if条件语句也可以得到上述结果。

首先生成一个变量change,它是一个0,1变量。

gen change=(fund_name=="")

order fund_id fund_name change




可以看到,当fund_name==””时,change等于1,其他为0。我们可以借助if条件语句对两个变量的缺失值进行填充。

carryforward fund_id fund_name if change,replace




事实上,if后边可以跟一个数值型变量,当该变量为非零数字时,就填充对应行的缺失值,当该变量为0时,则不填充缺失值。

例如:

gen change=round(uniform(),1) //随机生成一个0,1变量。

order fund_id fund_name change




carryforward fund_id fund_name if change,replace




我们以前三行为例来进行说明,当第2chang0时,fund_idfund_name所在列的缺失值没有进行填充,并且第三行chang虽然为1,但是也没有进行填充,说明当change0时,其后边的行无论change是否为0,都不进行填充,直到下一个non-missing values出现。


常用options介绍


1.gen(newvar)选型

gen()选项可以生成一个已填充缺失值的新变量,原有变量所在列的数据保持不变。


例如上述例子中,我们如果要填充fund_id所在列的缺失值,而又需要保留原有的变量,我们就可以用gen()选项。

carryforward fund_id,gen(newfund_id)

order fund_id newfund_id




可以看到,原有变量fund_id没有发生变化,而新生成的newfund_id则填充了缺失值。当然如果用replace选项将直接在原有变量上进行填充,这里不在列示。


2.carryalong(varlist2)选项

carryalong()是一个非常有意思的选型。

首先,给出它的用法:carryforward 变量1,carryforward(变量2) replace 它表示的意思是,当变量1填充缺失值时,指定一个变量2伴随着变量1的填充进行相应的填充,填充的基准取决于变量1,即使变量2中没有缺失值,变量2也会伴随变量1的填充基准覆盖原有数据。说的有点绕~~上栗子!




在前边操作中,我们对fund_id的填充,首先用replace fund_id = "" if fund_name=="" fund_id中基金经理名称的信息变为缺失值,之后再对两个变量填充缺失值。如果你了解carryalong()选项,那么上述操作将是多余滴!先上程序和结果再解释!


carryforward fund_name ,carryalong(fund_id)replace




一行命令,就完成了两个变量缺失值的填充。我们看到,伴随着fund_name缺失值的填充,fund_id也进行了相应的填充。我们以前三行为例,fund_name1行为“华夏成长”,2/3行为缺失值,进行填充时,2/3行会以第1行“华夏成长”为基准,进行填充。与此同时,fund_id也同样以第1行“000001.OF”为基准把第2/3行进行覆盖填充。因此,不管变量2中是否为缺失值,它都会随着变量1的填充而进行相应的填充。


3.cfindic(newvar)选项

cfindic()选项表示生成一个0,1变量,当该变量为1时,表示对应的为原始数据;当其为0时,表示对应的为填充的数据。

例如:

carryforward fund_id,cfindic(value) gen(newfund_id)

order fund_id newfund_id value




我们看到,当value=1时对应填充的数据,当value=0时对应原始数据。


4.extmiss选项

 extmiss选型仅仅应用于数值型变量,它可以指定extended missing values (.a, .b, etc.)被当做实际数值(也就是non-missingvalues)。


首先,讲一下stata中缺失值的类型。在stata中缺失值分为两种类型:


1.数值型缺失值stata中有27种数值型缺失值。stata默认的缺失值为sysmiss(.),另外26种是:.a, .b,.c, ..., .z,这些就是extended missing values。数值型缺失值在stata中被定义为无穷大,其大小关系为: all nonmissing numbers < . < .a < .b < ... < .z

2.字符型缺失值stata中只有一种字符型缺失值,即””


当我们研究的问题需要区分不同原因所造成的缺失值时,就需要定义不同类型的缺失值。extmiss选项可以指定 extended missing values (.a, .b, etc.)被当做实际数值(也就是non-missingvalues),在用carryforward命令填充缺失值就会有不同的结果。


栗子:有一组数据如下图所示



变量x中缺失值的类型只有sysmiss(.),而变量y中缺失值的类型既有sysmiss(.),又有extended missing values。现在使用carryforward命令对两个xy进行填充缺失值。

carryforward x ,gen(x1)

carryforward y ,gen(y1)


结果如下:



我们发现x1y1的结果是相同的,说明填充缺失值时,没有区分缺失值的类型,统一进行了填充。现在我们加上extmiss选项,看看会出现什么结果。

carryforward x ,gen(x2) extmiss

carryforward y ,gen(y2) extmiss




可以看到x2y2出现了差异,指定extmiss选项时,用carryforward命令填充缺失值,会将

extended missing values (.a, .b, etc.)当做non-missingvalues

 

carryforward命令还有很多其他的用法,包含不少option选项,大家有兴趣的可以help carryforward,查看帮助文件。


接下来我们关注一下今天空气质量情况

全国空气质量如下


不过

河南的亲故们要注意哦


以上就是我们今天分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~祝大家看文愉快,么么哒~


应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

编辑by强宇曦


那些年,你没有经历过的精彩:

1.火锅和肥羊,啤酒和炸鸡,cnstockchinafin

2.天路——chinafincntrade命令

3.subinfile修改文件,滚蛋吧,繁琐的命令君!

4.分时数据,从此唾手可得

5.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度

6.esttab功能挖掘:YesorNo

7.套路处理数据

8.厉害了,我stata

9.众里寻她千百度,synth命令来帮助!

10.I have a Stata, Ihave a python

 

 

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


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

微信扫一扫
关注该公众号