2013-11-25 2 views
-1

У меня есть набор данных панели, для которого я хотел бы рассчитать скользящие средние за многие годы.Скользящее среднее по переменным в Stata

Каждый год является переменной, для которой существует наблюдение за каждым состоянием, и я хотел бы создать новую переменную для среднего значения каждые три года. Например:

P1947=rmean(v1943 v1944 v1945), P1947=rmean(v1944 v1945 v1946) 

Я полагал, что я должен использовать foreach цикл с командой egen, но я не уверен, о том, как я должен относиться к различным переменным внутри цикла.

Буду признателен за любые рекомендации!

+0

Это Stata. Это уже было указано на вас. –

+1

Обратите внимание, что 'rmean()' работает для 'egen', но не был зарегистрирован как из Stata 9 и далее. Задокументированное имя функции 'egen' -' rowmean() '. –

ответ

1

Эта структура данных совершенно непригодна для цели. Предполагая, что идентификатор 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.

0

Существует пользовательская программа, которая может сделать это очень легко для вас. Это называется mvsumm и может быть найден через findit mvsumm

xtset id time 
mvsumm observations, stat(mean) win(t) gen(new_variable) end 
+0

'mvsumm' принимает единственную переменную ответа, так что она применима только к данным панели, хранящимся в виде длинной структуры. Основной вопрос здесь заключается в том, что ОП имеет широкую структуру данных. Этот ответ правильный для данных ОП только после изменения, как подробно объяснено в моем ответе. –

+0

Я наблюдал за тем, что данные панели широки. Ник, конечно, прав в своем ответе. – user3025970