Эта структура данных совершенно непригодна для цели. Предполагая, что идентификатор id
вам нужен reshape
, например.
reshape long v, i(id) j(year)
tsset id year
Тогда скользящее среднее легко. Используйте tssmooth
или просто generate
, например.
gen mave = (L.v + v + F.v)/3
или (лучше)
gen mave = 0.25 * L.v + 0.5 * v + 0.25 * F.v
Подробнее о том, почему ваша структура данных весьма негодным: Мало того, что расчет средней скользящей необходимости петлю (не обязательно с участием egen
), но вы бы создавая несколько новых дополнительных переменных. Использование тех, кто в любом последующем анализе, будет где-то между неудобным и невозможным.
EDIT Я дам образец цикла, не двигаясь с моей позиции, что это плохая техника. Я не вижу причин, лежащих в основе вашего соглашения об именах, в соответствии с которым P1947
является средним значением для 1943-1945 годов; Я предполагаю, что это просто опечатка. Предположим, что у нас есть данные за 1913-2012. В течение трех лет мы теряем один год на каждом конце.
forval j = 1914/2011 {
local i = `j' - 1
local k = `j' + 1
gen P`j' = (v`i' + v`j' + v`k')/3
}
Это можно было бы написать более кратко, за счет шквала макросов внутри макросов. Использование неравных весов легко, как указано выше. Единственная причина для использования egen
заключается в том, что он не сдаётся, если есть пропуски, которые будут выполнены выше.
ДАЛЕЕ EDIT
По сути полноты, обратите внимание, что легко обрабатывать missings, не прибегая к egen
.
Числитель
(v`i' + v`j' + v`k')
обобщается на
(cond(missing(v`i'), 0, v`i') + cond(missing(v`j'), 0, v`j') + cond(missing(v`k'), 0, v`k')
и знаменателе
3
обобщается на
!missing(v`i') + !missing(v`j') + !missing(v`k')
Если все значения отсутствуют, это уменьшится до 0/0 или отсутствует. В противном случае, если какое-либо значение отсутствует, мы добавим 0 к числителю и 0 в знаменатель, который совпадает с игнорированием.Естественно, что код допустим, как указано выше, для средних значений 3 года, но либо для этого случая, либо для усреднения в течение более лет мы заменили бы строки выше циклом, что и делает egen
.
Это Stata. Это уже было указано на вас. –
Обратите внимание, что 'rmean()' работает для 'egen', но не был зарегистрирован как из Stata 9 и далее. Задокументированное имя функции 'egen' -' rowmean() '. –