Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Статистика в SPSS: за пределами кнопочного интерфейса. Выпуск 8


Статистика в SPSS: за пределами кнопочного интерфейса. Выпуск 8

В рассылке используются материалы веб-сайта www.spsstools.ru

Содержание выпуска

Переменный сдвиг в функциях LAG и LEAD

Новое на сайте www.spsstools.ru


Здравствуйте, уважаемые подписчики,

Переменный сдвиг в функциях LAG и LEAD

Мы продолжаем начатый в предыдущем выпуске разговор об использовании функций LAG и LEAD, задача которых состоит в вычислении новых переменных, которые получаются сдвигом исходной по вертикали на n строк вниз (запаздывающий сдвиг, функция LAG) или вверх (опережающий сдвиг, функция LEAD).

Важное замечание к предыдущему выпуску. При осуществлении сдвигов не происходит добавление новых наблюдений в конец или в начало файла. Например, при сдвиге переменной на одно наблюдение вниз, последнее значение переменной не образует новое наблюдение, а просто удаляется. Вместе с этим образуется пропуск вначале файла, так как для первого наблюдения новой переменной очевидно отсутствуют данные о "нулевом" наблюдении исходной переменной.

 

Ранее мы рассмотрели, как работают функции LAG и LEAD и указали на неприятную особенность их реализации, заключающуюся в невозможности указания в качестве аргументов сдвига значения из другой переменной. Тем не менее, иногда возникает потребность такого "индивидуального" подхода к каждому сдвигаемому значению. Так, например, наблюдения могут быть разделены по группам и пронумерованы внутри групп. При этом нас интересует сопоставление значения переменной в каждом наблюдении со значением той же переменной из первого наблюдения группы. В этом случае порядковый номер наблюдения в группе может быть использован как основа для возвращения значения первого наблюдения.

В коллекции Рейналя имеется синтаксис, написанный самим автором (Raynald Levesque): http://www.spsstools.ru/Syntax/Unclassified/Find_LAG_VAR1_VAR2.txt. Синтаксис позволяет выполнять переменный сдвиг с функцией LAG. Рассмотрим его.

Для начала автор предлагает пример данных:

 

DATA LIST FREE / LGX Y.

BEGIN DATA
1 5 2 6 1 4 3 3 1 2 3 5 2 3 1 3 3 2 2 2 3 4 2 5 1 6 3 7 2 5 1 4
3 3 2 3 1 6 3 7 2 5 3 3 2 5 1 3 3 2 2 1 3 6 2 8 2 7 2 5 2 3 2 9

END DATA.

SAVE OUTFILE='c:\temp\mydata.sav'.

 

Команда DATA LIST определяет 2 переменные, LGX и Y. По замыслу, значения переменной Y будут сдвигаться, а значения LGX должны указывать, на какое число наблюдений необходимо осуществлять сдвиг. Данные приводятся в "свободном" (FREE) формате, где программа читает все приведённые значения между BEGIN DATA и END DATA последовательно в одну и другую переменную, переходя к следующему наблюдению по мере заполнения предыдущего.

После определения данных, команда SAVE сохраняет их во временный файл данных для возможных последующих манипуляций.

Команда сдвига COMPUTE lagg=LAG(x,lgx) вернула бы ошибку. Автор предлагает следующий вариант решения проблемы, если нам известен минимум и максимум переменной lgx:

 

DO REPEAT cnt=1 TO 20.

IF lgx=cnt lagg=lag(y,cnt).

END REPEAT.

EXE.

 

Предположим, что lgx может изменяться от 1 до 20. Командами DO REPEAT - END REPEAT задаётся цикл, который при исполнении синтаксиса формирует последовательность команд из тела цикла, подменяя каждый раз аргумент cnt текущим значением этого индекса. Обычно конструкция DO REPEAT используется, если нам необходимо произвести одинаковые преобразования с несколькими переменными. В этом случае до и после ключевого слова TO указываются начальная и конечная переменные интервала, который будет подвергнут трансформации (либо просто задаётся перечень этих переменных). DO REPEAT позволяет также создавать новые последовательные переменные, наподобие команды VECTOR. Однако, как указано в спецификации к этой команде, индекс может принимать также и строковые, и числовые значения. Последним обстоятельством мы и пользуемся в данном случае. В результате SPSS выполнит 20 команд условных вычислений:

 

IF lgx=1 lagg=lag(y,1).

IF lgx=2 lagg=lag(y,2).

...

IF lgx=20 lagg=lag(y,20).

 

Команды запускаются на исполнение инструкцией EXE (EXECUTE). Ясно, что если в самом деле все значения lgx находятся в интервале от 1 до 20, то для каждого наблюдения найдётся "своя" инструкция из этого перечня, и будет вычислен соответствующий лаг.

Автор предлагает и обобщённый вариант данного синтаксиса, который можно использовать в том случае, если мы не знаем минимума и максимума лаговой переменной (и, как следствие, не можем указать минимальное и максимальное значение индекса cnt в цикле DO REPEAT). Обычно, впрочем, узнать эти пределы не очень сложно, но если осуществление переменного сдвига требуется в середине большого набора трансформаций, с только что созданным "на лету" файлом данных, рамки индекса действительно могут быть неизвестны.

Второй вариант принципиально ничем не отличается от первого. Разница состоит лишь в том, что вначале мы используем функцию AGGREGATE для вычисления минимального и максимального значений, затем считываем эти значения и помещаем их в создаваемый "на лету" файл синтаксиса, после чего загружаем исходные данные и исполняем только что созданный, ещё тёпленький синтаксис. Здесь нам, вне зависимости от темы выпуска, должна быть интересна команда WRITE сама по себе, как открывающая принципиально новую возможность построения самоизменяющихся командных файлов и просто текстовых файлов с произвольным содержанием.

 

GET FILE='c:\temp\mydata.sav'.

COMPUTE dummy=1.

AGGREGATE
/OUTFILE=*
/BREAK=dummy
/lagmin = MIN(lgx) /lagmax = MAX(lgx).

 

Командой GET мы загружаем исходные данные. Подсчёт переменной dummy, равной единице для всех наблюдений (команда COMPUTE) необходим для последующей команды AGGREGATE, которая ориентирована на работу с подгруппами наблюдений (опция BREAK). Суть переменной dummy - указать команде AGGREGATE, что в данном случае все данные представляют собой одну группу и, следовательно, характеризуются одним минимальным и одним максимальным значением. Команда AGGREGATE, фактически, ориентирована на выполнение простых статистических вычислений, но с выводом итогов не в окно результатов SPSS, а в файл данных. Поэтому имеется принципиальная возможность записи результатов во внешний файл (опция OUTFILE). В данном случае, указав здесь звёздочку "*" мы сказали программе, что текущий файл необходимо закрыть и открыть новый файл, куда и записать результаты. Команда AGGREGATE в данном случае вычисляет очень простую статистику: для каждой группы, определяемой переменной dummy, она находи минимальное значение переменной lgx (и сохраняет его в переменной lagmin) и максимальное значение той же переменной, сохраняя его, соответственно, в lagmax.

Результирующий файл будет состоять из одного наблюдения (какого именно - можно легко увидеть, выполняя синтаксис по шагам, команда за командой). Как следствие, следующая команда WRITE запишет во внешний файл temp.sps один экземпляр той текстовой выдачи, которая указана в опциях WRITE (если бы файл данных содержал несколько наблюдений, текстовая выдача повторилась бы для каждого из них). Текстовая выдача, как видно, разбита на 3 строчки и содержит "постоянную" часть (заключённую в одинарные кавычки) и переменную часть, в частности - значения переменных lagmin и lagmax.

В результате в файле temp.sps оказывается записана последовательность команд, аналогичная той, которую мы наблюдали в первом варианте синтаксиса.

 

WRITE OUTFILE='c:\temp\temp.sps' /'DO REPEAT cnt='lagmin' TO 'lagmax'.'
/'IF lgx=cnt lagg=lag(y,cnt).'
/'END REPEAT.'.

EXECUTE.

 

Теперь остаётся только подгрузить исходные данные (вспомним, что они были закрыты и в редакторе данных теперь находятся агрегированные результаты!), а затем - подключить (вызвать) на исполнение свежий синтаксис temp.sps (команда INCLUDE). После этого запускаем отложенные вычисления (команда EXECUTE) и дело сделано. Важно, чтобы была выполнена и команда EXECUTE, которая стоит выше, между WRITE и GET. Команда GET, открывая новый файл данных, отменит все незавершённые трансформации, в результате чего нужный нам файл синтаксиса не будет записан, если до этого принудительно не произвести запись с помощью EXECUTE.

 

GET FILE='c:\temp\mydata.sav'.

INCLUDE FILE='c:\temp\temp.sps'.

EXECUTE.

 

Кажется, что подход, использованный в этом синтаксисе, может быть использован и для произведения опережающих сдвигов, с помощью функции LEAD команды CREATE. Однако это не так, поскольку функция CREATE имеет важную особенность, указанную в предыдущем выпуске рассылки, а именно, безотлагательное выполнение вычислений, что делает невозможным помещение её внутрь циклов и условных конструкций вида DO IF. В этом случае можно предложить использовать описанный в том же выпуске рассылки вариант замены функции LEAD функцией LAG на предварительно отсортированных в обратном порядке данных.

 

Творческих успехов!

 

Ведущий рассылки,

Балабанов Антон

Новое на сайте www.spsstools.ru

Переведены и добавлены следующие примеры синтаксиса:

Найти LAG(var1,var2).SPS (переменный сдвиг).

 

Переведены и добавлены макросы:

Арифметика с макропеременными.SPS (отдельное спасибо: Paul Cook). Макрос демонстрирует как "традиционный" подход, основанный на строках, так и метод, основанный на циклах.

Одно странное свойство макросов.SPS (как макросы интерпретируют некоторые комбинации символов)

Макросы - просто обработчики строк.SPS (иногда можно обойтись и без макросов, полезные комментарии D. Marso: )

Выход из цикла как только выполнен критерий сходимости.SPS (полезно, если вы выполняете итерационные вычисления, каждая итерация занимает много времени и вы не знаете наперед, сколько итераций потребуется).

 

Добавлены скрипты Кирилла Орлова (компания Ri-Vita Consulting):

Генерация случайных переменных.SBS (нормальное и равномерное распределения, корреляции, округление и пропущенные значения)

Выделение значимых уровней в таблицах.SBS.

 

© См. www.spsstools.ru, 2005-2006


В избранное