1

为此获得未知功能mean。不能使用egen,因为它必须为每个值计算。有点困惑。

edu_mov_avg=.
forvalues current_year =  2/133 {
    local current_mean = mean(higra) if longitbirthqtr >= current_year - 2  & longitbirthqtr >= current_year + 2
    replace edu_mov_avg = current_mean if longitbirthqtr = 
}
4

1 回答 1

3

你的代码离工作还有很长的路要走。这应该更接近。

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' 
}
  1. 您需要使用命令generate来生成新变量。

  2. 您需要用引号引用本地宏值。

  3. egen有自己的mean()功能,但它会产生一个变量,而这里需要一个常量。使用summarize, meanonly是最有效的方法。在 Stata 中没有mean()可以在任何地方应用的功能。一旦使用summarize,就无需使用本地宏来保存其结果。这里r(mean)可以直接使用。

  4. 你有>=两次,但大概不是那个意思。使用inrange()在编写您的条件时不是必需的,但可以提供更短的代码。

  5. 您不能像以前那样使用if限定符来限定local宏的分配。它们对 Stata 毫无意义,因为这样的宏是常量。

  6. 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为此类计算提供了一个框架。

于 2013-09-24T01:27:35.423 回答