Возможности макросов в SPSS удивительны!
Макрос (macro), или макрокоманда — это пользовательское выражение в языке синтаксиса SPSS, вместо которого при интерпретации синтаксиса командный процессор подставляет текст, «спрятанный» в этой макрокоманде (и принимает вставленное как полноценный фрагмент кода, готовый к исполнению). Хитрость заключается в том, что этот текст может программно генерироваться по заданному пользователем алгоритму. Фактически, во время исполнения синтаксиса SPSS получает возможность генерировать новый синтаксис, например, «размножить» один и тот же блок кода, подставив в его копии разные параметры (имена переменных и проч.), а затем — исполнить все это. Такая возможность создаёт необычайную гибкость в оформлении пользовательских процедур обработки. В каком-то смысле макросы схожи с пользовательскими функциями в процедурных языках программирования. Но если пользовательские функции оперируют данными, макросы оперируют исходным кодом программы.
Макрос для синтаксиса всё равно, что синтаксис для стандартных оконных меню (GUI): большой шаг вперёд.
Макросы способны:
- уменьшить количество строк кода на 80—90%
- значительно упростить поддержку (модификацию) кода
- ускорить разработку кода
- упростить разработку нового кода на основе существующего
- делать те вещи, которые не может делать синтаксис. Например, создавать новые переменные с новыми именами «на лету», используя !CONCAT(var,!cnt).
Если бы язык макросов ещё не существовал, SPSS следовало бы его изобрести. Постарайтесь изучить макросы! Не пожалеете.
Как только вы познакомитесь с принципами написания макросов, вы найдёте им множество применений. На данном сайте большинство примеров макросов находится в разделе Синтаксис (более 140 штук).
Если хотите приобрести хорошую книгу (IMHO
) по синтаксису и макросам, посмотрите SPSS Programming and Data Management (Программирование и управление данными в SPSS).
Если не знаете, как использовать макрос с этого сайта, посмотрите раздел на странице для новичков.
Совет: чтобы быстро находить макросы на этом сайте, добавляйте в строку поиска «!ENDDEFINE».
Перечень групп макросов
- Макросы: избранное (изящные решения)
- Макропеременные
- Самоуправляющиеся макросы
- Разное
- Утилиты
- Также посетите «Библиотеку макросов» на веб-сайте SPSS.
Мощность SPSS сложно переоценить!
Замечание: файлы со значком
добавлены или изменены менее, чем 30 дней назад.
Макросы: избранное (изящные решения)
- Задать список переменных указанием первой и последней переменной.SPS
- Переупорядочить имена «векторных» переменных.SPS (этот макрос также поясняется здесь)
- Типы переменных.sps (На входе: список переменных --> На выходе: два списка 1) строковые (string) переменные и 2) числовые (numeric) переменные.
- Ссылки на вектор переменных, элементы которого «разбросаны» по файлу данных.SPS
Макропеременные
- Добавить результаты регрессии по наблюдениям в файл данных.SPS
- Арифметика с макропеременными.SPS (отдельное спасибо: Paul Cook) Макрос демонстрирует как «традиционный» подход, основанный на строках, так и метод, основанный на циклах
- Вызывать макрос с аргументами, равными по очереди каждому значению из переменной.SPS
- Заставить макропеременную принимать значения из переменной файла данных.SPS
- Как перемножить две макропеременные.SPS
- Макросы — просто обработчики строк.SPS (полезные комментарии: D. Marso)
- Одно странное свойство макросов.SPS
- Операции с макропеременными.SPS (см. также раздел Арифметика с макропеременными)
- Попарное использование переменных из аргумента макроса.SPS
Самоуправляющиеся макросы
- Включение нескольких статистик по файлу данных в синтаксис.SPS
- Включение статистики по файлу данных в синтаксис.SPS
- Выход из цикла как только выполнен критерий сходимости.SPS Полезно, если вы выполняете итерационные вычисления, каждая итерация занимает много времени и вы не знаете наперед, сколько итераций потребуется.
Разное
- Группировка результатов по типам объектов (школа 1, школа 2 и т.д.).SPS
- Генерация переменного числа команд синтаксиса.SPS
- Вызов макроса из другого макроса.SPS
- Построение списка переменных произвольной длины для подкоманды KEEP.SPS
- Листинг (распечатка значений) в цикле.SPS (непосредственно листинг в цикле LOOP не работает)
- Передача логического выражения в качестве аргумента.SPS
Утилиты
- Определяем пути к файлам с помощью макроса.SPS (очень полезная возможность)
- Выполнить макрос для каждого уникального значения переменной.SPS
- Выполнение макроса при пустом файле данных (определение данных через матрицы).SPS (отдельное спасибо: Fernando Cartwright)
- Печать сообщений в окне результатов.SPS
- Анализ для заданных поднаборов значений переменной.SPS
- Закавычивание строк.SPS (см. пример, когда это бывает нужно)
- Запуск макроса с разными наборами параметров из файла данных.SPS
- Запуск макроса с разными наборами параметров… (пример 2).SPS
Чрезвычайно полезный для вас макрос не обязательно будет очень сложным. См. Мастер-класс по макросам для получения первичных сведений.
Полностью прокомментированный макрос
Переупорядочиваем имена векторов (этот макрос включён в группу Избранное выше)
Реорганизация имён векторных переменных в файлах данных. Это полезно, если у вас есть, скажем, векторы a1 TO a50, b1 TO b50, c1 TO c50 и вы хотите упорядочить их следующим образом: a1 b1 c1 a2 b2 c2 … a50 b50 c50.
Автор: Raynald Levesque 28.04.2001.
DATA LIST LIST /dummy.
BEGIN DATA
1
END DATA.
LIST.
* Следующие вектора расположены последовательно (т.е. сначала все "a", затем все "b", затем все "c").
NUMERIC id x y a1 TO a50 z1 b1 TO b50 z2 c1 TO c50 k.
* Скажем, хотим переупорядочить вектора как a1 b1 c1 a2 b2 c2 … a50 b50 c50.
SET MPRINT=no.
*//////////////////////.
DEFINE !reorder (id=!TOKENS(1)
/beg !TOKENS(1)
/end !TOKENS(1)
/vnames !CMDEND)
MATCH FILES FILE=* /KEEP=!id !DO !i=!beg !TO !end !DO !var !IN (!vnames) !CONCAT(!var,!i," ") !DOEND !DOEND ALL.
!ENDDEFINE.
*//////////////////////.
* Пример вызова этого макроса.
SET MPRINT=yes.
!reorder id=id beg=1 end=50 vnames=a b c.
Пояснения.
Следующий формат записи поможет понять циклы !DO – !END в команде match выше:
*!DO !i=!beg !TO !end
* !DO !var !IN (!vnames)
* !CONCAT(!var,!i," ")
* !DOEND
*!DOEND
*ALL.
Замечания:
1. ALL означает сохранить все переменные, не названные до этого.
2. Макро цикл записан в одну линию, чтобы уменьшить количество строк кода в создаваемом файле синтаксиса.
3. Обратите внимание, что макро команды не нуждаются в разделителе (точке) в конце. В частности, если точки будут вставлены после
!DO !i=!beg !TO !end
например, макрос более не будет работать! Происходит это от того, что точка принудительно завершает выполнение команды MATCH FILES.







