В приложениях эконометрики и других задачах, связанных с анализом
данных, представляющих собой временные ряды, часто возникает потребность сдвигать
эти ряды относительно друг друга. Это может быть необходимо для расчёта доходностей
ценных бумаг, вычисления автокорреляций и т.д. Иногда сдвиг рядов применяется
и вне временного контекста, при сложных преобразованиях данных.
В редакторе данных SPSS сдвиг рядов относительно друг друга можно
представить как копирование исходной переменной с последующим перемещением скопированной
колонки по вертикали на n строк вниз (запаздывающий сдвиг) или вверх (опережающий
сдвиг). При таких трансформациях неизбежно образуется n пустых строк (пропущенных
наблюдений), соответственно, в первых или последних строках.
Запаздывающий сдвиг: функция LAG
Предположим, у нас есть сведения о биржевых курсах некоторой
ценной бумаги за несколько дней:
DATA LIST LIST / dat(DATE) quot.
BEGIN DATA
06.02.2006 35.36
07.02.2006 35.39
08.02.2006 35.45
09.02.2006 35.12
10.02.2006 34.95
END DATA.
Требуется рассчитать доходность (r) ценной бумаги в каждый из
дней (определим доходность как разницу курсов на сегодняшний и вчерашний день,
отнесённую к курсу за вчерашний день). Введём выражение COMPUTE с использованием
функции LAG, которая будет возвращать значение из предыдущей строки (т.е. курс
за предыдущий день):
COMPUTE r=(quot-LAG(quot))/LAG(quot).
FORMAT r (F4.3).
EXE.
Последняя команда, EXECUTE, запускает отложенные вычисления.
Форматирование переменной (команда FORMAT) потребовалось, чтобы отобразить большее
число десятичных знаков, так как значения доходностей для приведённых данных
были невелики (первые два знака после запятой - нули). Функция LAG, записанная
в таком виде, по умолчанию осуществляет сдвиг временного ряда на один момент
времени назад (или вниз, если смотреть в редакторе данных). При необходимости
можно указать сдвиг на любое неотрицательное целое число периодов: LAG (quote,
2), например, сдвинет серию на 2 периода.
Важно помнить, что функция LAG будет давать ожидаемые результаты,
если порядок следования наблюдений в файле данных не будет нарушен. Для большинства
статистических процедур (вычисление средних, корреляций, и т.д.) порядок расположения
наблюдений в файле не важен. Однако сейчас не тот случай!
Опережающий сдвиг: функция LAG
На практике обычно требуется сдвигать данные с запаздыванием
- так, чтобы в текущем наблюдении присутствовали данные за предыдущий момент
времени. Однако в некоторых случаях нас интересует сдвиг с опережением. Некоторое
время назад я не подозревал о существовании функции LEAD и сдвиг осуществлял
с помощью всё той же функции LAG: как в известном анекдоте - "Мы разворачиваемся
и ОГЛЫ"... Опережающий сдвиг с помощью функции запаздывания можно получить,
если предварительно перевернуть сами данные "задом наперёд" - отсортировать
в обратном порядке, осуществить сдвиг, а затем восстановить исходный порядок
наблюдений. Рассмотрим пример такого синтаксиса на определённых выше данных:
*x - временной ряд, запаздывающий на 2 периода.
COMPUTE x = LAG(quot,2).
*y - временной ряд, опережающий на 2 периода.
COMPUTE order = $casenum.
SORT CASES BY order (D).
COMPUTE y=LAG(quot,2).
SORT CASES BY order (A).
DELETE VARIABLES order.
Исходный порядок расположения наблюдений мы сохраняем в переменной
order (для этого используем системную динамическую переменную $casenum – номер
наблюдения в файле данных), затем сортируем данные в обратном порядке (инструкция
(D)), производим вычисления, возвращаем исходный порядок наблюдений и убираем
ненужную более переменную.
Работа с временными рядами с помощью команды CREATE: функции
LAG и LEAD
В SPSS существует функция LEAD, которая позволяет сдвигать наблюдения
вверх на заданное число моментов. Однако, она не работает в рамках команды COMPUTE.
Важность выполнения вычислений с временными рядами обусловила выделение специфических
функций (сдвиги, расчёт скользящих средних и т.д.) в отдельную команду создания
временных рядов - CREATE. В CREATE входит также и функция LAG, которая была
рассмотрена выше.
Простой вызов команды CREATE схож с правилами записи COMPUTE.
Например, запаздывающие и опережающие ряды x и y из предыдущего примера могут
быть созданы с помощью двух команд:
CREATE x = lag(quot,2).
CREATE y = lead(quot,2).
Либо с помощью записи одной команды в двух частях:
CREATE x = lag(quot,2) / y = lead(quot,2).
Однако в правилах работы CREATE есть и существенные отличия от
COMPUTE:
1) CREATE не требует вызова EXECUTE, т.е. вычисления выполняются
сразу же;
2) При одном вызове команды CREATE для создания отдельного временного
ряда (новой переменной) допускается использование лишь одной функции, без дополнительных
вычислений (т.е. вызов, например, "CREATE y=LAG(quot)+1." приведёт
к ошибке;
3) Сводную информацию о созданных временных рядах (переменных)
команда CREATE выводит в окно результатов.
4) Если в COMPUTE вызов LAG(x) означает, по умолчанию, сдвиг
на одно наблюдение, в CREATE такие умолчания у функций отсутствуют и необходимо
в явном виде указывать интервал.
4) CREATE допускает создание нескольких временных рядов, отличающихся
друг от друга количеством сдвигов исходного ряда.
Проиллюстрируем последнее положение. Создадим переменные y2-y4,
которые будут опережать переменную quot на 2-4 момента времени, соответственно:
CREATE y2 TO y4 = lead(quot, 2, 4).
В некоторых источниках можно встретить написание функций LAG и
LEAD как LAGS и LEADS. Никакой разницы в данном случае нет. В распознавании
некоторых ключевых слов, команд и функций, SPSS ориентируется на первые символы.
Таким образом, команды
COMPUTE y=LAG(quot).
и
COMP y=lagsfdrtreytrdegkjdfg(quot).
дадут аналогичные результаты. (Однако, "COMPUTEdsfdfgdfg y= lag(quot)."
вызовет ошибку, так что увлекаться перевиранием названий команд для запутывания
вероятного противника не следует).
Переменный интервал сдвига
Функции LAG и LEAD позволяют работать лишь с постоянными интервалами
сдвига, задаваемыми целыми, неотрицательными константами. В редких случаях необходимо
сдвинуть значение переменной на то число интервалов, которое указано в другой
(или этой же) переменной того же наблюдения. Попытка вызвать команду вида
COMPUTE y=lag(quot, x).
(даже при условии наличия в данных целочисленной переменной x) вызовет ошибку.
Аналогичная попытка с командой CREATE
CREATE y=lag(quot,x).
также приведёт к ошибке, но ошибке иного рода, открывающей нам ещё одну возможность
вызова этой команды. Программа определит во втором аргументе переменную x как
второй источник данных для сдвига и потребует указания в левой части равенства
второй переменной, в которую будут помещены результаты сдвига:
CREATE y1 y2 = lag(quot,x,1).
и даже так:
CREATE y1 TO y2 x1 TO x2 = lag(quot,x,1,2).
Всё это здорово, но, так или иначе, данные функции отказываются
работать с переменными сдвигами. В коллекции Рейналя мы найдём синтаксис, который
позволяет обойти это ограничение. Думаю, он будет разобран нами в следующем
выпуске.
На сегодня всё. Всего доброго!
Ведущий рассылки,
Балабанов Антон
Новое на сайте www.spsstools.ru
Переведены и добавлены следующие примеры синтаксиса:
Размещены комментарииКирилла Орлова (компания Ri-Vita
Consulting) относительно вопроса синхронного и асинхронного соисполения синтаксиса
и скриптов в SPSS.