问题描述
如何在 Stata 中创建一个变量,其中包含应用于另一个变量的动态滚动窗口的最大值?滚动窗口必须能够在循环内迭代更改。
max(numvar,L1.numvar,L2.numvar)
将给我我想要的单个窗口大小,但如何在循环内迭代更改窗口大小?
我当前用于计算滚动总和的代码(归功于@Nick Cox 的算法):
generate var1lagged = 0
forval k = -2(1)2 {
if `k' < 0 {
local k1 = -(`k')
replace var1lagged = var1lagged + L`k1'.var1
}
else replace var1lagged = var1lagged + F`k'.var1
}
如何在窗口的最大值、最小值或平均值的情况下实现同样的灵活性?
解决方法
在最简单的情况下,假设 K
至少给定 1 作为窗口中的滞后数
local arg L1.numvar
forval k = 2/`K' {
local arg `arg',L`k'.numvar
}
gen wanted = max(`arg')
如果窗口包含现值,那只是一个扭曲
local arg numvar
forval k = 1/`K' {
local arg `arg',L`k'.numvar
}
gen wanted = max(`arg')
更一般地说,numvar
不是特定的变量名称,而是包含此类名称的本地宏。
编辑 1
仅当所有参数都丢失时,才会返回丢失的结果。如果你想在缺少任何参数的情况下坚持缺少结果,那么去
gen wanted = cond(missing(`arg'),.,max(`arg'))
编辑 2
更广泛地查看rolling
。否则,对于直接计算的滚动平均值,您需要计算出 (1) 问题中的总和 (2) 非缺失值的数量。
OP 的工作环境显然排除了安装社区贡献的命令;否则我会推荐 rangestat
和 rangerun
(SSC)。请注意,许多社区贡献的命令已通过 Stata Journal、GitHub 或用户站点发布。