为此获取未知函数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 =
}
答案 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'
}
您需要使用命令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
提供了这种计算的框架。