rangestat,让统计量灵活滚动起来!
本文作者:陈梦华,河南大学经济学院
本文编辑:尚晨曦
技术总编:李婷婷
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 | 含义 |
---|---|
obs | 原始观测值的个数 |
count | 滚动窗口中非缺失值的个数 |
missing | 滚动窗口中缺失值的个数 |
mean | 平均值 |
sum | 求和 |
sd | 标准差 |
variance | 方差 |
min | 滚动窗口中的最小值 |
max | 滚动窗口中的最大值 |
median | 中位数 |
first(nm) | 滚动窗口(非缺失值)中的第一个观测值 |
last(nm) | 滚动窗口(非缺失值)中的最后一个观测值 |
new_varname=varname
为计算的滚动统计量命名。如果省略该命令,将自动生成一个新变量,其名称为varname_stat
。例如计算变量invest的滚动均值生成的新变量为——invest_mean
。rangestat
支持限定符 if
和in
来计算限定样本的观测值。[option]包括:
interval (keyvar low high)
:定义了计算当前统计量的滚动窗口。keyvar
是一个指定时间的数值型变量,如日、周、月、季度或年。(low high)用来指定滚动窗口的闭区间界限。
by(varlist)
:分组计算滚动统计量。
excludeself
:滚动计算中剔除当期观测值。
describe
:显示创建的新变量的名称。
local(name)
:定义一个包含新创建变量名的宏。
sysuse nlsw88, clear
rangestat (mean) mwage=wage (count) cwage=wage,interval(age -1 1) excludeself by(race industry) describe
//设置新生成wage滚动均值的变量名为mwage、非缺失值个数的变量名为cwage。
//指定excludeself选项时,将忽略每个当前观测值变量wage的值。
list age *wage in 10
list age *wage in 20
*一种以往的方法用以校对结果:
sum wage if inrange(age, age[10]-1, age[10]+1) & race == race[10] & industry == industry[10] & _n != 10
sum wage if inrange(age, age[20]-1, age[20]+1) & race == race[20] & industry == industry[20] & _n != 20
数据集简介:
1. 退化窗口
最简单的情况是使用具有相同keyvar值的观测值来计算统计量,即下界和上界与keyvar的值相同,我们指定了low和high同时设为0。下面的例子使用具有相同rep78的观测值来计算变量mpg和perice的最小值和均值。
sysuse auto,clear
rangestat (min) price mpg (mean) price mpg,interval(rep78 0 0)
sort rep78 make
list in 1/10
2. 滚动窗口
下面的例子计算每家公司投资额invest的5年滚动平均值、标准差和非缺失值的个数。
webuse grunfeld, clear
set seed 1234
replace invest = . if uniform() < .1
drop if uniform() < .1
rangestat (mean) invest (sd) invest (count) invest, ///
interval(year -2 2) by(company)
list in 1/10
keyvar
含有缺失值或者观测值个数小于设定的窗口间隔,那么rangestat
会自动忽略,没有删除期数不够的结果,而是用真实的期数进行计算。该类窗口类似于依次累加。当“.”指定为low
时,表示不设置滚动窗口的下限,计算的是上界对应的观测值之前的所有观测值。使用0指定high
表示当期。
webuse grunfeld, clear
rangestat (sum) invest mvalue kstock, interval(year . 0) by(company)
list in 1/10
4. 反向递归窗口
low
,“.”设为high
,在 Stata 中,系统缺失值大于任何非缺失值的值。例如,interval (year 1950 .)
表示将使用大于等于1950年的所有观测值进行计算。webuse grunfeld, clear
rangestat (sum) invest, interval(year 0 .) by(company)
list in 1/10
5. 特定窗口
我们还可以指定一个不能通过简单地在low或high上添加#来计算的间隔,下面的示例查找price相近的汽车的平均维修记录,要求在目前汽车价格的10%以内。
sysuse auto, clear
gen low = .9 * price
gen high = 1.1 * price //自定义一个窗口的下界和上界
rangestat (mean) rep78, interval(price low high)
list in 1/10
新变量 | 含义 |
---|---|
reg_nobs | number of obs |
reg_r2 | R-squared |
reg_adj_r2 | adj. R-squared |
b_mvalue | coef of mvalue |
b_kstock | coef of kstock |
b_cons | coef of constant |
se_mvalue | standard error of mvalue |
se_kstock | standard error of kstock |
se_cons | standard error of constant |
webuse grunfeld, clear
rangestat (reg) invest mvalue kstock, interval(year -6 0) by(company)
list in 1/10
invest是因变量,mvalue、kstock是自变量,在过去7年的时间窗口内做滚动回归。
结果如下:
注意:在Stata的回归过程中,由于当前观测区间内的共线性(reg)将返回缺失值。
我们也可以使用内置函数 (cov) 来获取两个变量的协方差。下面的例子,我们创建了100家公司50个月的每日股票回报虚拟数据,根据每日数据,计算月度协方差。
clear
set seed 123123
set obs 100
gen long firm = _n
expand 50
bysort firm: gen month = _n
expand 21
bysort firm month: gen ret_day = _n
gen return = runiform() if runiform() < .99
gen weight = runiform()
egen firm_month = group(firm month)
rangestat (cov) return weight, interval(firm_month 0 0) describe
list in 1
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
听说这样做立项成功率更高哦
如何处理缺失值?这一篇搞定!
善用dataex命令,高效沟通你我他
大数据下的大学分数线排行榜,快来围观!
《觉醒年代》—带你回到百年前
用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)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。