温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者: 严子凯 (中山大学)
E-Mail:yanzk@mail2.sysu.edu.cn
目录
本文介绍 Stata 中有关滚动统计量的数据处理方法,先后介绍了 rolling
命令、 asrol
命令以及 rangestat
命令,并对比各自特点,帮助读者轻松搞定滚动均值、滚动标准差等滚动统计量的计算。
本文采用Stata
自带的范例数据,文件名为 grunfeld.dta
。里面包含了六个变量,其中company和year分别表示样本公司的代码 (截面变量) 和观察的年份 (时间变量) ;invest表示公司的投资额;mvalue表示公司的市场价值;kstock表示公司的资本存量。该数据集对应的主要研究是探讨公司的投资额和资本存量是如何影响公司市值的。
该数据集共包含 10 家公司 (n=10) ,每家公司有 20 年的资料 (T=20,1935-1954) ,整体上为平行面板数据。
. webuse grunfeld.dta,clear
. xtset company year
panel variable: company (strongly balanced)
time variable: year, 1935 to 1954
delta: 1 year
. sum
Variable | Obs Mean Std. Dev. Min Max
-------------+---------------------------------------------------------
company | 200 5.5 2.879489 1 10
year | 200 1944.5 5.780751 1935 1954
invest | 200 145.9583 216.8753 .93 1486.7
mvalue | 200 1081.681 1314.47 58.12 6241.7
kstock | 200 276.0172 301.1039 .8 2226.3
-------------+---------------------------------------------------------
time | 200 10.5 5.780751 1 20
rolling
在一系列滚动窗口的每一个窗口上执行命令,并存储结果。任何存储于 e ()
或 r ()
中的结果可用于滚动。
输入 help rolling
可以查看该命令的详细帮助文件。具体解释如下:
rolling [exp_list] [if] [in] , ///
window (#) [options] : command
[exp_list]
在滚动统计量计算中,该语句用于生成新的变量以储存计算得到的滚动统计量。如:mean=r (mean)
sd=r (mean)
N=r (N)
。
command
具体操作指令,可以包含回归、描述性统计等命令。
window (#)
设置滚动窗口的长度。
注意:在运行 rolling
命令前需要使用 tsset
或 xtset
命令设置时间变量。
window (#)
默认采用当前值向后滚动的方式。例如当前时间变量为 1935 年,则window (5)
代表“1935、1936、1937、1938、1939”。同时, rolling
命令中,计算的每个滚动统计量必须有对应#
个观察值,如果向后滚动的观察值个数小于#
,则予以忽略。
例如:本文采用的样本只包含了 10 家公司每家 20 年 (1935-1954) 的数据。在计算 1951 年的滚动统计量时,因为窗口只包含 1951、1952、1953、1954 年的数据,小于 5
年,所以被忽略跳过,即第一家公司的滚动统计量只有 16
个。
. webuse grunfeld.dta
. xtset company year
. qui rolling mean=r (mean) sd=r (mean) N=r (N) , ///
clear window (5) : sum kstock
. list company start end mean sd N in 1/20
+------------------------------------------------+
| company start end mean sd N |
|------------------------------------------------|
1. | 1 1935 1939 124.98 124.98 5 |
2. | 1 1936 1940 165.86 165.86 5 |
3. | 1 1937 1941 206.38 206.38 5 |
4. | 1 1938 1942 235.74 235.74 5 |
5. | 1 1939 1943 246.72 246.72 5 |
|------------------------------------------------|
6. | 1 1940 1944 246.36 246.36 5 |
7. | 1 1941 1945 257.92 257.92 5 |
8. | 1 1942 1946 287.32 287.32 5 |
9. | 1 1943 1947 378.88 378.88 5 |
10. | 1 1944 1948 510.54 510.54 5 |
|------------------------------------------------|
11. | 1 1945 1949 674.24 674.24 5 |
12. | 1 1946 1950 841.04 841.04 5 |
13. | 1 1947 1951 1002.14 1002.14 5 |
14. | 1 1948 1952 1135.94 1135.94 5 |
15. | 1 1949 1953 1306.92 1306.92 5 |
|------------------------------------------------|
16. | 1 1950 1954 1548.16 1548.16 5 |
17. | 2 1935 1939 159.06 159.06 5 |
18. | 2 1936 1940 199.14 199.14 5 |
19. | 2 1937 1941 241.32 241.32 5 |
20. | 2 1938 1942 277.44 277.44 5 |
+------------------------------------------------+
start (#)
与end (#)
这两个是可选项命令,二者可独立使用,但必须与window (#)
命令连用。
start (#)
用于设定滚动窗口的开始值。注意:#
为时间变量的具体观察值。如本例中:start (1935)
end (#)
用于设定滚动窗口的终止值。注意:#
为时间变量的具体观察值。如本例中:end (1954)
同时使用这两个选项命令时,开始值与终止值两者之差应至少等于window (#)
中#
值。
. webuse grunfeld.dta
. xtset company year
. qui rolling sd=r (mean) ,clear window (5) : sum kstock
. webuse grunfeld.dta
. xtset company year
. qui rolling sd=r (mean) , ///
clear window (5) start (1938) end (1952) : sum kstock
asrol
命令用于生成滚动窗口或分组描述性统计
asrol
在用户定义的滚动窗口或分组变量上进行描述性统计。
asrol
可以有效地处理所有类型的数据结构,例如声明为时间序列或面板数据的数据、未声明的数据或具有重复值、缺失值或具有时间序列间隙的数据。
asrol
使用了 Mata 语言的高效编码,这使得其速度非常快。在大型数据处理中优势非常显著。
输入 help asrol
可以查看该命令的详细帮助文件。具体解释如下:
[bysort]: asrol varlist [if] [in], ///
stat (stat_options) window (rangevar #) ///
[gen (newvar) by (varlist) minimum (#) ///
add (#) ignorezero perc (#) xf ([focal | rangevar]) ]
bysort
前缀能够实现对滚动统计量进行分组计算。例如,对于一个包含了 40 个国家 (country),60 个行业 (industry),平均每个行业有 500 家公司 (company),时长为 10 年的样本数据,当我们想研究每个国家每个行业营收额 (revenue) 的 5 年滚动均值时,便可采用如下命令:
. asrol revenue, window (year 5) stat(mean), ///
by(country industry)
* 或
. bysort country industry: asrol profitability, ///
window(year 5) stat(mean)
varlist
计算滚动统计量的变量
stat (stat_options)
所需计算的统计量。主要包含 (其它的可以参考 help asrol
):
sd 非缺失值的标准差
mean 非缺失值的算术平均值
gmean 非缺失值且为正数的几何平均值
sum 滚动窗口中所有值求和
product 滚动窗口中所有值求积
median 中位数
count 滚动窗口中非缺失值的个数
missing 滚动窗口中缺失值的个数
min 滚动窗口中的最小值
max 滚动窗口中的最大值
first 滚动窗口中的第一个观察值
last 滚动窗口中的最后一个观察值
window (rangevar #)
用于设定滚动窗口,包含两个参数。第一个参数为 rangevar
,用于指定一个时间变量,如日、周、月、季度或年;第二个参数 #
用于设定滚动窗口的长度 (step)。例如:如果时间变量是年,并且想要包含 5 个观测值的滚动窗口,(即当前观测值和前 4 个观测值) ,则该选项设定为 window (year 5)
。
疑问: 既然滚动窗口为 5,那么请问前 4 个观察值的滚动均值是如何计算的呢?
为了深刻理解 asrol 背后的运算逻辑,我们运用以下实例:计算 grunfeld.dta
数据集中kstock (资本存量) 的 5 年滚动均值 (mean) 和计算窗口中缺失值个数 (count) 。
. bysort company: asrol kstock, ///
window (year 5) stat (count mean)
. list in 1/10
+-------------------------------------------------------------------------+
| company year invest mvalue kstock time count5~k mean5_k~k |
|-------------------------------------------------------------------------|
1. | 1 1935 317.6 3078.5 2.8 1 1 2.8 |
2. | 1 1936 391.8 4661.7 52.6 2 2 27.699999 |
3. | 1 1937 410.6 5387.1 156.9 3 3 70.766664 |
4. | 1 1938 257.7 2792.2 209.2 4 4 105.375 |
5. | 1 1939 330.8 4313.2 203.4 5 5 124.98 |
|-------------------------------------------------------------------------|
6. | 1 1940 461.2 4643.9 207.2 6 5 165.86 |
7. | 1 1941 512 4551.2 255.2 7 5 206.38 |
8. | 1 1942 448 3244.1 303.7 8 5 235.74 |
9. | 1 1943 499.6 4053.7 264.1 9 5 246.72 |
10. | 1 1944 547.5 4379.3 201.6 10 5 246.36 |
--------------------------------------------------------------------------|
我们知道该数据集中每家公司共有 20 年的观察值,因而在计算 5 年滚动均值时,第一个观察值的 5 年滚动均值就是其自身,对应的 count
也为 1;第二个观察值的 5 年滚动均值为前两个观察值的均值,对应的 count
为 2,即该步的窗口中共有两个非缺失值;第三个观察值的 5 年滚动均值为前三个观察值的均值,对应的 count
为 3,即该步的窗口中共有三个非缺失值。
以此类推,直到计算第五个观察值的 5 年滚动均值时,滚动窗口才真正包含 5 个观察值 (即自身和前 4 个观察值) 。
gen (newvar)
为计算的滚动统计量命名。注意:如果省略该命令, asrol
将自动生成一个新变量,其名称为stat_rollingwindow_varname
例如上例中计算kstock变量的 5 年滚动均值生成的新变量为——mean5_kstock
by (varlist)
分组命令,功能同bysort
minimum (#)
“最小”选项强制 asrol 仅在滚动窗口中包含最小数量的观察值时才计算滚动统计量。如果滚动窗口的非缺失值数量小于设定的最小值,那么计算的滚动统计量将被缺失值替换。
注意:#是整数,且大于零。
例如在上例计算kstock变量的 5 年滚动均值的命令末尾加入minmum (5)
,那么前 4 个观察值的 5 年滚动均值将因为滚动窗口中非缺失值小于 5 而被缺失值替代
. bysort company: asrol kstock, ///
window (year 5) stat (count mean) min (5)
. list in 1/10
+------------------------------------------------------------------------+
| company year invest mvalue kstock time count5~k mean5_~k |
|------------------------------------------------------------------------|
1. | 1 1935 317.6 3078.5 2.8 1 . . |
2. | 1 1936 391.8 4661.7 52.6 2 . . |
3. | 1 1937 410.6 5387.1 156.9 3 . . |
4. | 1 1938 257.7 2792.2 209.2 4 . . |
5. | 1 1939 330.8 4313.2 203.4 5 5 124.98 |
|------------------------------------------------------------------------|
6. | 1 1940 461.2 4643.9 207.2 6 5 165.86 |
7. | 1 1941 512 4551.2 255.2 7 5 206.38 |
8. | 1 1942 448 3244.1 303.7 8 5 235.74 |
9. | 1 1943 499.6 4053.7 264.1 9 5 246.72 |
10. | 1 1944 547.5 4379.3 201.6 10 5 246.36 |
+-------------------------------------------------------------
add (#)
在计算一列数的乘积和几何平均值时,“0”的出现会引发尴尬,add (#)
使计算过程中所有数字都+“#”。例如在原始计算[0,1,2,3]的几何平均值时因为“0”的出现比较尴尬,添加add (1)
命令后将计算[1,2,3,4]的几何平均值。
ignorezero
计算乘积时忽略窗口中数字“0”的存在
perc (#)
在不使用 perc (k) 选项的情况下,stat (median)
查找给定窗口中值的中值或第 50 个百分点。然而,如果指定了选项perc (#)
,则stat (median)
将找到窗口观察值的第 k 个百分点。
例如,我们想找到滚动窗口的第 85 百分位数,那么我们必须调用选项perc (0.85)
以及使用选项stat (median)
。
bysort company: asrol kstock, ///
window (year 5) stat (median) perc (0.85)
xf ([focal | rangevar])
计算滚动统计量时剔除当前值。该命令共包含 2 种剔除方式:第一种是仅剔除当前观察值,而第二种方法是剔除包含了对应 rangevar 的所有观察值。举例说明:
首先, varlist
是kstock,rangevar
(时间变量) 是year。 +--------------+
| year kstock |
|--------------|
| 2001 100 |
| 2002 200 |
| 2003 300 |
| 2003 400 |
| 2004 500 |
+--------------+
第一种剔除方式:
asrol kstock, stat (mean) xf (focal) gen (xfocal)
第二种剔除方式:
asrol kstock, stat (mean) xf (year) gen (xfyear)
结果如下:
+--------------------------+
| year kstock (法一) (法二) |
|--------------------------|
| 2001 100 350 35 |
| 2002 200 32 325 |
| 2003 300 300 266.67 |
| 2003 400 275 266.67 |
| 2004 500 250 250 |
+--------------------------+
第一种方式剔除了当前年份下唯一对应的当前kstock值,对余下的 4 个观察值求算术平均值。
第二种方式则是剔除了样本中所有当前年份的观察值,具体细节如下表。在计算第三个观察值的均值时,因为 2003 年对应着第三、第四行的观察值,所以第三、第四行的kstock被全部剔除。
+-------------------------------------------------------+
| obs 1: (200 + 300 + 400 + 500) /4 = 350 |
| obs 2: (100 + 300 + 400 + 500) /4 = 325 |
| obs 3: (100 + 200 + 500) /3 = 266.66667 |
| obs 4: (100 + 200 + 500) /3 = 266.66667 |
| obs 5: (100 + 200 + 300 + 400) /4 = 250 |
+-------------------------------------------------------+
bys company: asrol kstock, ///
stat (mean) win (year 4)
bys company: asrol kstock, ///
stat (sd) win (year 5) min (5)
bys company: asrol kstock invest, ///
stat (sd) win (year 5) min (4) ///
xf (focal)
注意:此处 min (#) 中的#最大不超过 4,应为剔除掉当期值后,剩余观察值最多为 4。
rangestat
命令:灵活设定窗口rangestat (stat) { varlist | new_varname=varname } ///
[ { varlist | new_varname=varname } ...] [if] [in] , ///
interval (keyvar low high) [ options ]
stat (stat_options)
所需计算的统计量。主要包含: obs 原始观测值的个数
count 滚动窗口中非缺失值的个数
missing 滚动窗口中缺失值的个数
sd 非缺失值的标准差
variance 方差
mean 非缺失值的算术平均值
sum 滚动窗口中所有值求和
median 中位数
min 滚动窗口中的最小值
max 滚动窗口中的最大值
first 滚动窗口中的第一个观察值
last 滚动窗口中的最后一个观察值
***更多详细代码可以 help rangestat 查看***
interval (keyvar low high)
该语句定义了计算当前统计量的滚动窗口。keyvar
是一个数值变量,[low high]是该数值变量的闭区间。
例如:对于第 5 行 (1939 年) 的观察值
interval (year 0 3)
对应的是 1939、1940、1941、1942
interval (year -1 2)
对应的是 1938、1939、1940、1941
interval (year 0 0)
对应的是 1939 +-------------------------+
| company year kstock |
|-------------------------|
1. | 1 1935 2.8 |
2. | 1 1936 52.6 |
3. | 1 1937 156.9 |
4. | 1 1938 209.2 |
5. | 1 1939 203.4 |
|-------------------------|
6. | 1 1940 207.2 |
7. | 1 1941 255.2 |
8. | 1 1942 303.7 |
9. | 1 1943 264.1 |
10.
| 1 1944 201.6 |
+-------------------------+
by (varlist)
分组计算滚动统计量
excludeself
剔除当前观察值
rangestat (count) kstock (mean) kstock , ///
interval (year -3 0) by (company)
rangestat (count) kstock (sd) kstock ///
(mean) kstock , interval (year -2 2) ///
by (company)
rangestat (count) kstock (sd) ///
kstock (mean) kstock , ///
interval (year -2 2) by (company) excludeself
建议在每条命令中加入
(count) varlist
,因为这能帮助你知道实际参与该观察值的滚动统计量计算的个数。
例如在“计算每家公司资本存量的 4 年滚动标准差、滚动均值 (前两期、后两期) ”中。对于第一行的观察值,实际用于计算滚动统计量的只有第二行、第三行的 2 个值;对于第二行的观察值实际用于计算滚动统计量的只有第一行、第三行、第四行的 3 个值。
. webuse grunfeld, clear
. rangestat (count) kstock (sd) ///
kstock (mean) kstock , ///
interval (year -2 2) by (company) excludeself
. list company year kstock kstock_count ///
kstock_sd kstock_mean in 1/10
+------------------------------------------------------------+
| company year kstock kstock~t kstock_sd kstock_~n |
|------------------------------------------------------------|
1. | 1 1935 2.8 2 73.751234 104.75 |
2. | 1 1936 52.6 3 107.30258 122.96666 |
3. | 1 1937 156.9 4 105.12659 117 |
4. | 1 1938 209.2 4 72.011034 155.025 |
5. | 1 1939 203.4 4 40.158303 207.125 |
|------------------------------------------------------------|
6. | 1 1940 207.2 4 46.704281 242.875 |
7. | 1 1941 255.2 4 48.198418 244.6 |
8. | 1 1942 303.7 4 32.186164 232.025 |
9. | 1 1943 264.1 4 42.094053 256.375 |
10. | 1 1944 201.6 4 64.977154 308.75001 |
+------------------------------------------------------------+
通过计算每家公司资本存量的 5 年滚动标准差来比较 3 个命令的运算效率。注意:rolling
只支持向后滚动,且观察值小于窗口时予以忽略;asrol
只支持向前滚动,通过设置min (5)
尽量与 rolling
保持一致;rangestat
在此处采用向前滚动。
可以看到, asrol
与 rangestat
运算效率相近,均非常显著地高于 rolling
运算速度。因而我们建议在对大型数据进行滚动统计量计算时,尽可能采用 asrol
与 rangestat
命令。
. qui rolling sd=r (sd) n=r (N) , ///
clear window (5) : sum kstock
t=0.18
. by company : asrol kstock, ///
stat (count sd) window (year 5) min (5)
t=0.01
. rangestat (count) kstock (sd) ///
kstock , interval (year -4 0) ///
by (company)
t=0.02
rolling | asrol | rangestat | |
---|---|---|---|
滚动窗口 | 当期向后 | 当期向前 | 可前可后 |
剔除当期 | 否 | 可 | 可 |
时间设置 | 必须 | 无需 | 无需 |
运算速度 | 慢 | 快 | 快 |
注释:
滚动窗口
:窗口滚动的方式。 rolling
只能从当期开始向后 (下一期) 滚动;asrol
只能从当期开始向前 (上一期) 滚动;rangestat
可自由设置窗口位置,无需从当期开始或结束。剔除当期
:计算滚动统计量中能否剔除掉当期值。时间设置
:是否需要在执行命令前用 tsset
或 xtset
设置时间变量。运算速度
:执行该命令所需时间。
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟,课程主页 Stata 33 讲 - 连玉君, 每讲 15 分钟. Stata 小白的取经之路 - 龙志能,时长:2 小时,课程主页 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 因果推断, 空间计量,寒暑假班等 | |
⭕ 数据清洗系列 | 游万海 | 直播, 88 元,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD