如何在没有 SSC 包的情况下执行滚动 window 计算

How to perform rolling window calculations without SSC packages

目标: 使用变量 PanelVarTimeVarVar1 对 Stata 中的面板数据执行滚动 window 计算,其中 window 可以在不同 window 大小的循环中更改。

问题: 没有访问 SSC 的包可以解决这个问题(比如 rangestat

我知道

by PanelVar: gen Var1_1 = Var1[_n]

Var1_1 中生成 Var1 的副本。所以我认为尝试

是有意义的
by PanelVar: gen Var1SumLag = sum(Var1[(_n-3)/_n])

为整个变量生成 _n-3_n 的滚动 window 计算。但是它没有产生我想要的结果,它只产生零。

您可以使用 sum(Var1) - sum(Var1[_n-3]),但我也希望能够使滚动 window 左对齐(总结未来的观察)以及右对齐(总结过去的观察)。

基本上我想复制Python的“.rolling().agg()”功能。

在Stata中_n是当前观察的索引。当 _n 为 1 时,表达式 (_n - 3) / _n 产生 -2 并随 _n 缓慢增加,但始终小于 1。作为应用于从变量观察中提取值的下标,它总是产生缺失给定 Stata 向下舍入表达式的额外规则的值。因此,它减少为 -2、-1 或 0:在每种情况下,当作为下标给出时,它都会产生缺失值。实验将向您展示给定任何数字变量,比如 numvarnumvar[-2]numvar[-1]numvar[0] 的引用都会产生缺失值。换句话说,你似乎希望 / 产生一组下标 return 一个你可以求和的序列,但这与 Stata 在这种情况下所做的事情还有很长的路要走:/ 只是被解释为除法。 (运行 缺失总和总是 returned 为 0,这是在该计算中忽略缺失的表达式:就像 2 + 3 + . + 4 被 returned 一样9 所以 . + . + . + . 也被 return 编辑为 0。)

做你想做的事情的一个相当通用的方法是使用时间序列运算符,这比下标更可取,因为 (1) 用间隙做正确的事情 (2) 也自动为面板工作。因此在 tssetxtset

之后
L0.numvar + L1.numvar + L2.numvar + L3.numvar 

产生当前值与前三个值之和

L0.numvar + F1.numvar + F2.numvar + F3.numvar 

产生当前值和下三个值的总和。如果缺少这些条款中的任何一项,总和也将是;解决方法是 return 说

cond(missing(L3.numvar), 0, L3.numvar) 

更通用的代码将需要某种循环。

鉴于希望遍历滞后(负)和前导(正)一些代码可能看起来像这样,给定一系列下标作为本地宏 i <= j

 * example i and j 
 local i = -3
 local j = 0 

 gen double wanted = 0 
 forval k = `i'/`j' { 
     if `k' < 0 { 
         local k1 = -(`k') 
         replace wanted = wanted + L`k1'.numvar
     } 
     else replace wanted = wanted + F`k'.numvar 
} 

或者,使用 Mata。

编辑有一个更简单的方法,使用 tssmooth ma 获得移动平均线,然后乘以项数。

  tssmooth ma wanted1=numvar, w(3 1) 
  tssmooth ma wanted2=numvar, w(0 1 3) 
  replace wanted1 = 4 * wanted1 
  replace wanted2 = 4 * wanted2 

请注意,与上述方法相反,tssmooth ma 使用每个面板开头和结尾可用的任何内容。因此,第一个移动平均值,即第一个值和前三个值的平均值,returned 作为每个面板开头的第一个值(当前三个值未知时)。