2015-10-10 3 views
0

Предположим, у меня есть данные, полученные этим:если заявление в Эгена на основе текущего наблюдения и других наблюдений в группе (для расчета скользящего среднего)

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, было бы 10/3`).

Вот некорректный код, чтобы попытаться это понять.

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

Это приводит к отсутствию значений во всем мире. То, что я пытаюсь сделать, - вычислить отдельный номер за каждый месяц, но использовать эти данные из всей группы bysort, считая, что данные соответствуют критериям того, чтобы быть 3 года назад.

В моей строке неправильного кода, в первой группе group month, я хочу, чтобы она начиналась с обс. 1. Он должен вычислять среднее значение для всех наблюдений в значении года больше 1997 и меньше или равно 2000. В этом случае это только первое наблюдение.

Затем оно идет к наблюдению 2. Он использует 2001 для значений года [_n] и вычисляет среднее значение, основанное на первых двух наблюдениях, потому что это те, которые соответствуют критериям.

Является ли то, что я пытаюсь описать, используя egen? Это общий вопрос, который выходит за рамки приложения скользящей средней.

Кроме того, если это не представляется возможным, то следующее лучшее решение для расчета скользящего среднего (опять же только собирается назад 3 года и игнорируя missings в расчете) ?:

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

Быстрый совет: С 'помощью egen', у нас есть«Явная индексирование (используя _N и _n), который обычно используется с 'generate', не должен использоваться с' egen'. –

ответ

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) 
+0

Отлично работает! Небольшая точка, но в соответствии с моим описанием (где я хочу взять скользящее среднее значение за этот год и предыдущие 3 года), я думаю, что последняя строка кода должна быть 'tsegen avg = rowmean (L (0/3) .y) 'вместо' tsegen avg = rowmean (L (0/2) .y) ' – bill999