各位读者早上好。昨天的推文由于编辑错误所以删除,今天补发。给大家造成不便请原谅。不过我们明天还会再发一篇新推文哒!
哈喽,诸君安。很多时候,我们从网络或者某些数据库等下载的数据,会有很多缺失值,而这样的数据不符合使用要求的,我们要对其进行处理。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
我们以前三行为例来进行说明,当第2行chang为0时,fund_id和fund_name所在列的缺失值没有进行填充,并且第三行chang虽然为1,但是也没有进行填充,说明当change为0时,其后边的行无论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_name第1行为“华夏成长”,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命令对两个x、y进行填充缺失值。
carryforward x ,gen(x1)
carryforward y ,gen(y1)
结果如下:
我们发现x1、y1的结果是相同的,说明填充缺失值时,没有区分缺失值的类型,统一进行了填充。现在我们加上extmiss选项,看看会出现什么结果。
carryforward x ,gen(x2) extmiss
carryforward y ,gen(y2) extmiss
可以看到x2、y2出现了差异,指定extmiss选项时,用carryforward命令填充缺失值,会将
extended missing values (.a, .b, etc.)当做non-missingvalues。
carryforward命令还有很多其他的用法,包含不少option选项,大家有兴趣的可以help carryforward,查看帮助文件。
接下来我们关注一下今天空气质量情况
全国空气质量如下
不过
河南的亲故们要注意哦
以上就是我们今天分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~祝大家看文愉快,么么哒~
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
编辑by强宇曦
那些年,你没有经历过的精彩:
1.火锅和肥羊,啤酒和炸鸡,cnstock和chinafin
5.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度
10.I have a Stata, Ihave a python
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
微信扫一扫
关注该公众号