温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者:王俊 (中山大学)
目录
此前,连享会分享了推文「滚动吧统计量!Stata数据处理」(微信版),重点介绍了如果获取滚动窗口统计量,如均值、标准差等。
在实证中分析中,我们也经常要以某个长度的窗口进行滚动回归。例如,在计算企业风险承担水平时,我们就需要计算连续三年的经行业调整的 ROA 标准差。
本文的主要目的是介绍滚动窗口回归命令 rollreg
、rolling
、rolling2
、asreg
的用法,以帮助大家在实证分析中更好应用该方法。
语法
rollreg [depvar varlist] [if exp] [in range], move(#) | add(#) |
dropfirst(#) stub(abbrev) [ robust bw(#) kernel(choice) noconstant
graph(summary|full) ]
depvar
为被解释变量;varlist
为解释变量;move
为移动窗口大小;add
设定初始窗口大小;stub
设定新变量名称。当然,在回归之前,必须要使用 tsset
或 xtset
声明时间序列或面板数据。
案例
webuse invest2, clear
xtset company time
//外网无法下载时,可以访问连享会数据仓库下载
//数据地址:https://gitee.com/arlionn/data/blob/master/data01/invest2.dta
*设定移动窗口为5
rollreg market invest time, move(5) stub(mktM)
语法
rolling [exp_list] [if] [in], window(#) [options] : command
window(#)
设定滚动的窗口大小,相当于每次滚动过程中需要的连续数据个数;recursive
设定起始点不变,每次滚动窗口加 1;rrecursive
设定结束点不变,每次滚动窗口加 1;clear
用滚动的结果来替换原内存,即使原来内存里的数据没有被保存;stepsize(#)
设定每次滚动窗口增加的时期个数;start(time_constant)
滚动的起始时间点;end(time_constant)
滚动的结束时间点。在滚动回归之前,必须要 tsset
或 xtset
声明时间变量。当使用 rolling
命令时,window(#)
选项是必须的,其含义是每次回归的窗口大小。
案例
clear
webuse lutkepohl2, clear
tsset qtr
rolling _b _se, window(30): regress dln_inv dln_inc dln_consump
list start end in 1/10
//外网无法下载时,可以访问连享会数据仓库下载
//数据地址:https://gitee.com/arlionn/data/blob/master/data01/lutkepohl2.dta
+-----------------+
| start end |
|-----------------|
1. | 1960q1 1967q2 |
2. | 1960q2 1967q3 |
3. | 1960q3 1967q4 |
4. | 1960q4 1968q1 |
5. | 1961q1 1968q2 |
|-----------------|
6. | 1961q2 1968q3 |
7. | 1961q3 1968q4 |
8. | 1961q4 1969q1 |
9. | 1962q1 1969q2 |
10. | 1962q2 1969q3 |
+-----------------+
可以看出来,从 1960q1 到 1967q2 共有 30 个时间单位,之后起始点和结束点都加 1,窗口大小保持不变。
webuse lutkepohl2, clear
tsset qtr
rolling _b _se, window(30) recursive: ///
regress dln_inv dln_inc dln_consump
list start end in 1/10
当设定 recursive
选项时,起始时点被固定,结束时点每次向后滚动一个单位,那么 window
的大小也就会从 30 依次加 1。在该例中,观察值一共有 92 个,而滚动回归的窗口是 30,所以回归的总次数是 92-30+1=63
。
+-----------------+
| start end |
|-----------------|
1. | 1960q1 1967q2 |
2. | 1960q1 1967q3 |
3. | 1960q1 1967q4 |
4. | 1960q1 1968q1 |
5. | 1960q1 1968q2 |
|-----------------|
6. | 1960q1 1968q3 |
7. | 1960q1 1968q4 |
8. | 1960q1 1969q1 |
9. | 1960q1 1969q2 |
10. | 1960q1 1969q3 |
+-----------------+
可以看出,从 1960q1 到 1967q2 共有 30 个时间单位,而后每次回归窗口加 1,起始点不变。
webuse lutkepohl2, clear
tsset qtr
rolling _b _se, window(30) rrecursive: ///
regress dln_inv dln_inc dln_consump
list start end in -10/-1
//外网无法下载时,可以访问连享会数据仓库下载
//数据地址:https://gitee.com/arlionn/data/blob/master/data01/lutkepohl2.dta
当设定 rrecursive
选项时,结束时点被固定,起始时点每次滚动向前推 1 单位。
+-----------------+
| start end |
|-----------------|
54. | 1973q2 1982q4 |
55. | 1973q3 1982q4 |
56. | 1973q4 1982q4 |
57. | 1974q1 1982q4 |
58. | 1974q2 1982q4 |
|-----------------|
59. | 1974q3 1982q4 |
60. | 1974q4 1982q4 |
61. | 1975q1 1982q4 |
62. | 1975q2 1982q4 |
63. | 1975q3 1982q4 |
+-----------------+
可以看出,1975q3 到 1982q4 是 30 个时间单位,每次回归窗口加 1,结束时点不变。
Stata
默认会以 _b
开头来命名估计出的系数,并将结果保存下来。另外,可以在 rolling
后加上 _se
,那么 stata
会将每个系数的标准差以 _se
为开头存下来。
另外一个命令是 rolling2
。这个命令的做法其实和 rolling
是差不多的,但最大的一个不同点是,rolling
在对面板数据进行滚动回归时,会分组进行滚动回归,而 rolling2
就是混合回归。
例如,利用 help rolling2
的示例数据进行演示。
*rolling 滚动回归
webuse grunfeld , clear
rolling _b _se, window(8): ///
regress invest mvalue kstock
count
//外网无法下载时,可以访问连享会数据仓库下载
//数据地址:https://gitee.com/arlionn/data/blob/master/data01/grunfeld.dta
grunfeld.dta 是一份面板数据,共有 10 家公司,每家公司有 20 年数据,即总共 200 个观察值。当使用上述命令进行滚动回归时,每家公司会被分开分别进行滚动回归,那么总的回归次数就是 (20-8+1)*10=130
。
*rolling2 滚动回归
webuse grunfeld, clear
rolling2 _b _se, window(8) onepanel: ///
regress invest mvalue kstock
count
当使用 rolling2
的时候,它会将整个面板数据混合回归,也就是说,从整个面板数据中滚动找出 8 年的数据来回归,那么总的回归次数就是 20-8+1=13
次。
滚动窗口回归需要大量的循环,但在运行的时候会遇到很多数据结构问题,诸如非平衡面板数据、重复值、缺失值等。而 asreg
对不同的数据结构并不会采用一种固定的方式估计,恰恰相反,它能识别出不同类别的数据集结构,并采用合适的方法。
除此之外,asreg
命令是利用 Mata
语言来完成的。因此,asreg
在数据集特别大的时候,优势非常明显,能够节约大量的时间。同时,asreg
可以将估计结果输出到现有内存中,这就减少了再去将估计结果与原数据集合并的麻烦。
语法
asreg depvar indepvars [if] [in] ///
[, window([rangevar] #) ///
recursive minimum(#) ///
by(varlist) statistics_options]
window(#)
:设定滚动窗口长度;recursive
:起始点固定,结束点和滚动窗口增长;by
:分组变量;minimum(#)
:用来回归的最小的观察值个数。案例
. webuse grunfeld, clear
. bys company: asreg invest mvalue kstock, ///
wind(year 10) min(5)
分组估计执行完后,会自动产生一组以 _
开头的新变量:
. des _*
variable name variable label
-------------------------------------------
_Nobs No of observatons
_R2 R-squared
_adjR2 Adjusted R-squared
_b_mvalue Coefficient of mvalue
_b_kstock Coefficient of kstock
_b_cons Constant of the regression
我们也可以查看一下具体估计结果:
. list company year _Nobs _R2 _b_mv in 1/10, clean
company year _Nobs _R2 _b_mva~e
1. 1 1935 . . .
2. 1 1936 . . .
3. 1 1937 . . .
4. 1 1938 . . .
5. 1 1939 5.000 0.995 0.054
6. 1 1940 6.000 0.706 0.062
7. 1 1941 7.000 0.576 0.065
8. 1 1942 8.000 0.500 0.052
9. 1 1943 9.000 0.507 0.052
10. 1 1944 10.000 0.460 0.057
关于 asreg
更详细介绍,请参考 help asreg
。
Note:产生如下推文列表的命令为:
lianxh runby 滚动 分组 盈余, m
安装最新版lianxh
命令:ssc install lianxh, replace
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh