在forvalues循环中获取未知函数mean()

时间:2013-09-24 01:00:01

标签: stata

为此获取未知函数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 = 
}

1 个答案:

答案 0 :(得分: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

  7. 如果窗口很短,可以使用时间序列运算符

    tsset current_qtr 
    gen edu_mov_avg = (L2.higra + L1.higra + higra + F1.higra + F2.higra) / 5 
    

    这并不完全相同,因为前两个观察和最后两个观察将返回缺失。

    如果您的数据是面板数据,则您的代码可能需要进一步处理。但是,只要您声明面板标识符,例如时间序列运算符方法仍然很容易。

    tsset panelid current_qtr 
    

    之后generate来电与上述相同。

    所有这一切,rolling提供了这种计算的框架。