滚动吧统计量!Stata数据处理

发布时间:2020-11-25 阅读 17681

Stata连享会   主页 || 视频 || 推文 || 知乎

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

作者: 严子凯 (中山大学)
E-Mail:yanzk@mail2.sysu.edu.cn


目录


本文介绍 Stata 中有关滚动统计量的数据处理方法,先后介绍了 rolling 命令、 asrol 命令以及 rangestat 命令,并对比各自特点,帮助读者轻松搞定滚动均值、滚动标准差等滚动统计量的计算。

1. 案例数据

  • 本文采用Stata自带的范例数据,文件名为 grunfeld.dta 。里面包含了六个变量,其中companyyear分别表示样本公司的代码 (截面变量) 和观察的年份 (时间变量) ;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

2. rolling 命令:向后滚动统计量计算鼻祖

rolling 在一系列滚动窗口的每一个窗口上执行命令,并存储结果。任何存储于 e ()r () 中的结果可用于滚动。

2.1 语法结构

输入 help rolling 可以查看该命令的详细帮助文件。具体解释如下:

rolling [exp_list] [if] [in] ,  ///
window (#)  [options] :  command
  • [exp_list] 在滚动统计量计算中,该语句用于生成新的变量以储存计算得到的滚动统计量。如:mean=r (mean) sd=r (mean) N=r (N)

  • command 具体操作指令,可以包含回归、描述性统计等命令。

  • window (#) 设置滚动窗口的长度。 注意:在运行 rolling 命令前需要使用 tssetxtset 命令设置时间变量。 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 (#)#值。

2.2 操作实例

  • 计算每家公司资本存量的 5 年滚动标准差 (向后滚动)
. webuse grunfeld.dta
. xtset company year
. qui rolling sd=r (mean)  ,clear window (5)  : sum kstock
  • 计算每家公司资本存量的 5 年滚动标准差 (向后滚动) ,起始年份为 1938,终止年份为 1952
. webuse grunfeld.dta
. xtset company year
. qui rolling sd=r (mean) ,  ///
  clear window (5) start (1938) end (1952)  : sum kstock

3. asrol 命令:高速计算向前滚动统计量

asrol 命令用于生成滚动窗口或分组描述性统计

  • asrol 在用户定义的滚动窗口或分组变量上进行描述性统计。

  • asrol 可以有效地处理所有类型的数据结构,例如声明为时间序列或面板数据的数据、未声明的数据或具有重复值、缺失值或具有时间序列间隙的数据。

  • asrol 使用了 Mata 语言的高效编码,这使得其速度非常快。在大型数据处理中优势非常显著。

3.1 语法结构

输入 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 的所有观察值。举例说明: 首先, varlistkstockrangevar (时间变量) 是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       |
        +-------------------------------------------------------+

3.2 操作实例

  • 计算每家公司资本存量的 4 年滚动均值
    bys company: asrol kstock,  ///
    stat (mean)  win (year 4)
  • 计算每家公司资本存量的 5 年滚动标准差,且每个窗口至少有 5 个非缺失值
    bys company: asrol kstock,  ///
    stat (sd)  win (year 5)  min (5)
  • 计算每家公司资本存量、投资额的 5 年滚动标准差 (剔除当期值) ,且每个窗口至少有 5 个非缺失值
    bys company: asrol kstock invest,  ///
    stat (sd)  win (year 5)  min (4)  ///
    xf (focal)

注意:此处 min (#) 中的#最大不超过 4,应为剔除掉当期值后,剩余观察值最多为 4。

4. rangestat 命令:灵活设定窗口

4.1 语法结构

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 剔除当前观察值

4.2 操作实例

  • 计算每家公司资本存量的 4 年滚动均值 (当期值与前三期值)
    rangestat (count)  kstock (mean)  kstock ,  ///
    interval (year -3 0)  by (company)
  • 计算每家公司资本存量的 5 年滚动标准差、滚动均值 (前两期、当期、后两期)
   rangestat  (count) kstock  (sd) kstock  ///  
   (mean) kstock , interval (year -2 2)  ///
   by (company)
  • 计算每家公司资本存量的 4 年滚动标准差、滚动均值 (前两期、后两期)
   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. 华山论道,高下立见

5.1 速度对比

通过计算每家公司资本存量的 5 年滚动标准差来比较 3 个命令的运算效率。注意:rolling 只支持向后滚动,且观察值小于窗口时予以忽略;asrol 只支持向前滚动,通过设置min (5)尽量与 rolling 保持一致;rangestat 在此处采用向前滚动。

可以看到, asrolrangestat 运算效率相近,均非常显著地高于 rolling 运算速度。因而我们建议在对大型数据进行滚动统计量计算时,尽可能采用 asrolrangestat 命令。

. 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

5.2 各家特点

rolling asrol rangestat
滚动窗口 当期向后 当期向前 可前可后
剔除当期
时间设置 必须 无需 无需
运算速度

注释:

  • 滚动窗口:窗口滚动的方式。 rolling 只能从当期开始向后 (下一期) 滚动;asrol 只能从当期开始向前 (上一期) 滚动;rangestat 可自由设置窗口位置,无需从当期开始或结束。
  • 剔除当期:计算滚动统计量中能否剔除掉当期值。
  • 时间设置:是否需要在执行命令前用 tssetxtset 设置时间变量。
  • 运算速度:执行该命令所需时间。

6. 相关推文

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看

专题 嘉宾 直播/回看视频
最新专题 因果推断, 空间计量,寒暑假班等
数据清洗系列 游万海 直播, 88 元,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD