如何在没有 SSC 包的情况下执行滚动 window 计算
How to perform rolling window calculations without SSC packages
目标: 使用变量 PanelVar
、TimeVar
和 Var1
对 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:在每种情况下,当作为下标给出时,它都会产生缺失值。实验将向您展示给定任何数字变量,比如 numvar
对 numvar[-2]
或 numvar[-1]
或 numvar[0]
的引用都会产生缺失值。换句话说,你似乎希望 /
产生一组下标 return 一个你可以求和的序列,但这与 Stata 在这种情况下所做的事情还有很长的路要走:/
只是被解释为除法。 (运行 缺失总和总是 returned 为 0,这是在该计算中忽略缺失的表达式:就像 2 + 3 + . + 4 被 returned 一样9 所以 . + . + . + . 也被 return 编辑为 0。)
做你想做的事情的一个相当通用的方法是使用时间序列运算符,这比下标更可取,因为 (1) 用间隙做正确的事情 (2) 也自动为面板工作。因此在 tsset
或 xtset
之后
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 作为每个面板开头的第一个值(当前三个值未知时)。
目标: 使用变量 PanelVar
、TimeVar
和 Var1
对 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:在每种情况下,当作为下标给出时,它都会产生缺失值。实验将向您展示给定任何数字变量,比如 numvar
对 numvar[-2]
或 numvar[-1]
或 numvar[0]
的引用都会产生缺失值。换句话说,你似乎希望 /
产生一组下标 return 一个你可以求和的序列,但这与 Stata 在这种情况下所做的事情还有很长的路要走:/
只是被解释为除法。 (运行 缺失总和总是 returned 为 0,这是在该计算中忽略缺失的表达式:就像 2 + 3 + . + 4 被 returned 一样9 所以 . + . + . + . 也被 return 编辑为 0。)
做你想做的事情的一个相当通用的方法是使用时间序列运算符,这比下标更可取,因为 (1) 用间隙做正确的事情 (2) 也自动为面板工作。因此在 tsset
或 xtset
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 作为每个面板开头的第一个值(当前三个值未知时)。