Предположим, у меня есть данные, полученные этим:если заявление в Эгена на основе текущего наблюдения и других наблюдений в группе (для расчета скользящего среднего)
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)
Быстрый совет: С 'помощью egen', у нас есть«Явная индексирование (используя _N и _n), который обычно используется с 'generate', не должен использоваться с' egen'. –