你的代码离工作还有很长的路要走。这应该更接近。
gen edu_mov_avg = .
qui forvalues current_qtr = 2/133 {
su higra if inrange(longitbirthqtr, `current_qtr' - 2, `current_qtr' + 2), meanonly
replace edu_mov_avg = r(mean) if longitbirthqtr == `current_qtr'
}
您需要使用命令generate
来生成新变量。
您需要用引号引用本地宏值。
egen
有自己的mean()
功能,但它会产生一个变量,而这里需要一个常量。使用summarize, meanonly
是最有效的方法。在 Stata 中没有mean()
可以在任何地方应用的功能。一旦使用summarize
,就无需使用本地宏来保存其结果。这里r(mean)
可以直接使用。
你有>=
两次,但大概不是那个意思。使用inrange()
在编写您的条件时不是必需的,但可以提供更短的代码。
您不能像以前那样使用if
限定符来限定local
宏的分配。它们对 Stata 毫无意义,因为这样的宏是常量。
longitbirthqtr
看起来像一个季度约会。因此我没有使用这个名字current_year
。
有了这么短的窗口,还有一个使用时间序列运算符的替代方法
tsset current_qtr
gen edu_mov_avg = (L2.higra + L1.higra + higra + F1.higra + F2.higra) / 5
这并不完全等价,因为前两个观测值和后两个观测值将返回缺失值。
如果您的数据是面板数据,您的代码可能需要进一步处理。但是只要您声明面板标识符,时间序列运算符方法仍然很容易,例如
tsset panelid current_qtr
之后generate
调用与上面相同。
综上所述,rolling
为此类计算提供了一个框架。