#stata
#stata
Вопрос:
Цель: выполнить вычисления скользящего окна для панельных данных в Stata с переменными PanelVar
, TimeVar
, и Var1
, где окно может изменяться в цикле при разных размерах окна.
Проблема: нет доступа к SSC для пакетов, которые позаботились бы об этом (например rangestat
)
Я знаю, что
by PanelVar: gen Var1_1 = Var1[_n]
создает копию Var1
in Var1_1
. Поэтому я подумал, что имеет смысл попробовать
by PanelVar: gen Var1SumLag = sum(Var1[(_n-3)/_n])
для создания вычисления скользящего окна для _n-3
to _n
для всей переменной. Но он не дает желаемых результатов, он просто выдает нули.
Вы могли бы использовать sum(Var1) - sum(Var1[_n-3])
, но я также хочу иметь возможность выравнивать скользящее окно по левому краю (суммируя будущие наблюдения), а также по правому краю (суммируя прошлые наблюдения).
По сути, я хотел бы воспроизвести функциональность Python « .rolling().agg()
«.
Ответ №1:
В Stata _n
— индекс текущего наблюдения. Выражение (_n - 3) / _n
выдает -2, когда _n
равно 1, и медленно увеличивается _n
, но всегда меньше 1. В качестве нижнего индекса, применяемого для извлечения значений из наблюдений переменной, он всегда выдает пропущенные значения, учитывая дополнительное правило, согласно которому Stata округляет предоставленные таким образом выражения в меньшую сторону. Следовательно, оно уменьшается до -2, -1 или 0: в каждом случае оно дает пропущенные значения при задании в виде нижнего индекса. Эксперимент покажет вам, что при любой числовой переменной, скажем numvar
, ссылки на numvar[-2]
или numvar[-1]
или numvar[0]
все дают пропущенные значения. В противном случае вы, похоже, надеетесь, что the /
выдает набор индексов, которые возвращают последовательность, которую вы можете суммировать, но это далеко от того, что Stata будет делать в этом контексте: /
просто интерпретируется как деление. (Текущая сумма пропусков всегда возвращается как 0, что является выражением пропусков, игнорируемых в этом вычислении: так же, как 2 3 . 4 возвращается как 9, так и . . . . возвращается как 0.)
Довольно общий способ сделать то, что вы хотите, — это использовать операторы временных рядов, и это сильно предпочтительнее нижних индексов, поскольку (1) делает правильные вещи с пробелами (2) автоматически работает и для панелей. Таким образом, после tsset
или xtset
L0.numvar L1.numvar L2.numvar L3.numvar
выдает сумму текущего значения и трех предыдущих и
L0.numvar F1.numvar F2.numvar F3.numvar
выдает сумму текущего значения и трех следующих. Если какой-либо из этих терминов отсутствует, сумма тоже будет; обходной путь для этого — вернуть say
cond(missing(L3.numvar), 0, L3.numvar)
Для более общего кода потребуется какой-то цикл.
Учитывая желание перебирать задержки (отрицательные) и лиды (положительные), некоторый код может выглядеть следующим образом, учитывая диапазон индексов в качестве локальных макросов i
<= j
* example i and j
local i = -3
local j = 0
gen double wanted = 0
forval k = `i'/`j' {
if `k' < 0 {
local k1 = -(`k')
replace wanted = wanted L`k1'.numvar
}
else replace wanted = wanted F`k'.numvar
}
В качестве альтернативы можно использовать Mata.
РЕДАКТИРОВАТЬ Есть более простой метод, который можно использовать tssmooth ma
для получения скользящих средних, а затем умножить на количество терминов.
tssmooth ma wanted1=numvar, w(3 1)
tssmooth ma wanted2=numvar, w(0 1 3)
replace wanted1 = 4 * wanted1
replace wanted2 = 4 * wanted2
Обратите внимание, что в отличие от описанного выше метода tssmooth ma
используется все, что доступно в начале и в конце каждой панели. Итак, первое скользящее среднее, среднее значение первого значения и трех предыдущих, возвращается только как первое значение в начале каждой панели (когда три предыдущих значения неизвестны).
Комментарии:
1. Изначально я хотел использовать операторы временных рядов, но понятия не имел, как сделать их динамическими в цикле, нотация L’k’ делает именно то, что мне нужно. Исходя из Python и только начинаю изучать STATA.
2. Хорошо, но, пожалуйста, обратите внимание — как и в моем автоматическом редактировании — что стандартное написание — Stata . Подробнее на statalist.org/forums/forum/general-stata-discussion/general /… и statalist.org/forums/help#spelling
3. Должным образом отмечено, я не придал этому особого значения.
4. Как бы вы взяли максимум скользящего окна, используя эти операторы временных рядов? Я еще не понял этого.
5.
max(numvar, L1.numvar, L2.numvar)
иллюстрирует технику.