查看原文
其他

rangestat,让统计量灵活滚动起来!

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

本文作者:陈梦华,河南大学经济学院

本文编辑:尚晨曦

技术总编:李婷婷

Stata&Python云端课程来啦!

为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!



引 言
想必大家都会遇到有关滚动统计量数据的处理,众所周知rolling命令可以实现向后滚动统计量,然而rolling的龟速让人望而却步。以往的推文《asrol命令——让你的描述性统计信息滚动起来》介绍了asrol命令来计算变量在滚动窗口下的描述性统计量,面对大型数据运行速度比rolling快很多,但asrol使用起来比较单一。比asrol更厉害的是, rangestat命令可基于退化窗口、滚动窗口、递归窗口、反向递归窗口或特定窗口进行计算,能够自由设定窗口,并且可使用Stata中的内置函数或者编写的Mata函数。接下来本文就为大家介绍 Stata 滚动界的大佬rangestat命令!rangestat命令介绍

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

ssc install rangestat

首先看一下这个命令的语法:

rangestat (stat) { varlist | new_varname=varname } [ { varlist | new_varname=varname } ...] [if] [in], interval(keyvar low high) [ options ]
stat()包括的具体统计量:
stat含义
obs原始观测值的个数
count滚动窗口中非缺失值的个数
missing滚动窗口中缺失值的个数
mean平均值
sum求和
sd标准差
variance方差
min滚动窗口中的最小值
max滚动窗口中的最大值
median中位数
first(nm)滚动窗口(非缺失值)中的第一个观测值
last(nm)滚动窗口(非缺失值)中的最后一个观测值
new_varname=varname 为计算的滚动统计量命名。如果省略该命令,将自动生成一个新变量,其名称为varname_stat 。例如计算变量invest的滚动均值生成的新变量为——invest_mean
rangestat支持限定符 ifin来计算限定样本的观测值。

[option]包括:

interval (keyvar low high):定义了计算当前统计量的滚动窗口。keyvar 是一个指定时间的数值型变量,如日、周、月、季度或年。(low high)用来指定滚动窗口的闭区间界限。

by(varlist):分组计算滚动统计量。

excludeself:滚动计算中剔除当期观测值。

describe:显示创建的新变量的名称。

local(name):定义一个包含新创建变量名的宏。

先举个例子来理解一下这些选项:计算同种族、同行业且与自身年龄上下相差1岁的人群在一年内的平均工资(不包括自身)。
sysuse nlsw88, clearrangestat (mean) mwage=wage (count) cwage=wage,interval(age -1 1) excludeself by(race industry) describe //设置新生成wage滚动均值的变量名为mwage、非缺失值个数的变量名为cwage。//指定excludeself选项时,将忽略每个当前观测值变量wage的值。list age *wage in 10list age *wage in 20*一种以往的方法用以校对结果:sum wage if inrange(age, age[10]-1, age[10]+1) & race == race[10] & industry == industry[10] & _n != 10sum wage if inrange(age, age[20]-1, age[20]+1) & race == race[20] & industry == industry[20] & _n != 20

结果窗口列出了新创建的变量名以及变量标签。可以看出,两种方法计算的非缺失值个数以及wage的滚动平均值均一致。显然,用sum的效率很低,而rangestat可以对所有观测值重复相同的计算。
滚动窗口

数据集简介:

为了更好的理解、掌握rangestat这个命令,我们通过一个数据集(grunfeld.dta)——研究公司的投资额和资本存量如何影响公司市值,来为大家详细展示rangestat命令的用法。这个数据集包含了六个变量,其中companyyear分别代表公司的代码和年份,共有10个公司,每家公司有20个年度的数据;invest代表公司的投资额;mvalue代表公司的市场价值;kstock代表公司的资本存量。
下面我们来介绍一下不同的间隔窗口:

1. 退化窗口

最简单的情况是使用具有相同keyvar值的观测值来计算统计量,即下界和上界与keyvar的值相同,我们指定了low和high同时设为0。下面的例子使用具有相同rep78的观测值来计算变量mpg和perice的最小值和均值。

sysuse auto,clearrangestat (min) price mpg (mean) price mpg,interval(rep78 0 0)sort rep78 makelist in 1/10

2. 滚动窗口

下面的例子计算每家公司投资额invest的5年滚动平均值、标准差和非缺失值的个数。

webuse grunfeld, clearset seed 1234replace invest = . if uniform() < .1drop if uniform() < .1 rangestat (mean) invest (sd) invest (count) invest, ///interval(year -2 2) by(company)list in 1/10
从结果发现,如果keyvar含有缺失值或者观测值个数小于设定的窗口间隔,那么rangestat会自动忽略,没有删除期数不够的结果,而是用真实的期数进行计算。

3. 递归窗口

该类窗口类似于依次累加。当“.”指定为low时,表示不设置滚动窗口的下限,计算的是上界对应的观测值之前的所有观测值。使用0指定high表示当期。

webuse grunfeld, clearrangestat (sum) invest mvalue kstock, interval(year . 0) by(company)list in 1/10

4. 反向递归窗口

该类窗口类似于依次递减。下面的例子将0设为low,“.”设为high,在 Stata 中,系统缺失值大于任何非缺失值的值。例如,interval (year 1950 .)表示将使用大于等于1950年的所有观测值进行计算。
webuse grunfeld, clearrangestat (sum) invest, interval(year 0 .) by(company)list in 1/10

5. 特定窗口

我们还可以指定一个不能通过简单地在low或high上添加#来计算的间隔,下面的示例查找price相近的汽车的平均维修记录,要求在目前汽车价格的10%以内。

sysuse auto, cleargen low = .9 * price gen high = 1.1 * price //自定义一个窗口的下界和上界rangestat (mean) rep78, interval(price low high)list in 1/10

使用内置函数
rangestat可以使用内置函数(reg)在滚动窗口内执行普通最小二乘线性回归。
新变量含义
reg_nobsnumber of obs
reg_r2R-squared
reg_adj_r2adj. R-squared
b_mvaluecoef of mvalue
b_kstockcoef of kstock
b_conscoef of constant
se_mvaluestandard error of mvalue
se_kstockstandard error of kstock
se_consstandard error of constant
webuse grunfeld, clearrangestat (reg) invest mvalue kstock, interval(year -6 0) by(company)list in 1/10

invest是因变量,mvalue、kstock是自变量,在过去7年的时间窗口内做滚动回归。

结果如下:

注意:在Stata的回归过程中,由于当前观测区间内的共线性(reg)将返回缺失值。

我们也可以使用内置函数 (cov) 来获取两个变量的协方差。下面的例子,我们创建了100家公司50个月的每日股票回报虚拟数据,根据每日数据,计算月度协方差。

clearset seed 123123set obs 100gen long firm = _nexpand 50bysort firm: gen month = _nexpand 21bysort firm month: gen ret_day = _ngen return = runiform() if runiform() < .99gen weight = runiform()egen firm_month = group(firm month)rangestat (cov) return weight, interval(firm_month 0 0) describelist in 1

以上就是今天介绍的滚动利器rangestat命令的所有内容啦,觉得有用的话就转发分享一下吧~

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐 

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

  善用dataex命令,高效沟通你我他

  用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

如何随机生成满足特定数据特征的新变量?

爬取无法翻页网页——自然科学基金项目及可视化

爬取京东评论数据进行情感分类

Stata与音乐之间的酷炫连接

这些年,爬虫俱乐部走出的博士们!
         看这里,近五年各校高被引论文上榜名单!

高校经管类核心期刊发文排行榜

疯狂的科研创新加速器——Stata!

  可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!

  好玩有趣的手绘图形库——cutecharts

  爬虫实战|摩尔庄园微博话题讨论

  一季度财报出炉,哪些公司最烧钱?

  一季度财报出炉,哪些公司最赚钱?

  技能篇 | 图片合并大法

  批量空气质量数据文件合并分析

  Stata17之日期时间新功能

  Stata17之Lasso新功能

爱奇艺视频弹幕爬取之《小舍得》数据可视化利器——Matplotlib

  从第七次人口普查看中国人口变化|Stata与Python交互绘图

  200万投资者关注!!哪家公司这么牛?

  
带你领略一天天气之变化

关于我们 


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



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

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

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

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