Как выполнить вычисления скользящего окна без пакетов SSC

#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) иллюстрирует технику.