如果在egen中根据当前观察结果和群体中的其他观察结果(计算移动平均值)

时间:2015-10-10 01:54:57

标签: average stata moving-average

假设我有这样生成的数据:

clear all
set seed 100
set obs 36
egen group = seq(), from(1) to(2) block(18)
egen year = seq(), from(2000) to(2005) block(3)
egen month = seq(), from(1) to(3)
gen y = round(runiform()*10)
sort group month year
replace y = . in 3 
replace y = . in 7 
replace y = . in 11
replace y = . in 19
replace y = . in 28

我们将重点关注出于说明目的的前6个观察结果:

group   year    month   y
1       2000    1       10
1       2001    1       1
1       2002    1       
1       2003    1       9
1       2004    1       5
1       2005    1       6

我想要做的是使用egen创建移动平均值y。换句话说,取基于当前年度(包括当前年度)前3年的平均值;如果年份不在数据中,请不要使用那一年。对于2000年,移动平均值为10。我们想忽略计算中的缺失;但只能回到3年。对于与2005年相对应的行,它将是(20/3). For 2004 , it would be 5 (and not 10/3`)。

这是一些不正确的代码,试图解决这个问题。

bys group month: egen avg = mean(temp) if year>year[_n]-3 & year<=year[_n]

这会在任何地方产生缺失值。我想要做的是为每个月计算一个单独的数字,但是使用来自整个bysort组的数据,假设数据符合3年前的标准。

在我的错误代码行中,在第一个group month组中,我希望它从obs开始。 1。它应计算年份值的所有观测值的平均值大于1997且小于或等于2000。在这种情况下,这只是第一次观察。

然后进入观察2。它使用2001作为年份[_n]的值,并根据前两个观察值计算平均值,因为它们符合标准。

我试图用egen描述可能吗?这是一个普遍的问题,超出了移动平均线应用程序。

另外,如果不可能,那么下面是计算移动平均线的最佳解决方案(再一次只能回溯3年而忽略计算中的缺失)?:

sort group month year
forvalues i = 1/3 {
    bys group: gen y_`i' = y[_n-`i']
}

bys group month: egen avg = mean(y) if year>year[_n]
egen ma_3 = rowmean(y y_1 y_2 y_3)

1 个答案:

答案 0 :(得分:1)

您可以使用tsegen(来自SSC)来计算滚动时间窗口内的统计信息。我不确定我是如何理解您的观察结果的,因为您有一个月变量,但以下似乎可以满足您的需求:

clear all
set seed 100
set obs 36
egen group = seq(), from(1) to(2) block(18)
egen year = seq(), from(2000) to(2005) block(3)
egen month = seq(), from(1) to(3)
gen y = round(runiform()*10)
sort group month year
replace y = . in 3 
replace y = . in 7 
replace y = . in 11
replace y = . in 19
replace y = . in 28

* create a panel variable by grouping the group and month variable
isid group month year, sort
egen group_month = group(group month)

* declare data to be a time-series
tsset group_month year

* calculate a moving average over 3 years
tsegen avg = rowmean(L(0/2).y)