假设我有这样生成的数据:
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)
答案 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)