ftools命令——畅游大数据时代的加速器
本文作者:周宏杰
文字编辑:张馨月
在往期推文中,介绍了collapse、merge等命令,这些命令在中小级别数据集中有着卓绝的效果。但是随着数据量的增加,这些命令的处理速度会越来越慢。显然,在大数据时代,这些命令是无法完美满足人们的需求的。那么,Stata在大数据时代该何去何从呢?为了Stata能够迎合时代潮流,大牛们开发了一些应用于大数据的Stata命令。在本文中,将介绍其中一个命令——ftools。
一、ftools命令的工作机制
collapse、merge等命令在大数据中运行速度较慢,是因为它们依赖于sort、bysort等排序命令。在中小数据集中,对数据进行排序是简单的,但是对大数据直接排序所需的时间是难以忍受的。因此,在大数据中,提升运行速度的前提是避开sort或者bysort命令的使用。为此,ftools采取了具有线性探索法的哈希表来替代bysort。
哈希表是根据关键码值来直接访问的数据结构。将容易查找的数组和容易增减的链表的结合起来,只用通过把关键码映射到表中的一个位置,就得到了查找容易,插入删除也容易的哈希表。
实际上,ftools并不是单纯Stata命令,它可以分成两个部分。一部分是处理因子变量或者分类变量的Mata类型(这也是ftools名字的来源,factor tools),另一部分是基于该Mata类型的一系列已经封装好的Stata命令。本文主要介绍第一部分Mata类型,第二部分封装好的命令将在后续推文中介绍。
二、ftools命令的语法及常用选项
首先,ftools是个外部命令,需要通过“sscinstall ftools”进行安装。同时,需要通过“ssc install moremata”、“ssc install boottest”安装moremata和boottest命令,以便ftools更好地运行。需要注意的是,为了直接使用Mata函数,需要运行”ftools,compile”语句。
然后,需要声明因子变量,此时根据三种情况进行选择如何指定分类变量为因子变量,基本语法如下:
三、ftools命令的用法示例
1、分组编号
在大数据中,Stata根据不同变量进行分组编号是比较困难的,此时用ftools命令编号速度会快很多。接下来用Stata自带的数据集auto来展示根据foreign和mpg分组编号得到各组编号id变量的过程,具体命令如下所示:
sysuse auto, clear
list
mata: F = factor("foreign mpg")
mata: F.store_levels("id")
list
结果如下图所示:
2、比较ftools和unique命令计算变量的唯一值数量
一般情况下,可以使用外部命令unique(”ssc installunique”)来计算变量的唯一值的数量,但是该命令在大数据中比较慢,此时可以使用ftools命令中的F.num_levels和F.num_obs来代替unique命令。接下来利用程序计时器timer命令,来比较ftools命令和unique的运行速度,具体命令如下所示:
*unique命令计算变量的唯一值的数量
timer clear 1 //用于复位第一个秒表的时间至 0
timer on 1 //用于启动第一个秒表
sysuse auto, clear
unique weight
timer off 1 //用于关闭第一个秒表
timer list 1 //用于列示第一个秒的耗时
*ftools命令计算变量的唯一值的数量
timer clear 1
timer on 1
sysuse auto, clear
mata: F=factor("weight")
mata:F.num_levels,F.num_obs
timer off 1
timer list 1
结果如下所示:
可以看出,两个程序结果是一样的,weight的唯一值有64个,该变量的记录数有74条,同时,很明显地,unique命令所需的时间是ftools的时间的5倍,证明了ftools命令的运行速度极快。
一般情况下,可以使用外部命令xmiss(”ssc install xmiss”)来统计变量中的缺失值数量,但是该命令在大数据中比较慢,此时可以使用ftools命令中的一系列方法和属性来代替xmiss命令。具体命令如下所示:
*xmiss命令统计变量中的缺失值数量
timer clear 1
timer on 1
sysuse nlsw88, clear
xmiss race union
timer off 1
timer list 1
*ftools命令统计变量中的缺失值数量
timer clear 1
timer on 1
sysuse nlsw88, clear
mata: F = factor("race")
mata: F.panelsetup()
mata: mask = rowmissing(st_data(., "union")) //st_data(.,varnames)将指定变量varnames转成transmorphic矩阵,rowmissing(data) 识别变量中的缺失值
mata: missings = panelsum(F.sort(mask), F.info) //panelsum(data,position_matrix)根据position_matrix对数据data进行加总
mata: missings, F.counts
timer off 1
timer list 1
结果如下所示:
可以看出,两个程序跑出来的结果是一样的,当race=white时,缺失284个值,当race=black时,缺失82个值,当race=other时,缺失2个值,不过xmiss运行时间是ftools的8倍,说明ftools的运行速度是极快的。
以上就是今天介绍的ftools命令中的Mata类型部分,相信大家对于ftools运行速度和便捷性有了一定的认识,赶紧找到以前为大数据集编写的do文件,让慢吞吞的命令都get out,替换上ftools命令吧!
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。