Ftools命令组之fegen命令介绍
本文作者:周宏杰
文字编辑:张馨月
导读
在往期推文《Ftools命令组之fisid命令和fsort命令介绍》中,我们已经详细介绍了ftools的封装命令——fisid命令和fsort命令,本文中将继续介绍ftools的封装命令系列之一的fegen命令。
fegen命令
基本语法结构:
fegen [type] newvar = function(arguments) [if] [in] [, options]
fegen命令用于在大数据集中代替egen命令来加快函数运行速度。从语法中可以看出,fegen命令和egen命令一样,可以指定生成变量的类型(int、long、float等)。虽然fegen处理速度有了极大的提升,但是目前fegen支持的函数不多,只能运行group函数(为数据进行分组编码)
为了展示fegen命令的效果,需要先生成一个大数据集。本文使用Stata自带数据集nlsw88.dta,重复生成该数据集10次之后,将这些数据纵向拼接起来得到一个大数据集tmp.dta,具体代码如下所示:
clear
forv i=1/10{
sysuse nlsw88,clear
save `i',replace
}
use 1,clear
forv i=2/10{
append using `i'
}
save "tmp",replace
(1)egen命令和fegen命令速度对比
接下来对比egen命令生成group函数计算结果的耗费时间,展示fegen 命令的运行速度,为了使对比结果有更好的可信度,这里对tmp.dta数据集中的race变量运行egen命令和fegen命令各五次,然后对所耗时间取均值。具体命令如下所示:
*使用fegen命令
scalar sum=0 //生成一个标量来存储5次运行程序所耗费的总共时间
forv i = 1/5{
use tmp,clear
timer clear 1
timer on 1
fegen 分组编号=group(race)
timer off 1
timer list 1
scalar sum=sum+r(t1)
}
scalar avg=sum/5 //运行时间均值
di "使用fegen命令耗费的时间为",avg
*使用egen命令
scalar sum=0
forv i = 1/5{
use tmp,clear
timer clear 1
timer on 1
egen 分组编号=group(race)
timer off 1
timer list 1
scalar sum=sum+r(t1)
}
scalar avg=sum/5
di "使用egen命令耗费的时间为",avg
具体结果如下所示:
从这个结果看出,各运行fegen命令和egen命令五次后,两个命令的运行时间均值有着显著差距,很明显,fegen命令运行速度比egen命令快2倍以上。
(2)展示missing选项效果
当不带missing选项时,fegen group命令(即使用fegen命令运行group函数,为了简便,下面都称为fegen group命令)不会对缺失值进行分组,仍然生成缺失值;当使用missing选项时,fegen group命令将缺失值另外分成一个组。这里对tmp.dta数据集里面的occupation变量分别使用带有或者不带有missing选项的fegen group命令。具体命令如下所示:
use tmp,clear
fegen 分组编号1=group(occupation)
fegen 分组编号2=group(occupation),missing
codebook 分组编号1 分组编号2 //查看两个分组编号的信息
具体结果如下所示:
从结果看出,带有missing选项的fegen group命令运行结果比不带有missing选项的fegen group命令多了一组,而且没有缺失值,说明带有missing选项的fegen group命令将缺失值编成了一组。
(3)对比带missing和不带missing选项的fegen group命令的运行速度
这里需要注意的一点是,使用或者不使用missing选项,fegen group命令的运行速度是有显著区别的。这里还是对occupation变量使用不同的方法分别来处理。具体代码如下所示:
*使用missing选项
scalar sum=0
forv i = 1/5{
use tmp,clear
timer clear 1
timer on 1
fegen 分组编号1=group(occupation),missing
timer off 1
timer list 1
scalar sum=sum+r(t1)
}
scalar avg=sum/5 //运行时间均值
di "使用missing选项,fegen命令耗费的时间为",avg
*不使用missing选项
scalar sum=0
forv i = 1/5{
use tmp,clear
timer clear 1
timer on 1
fegen 分组编号1=group(occupation)
timer off 1
timer list 1
scalar sum=sum+r(t1)
}
scalar avg=sum/5 //运行时间均值
di "不使用missing选项,fegen命令耗费的时间为",avg
具体结果如下所示:
从结果看出,使用missing选项的fegen group命令运行速度明显慢于不使用missing选项的fegen group命令。小朋友,你是否有很多的问号?那接下来就探索它的原因。这里会使用到fegen group命令的另一个选项verbose来查看分组编码的具体信息。具体代码如下所示:
use tmp,clear
fegen 分组编号1=group(occupation),verbose
fegen 分组编号2=group(occupation),missing verbose
具体结果如下所示:
从verbose所产生的详细信息来看,当fegen group命令不使用missing命令时,采用的方法是hash0也就是处理大数据集时采取的改进方法,但是当fegen group命令使用missing命令时,这里显示的方法是stata,也就是说没有采取改进方法,还是依旧是使用传统的stata处理方式来处理大数据集,所以速度是慢很多的。因此,当在大数据集中,使用fegen group命令时,尽量别使用missing选项。
至此,本文已经介绍完了fegen命令。虽然目前fegen命令支持的函数比较少,但是它的运行速度是令人惊喜的,在特定情况下能发挥奇效,并且由于fegen只是一个新开发的命令,相信以后会支持越来越多的函数,所以各位可以继续关注这个命令的发展。
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。