查看原文
其他

asrol命令——让你的描述性统计信息滚动起来

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

本文作者:朱巧利

文字编辑:李钊颖

技术总编:李朋冲


爬虫俱乐部将于2020年1月5日至11日湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~


近日有读者给我们发邮件,说需要计算滚动窗口下某个变量的均值和标准差,却不知道如何实现。其实大家都知道,summarize命令可以生成数据整体或者分组后的描述性统计量,但在时间序列分析中,有时需要计算变量在滚动窗口下的描述性统计量,这时summarize命令就功能不足了。不过不要害怕,asrol命令可以帮助我们解决这个问题!接下来,小编就带大家领略一下asrol命令的风采!

 

asrol命令为外部命令,使用前需安装:

ssc install asrol, replace


一、asrol命令介绍

asrol命令可以在我们设定的滚动窗口中计算描述性统计信息,或与bysort命令结合来分组计算描述性统计量,其语法结构如下:

 

[bysort]:asrol varlist [if] [in], stat(stat_options) window(rangevar #)

[gen(newvar)by(varlist) minimum(#) add(#) ignorezero perc(#) xf([focal | rangevar])]

 

其中,stat()选项用于指定所需计算的统计量,为必选项。asrol命令支持计算多个变量的多个统计信息,stat()选项中可以包括的统计量主要有:sd(标准差)、mean(均值)、gmean(几何平均值)、median(分位数)、sum(总和)、product(乘积)等。
接下来为读者介绍asrol命令常用的几个选项:

 

1、指定滚动窗口——window()选项

window()选项用于指定滚动窗口。这一选项中包含两个参数,第一个参数通常是一个数值型变量的变量名,且一般为时间变量,如年、月、日、季度等。第二个参数是一个指定滚动窗口长度的整数。如在下例中我们要按公司分组依次计算每五年的投资均值,window()选项应设置为:window(year 5),这一程序如下:

webuse grunfeld, clearbysort company: asrol invest, stat(mean count first last) window(year 5) min(5)list company year invest *_invest in 1/10, abbrev(13)


为了便于展示window()选项的滚动过程,我们在stat()选项中列示了3个额外的统计信息,其中,count是指滚动窗口中非缺失的观测值个数、first为滚动窗口中的第一个观测值、last为滚动窗口中的最后一个观测值。min为选项中minimum的简写,min(5)的含义是指定计算均值需要的最少的观测值个数为5,当滚动窗口中的观测值个数不足5个时,相应的统计量会以缺失值替代。在生成一个变量的多个统计信息或生成多个变量的统计信息时,asrol命令会以一定规则自动为新变量命名。list的结果如下:



滚动窗口是从数据集中的第一个观测值开始。第一次观测中,滚动窗口仅包含当前一个观测值,不满足min()选项要求的最少5个观测值,因此年份为1935时invest的统计信息均为缺失值。接下来观测值开始增加,直到1939年时滚动窗口中观测值个数达到5个,达到了滚动窗口指定的滚动长度5。此时,滚动窗口中的第一个观测值为317.6,最后一个观测值为330.8,invest的均值为341.7(=(317.6+391.8+410.6+257.7+330.8)/5)。随着数据集向下扩展,新的观测值逐个被纳入滚动窗口,由于设定的滚动窗口只能容纳5个观测值,所以之前的观测值也依次退出滚动窗口,数据集就这样滚动了起来。

 

window()并非必选项,在不设置滚动窗口时,asrol命令与bysort命令组合可以计算分组的描述性统计信息,其性能类似于egen命令。在上例中,我们去掉window()选项,并分别用asrol命令和egen命令中的求均值函数mean()计算invest的均值,程序及结果如下:

webuse grunfeld, clearbysort company: asrol invest, stat(mean) gen(mean_asrol)bysort company: egen mean_egen = mean(invest)list company year invest mean_* if year == 1935, abbrev(10)



可以看到,在不定义滚动窗口时,通过bysort命令对不同公司分组,asrol命令与egen命令生成的每组均值是完全一样的。

 

2、指定分位数——perc()选项


perc()是计算分位数时需指定的一个选项,不指定perc()选项时,stat(median)默认计算给定窗口中的第50个百分位数。若需要计算给定窗口中的第75个百分位数或第k个百分位数,可将此选项指定为perc(0.75)或perc(k)。示例如下:

webuse grunfeld, clearbysort company: asrol invest, stat(median) window(year 5) perc(0.75) ///gen(median75) min(5)list company year invest median75 in 1/10



3、分组——by(varlist)

其实使用by()这个选项与在开头使用bysort有一样的结果,即:

asrol invest, window(year 5) stat(mean), by(country) bysort country : asrol invest, window(year 5) stat(mean)


这两行命令结果是相同的,只需要使用一个即可,但是使用bysort比使用by有一些速度上的优势,因此推荐大家使用bysort。

 

二、拥抱asrol
除了asrol命令,rolling命令也能实现窗口滚动,曾经的小编也是用rolling命令在Stata上计算统计量,可它的龟速真的是令小编印象深刻啊!苦恼时间不够用之际,asrol命令如英雄一般脚踏祥云来解救我,这个运行速度让我瞬间爱上了它!在大数据集中,仅运行效率高这一优势就足以使我们放弃rolling命令。我们可以运行以下程序比较asrol命令和rolling命令在计算描述性统计量时的运行速度:
webuse grunfeld, clearset rmsg onbysort company: asrol invest, stat(mean) win(year 10)qui rolling mean = r(mean), clear window(10): sum invest set rmsg off



可见,对于grunfeld这个只有200个观测数的数据来说,同样计算invest在滚动窗口中的均值,asrol命令用时仅0.01秒,而rolling命令用时0.26秒(注:由于网速不同时间会有所不同),几十倍的差距在几十万甚至上百万的大数据集中优势不言而喻,毕竟科研不易,我们要珍惜时间!
此外,asrol命令是在原始数据的基础上直接生成新变量,不用在为后续的数据合并烦心,进一步节省了时间!
以上就是今天为大家介绍的asrol命令的基本用法,小编已经被asrol命令的友好感动,有了asrol命令,再也不用为计算滚动窗口中的描述性统计量忧心啦,需要的小伙伴赶紧学起来吧!



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
Python带你看文献—xpath抓取知网文献
您有一份天气预报待签收 
听说会Stata的人,数学不会太差?
批量修改路径
妙用正则表达式--Python中的re模块
豆瓣电影评分之数据爬取与可视化的实现 

为了辅导作业,这位家长竟然...

      走进列表的世界——列表方法(二)
走进列表的世界——列表方法(一)
朝花夕拾|长宽数据转换——reshape命令

Stata有音乐包啦!

对《陈情令》的数据可视化分析

stata绘制热力图详解

实战演练-明星微博热搜次数的数据可视化

《少年的你》影评

集合常用方法小结

关于我们

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

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

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

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