Осваиваем синтаксис
Оглавление
- Обзор методических материалов
- Учебники (можно загрузить бесплатно!)
- Основные положения (включая объяснение, почему же синтаксис так необходим)
- Список рассылки
- Упражнения
Обзор методических материалов
Учебники
Raynald Levesque является автором книги SPSS Programming and Data Management (Программирование и управление данными в SPSS). Несколько первых изданий книги выпущены корпорацией SPSS. Теперь книга выпускается IBM без соавторства Рейналя. Здесь вы найдёте её описание и содержание. Вы можете загрузить бесплатную версию издания в формате pdf, включая примеры данных и синтаксиса.
Следующие издания опубликованы учебным отделом SPSS. Стоимость каждой из них (была когда-то) 99 долларов США:
- Introduction to Syntax Using SPSS (Введение в синтаксис SPSS)
- Programming with SPSS Syntax & Macros (Программирование с использованием синтаксиса и макросов SPSS)
Я не видел первой книги и никак не могу её прокомментировать. Однако, вторую нахожу очень хорошей. Вот главы этой 154-страничной книги в пружинном переплёте:
- Глава 1: Introduction and Syntax Review (введение и обзор синтаксиса)
- Глава 2: Basic SPSS Programming Concepts (основа концепции программирования в SPSS)
- Глава 3: Complex File Types (работа с файлами сложных типов)
- Глава 4: Input Programs (программы ввода данных в редактор)
- Глава 5: Advanced Data Manipulation (сложные манипуляции данными)
- Глава 6: Introduction to Macros (введение в макросы)
- Глава 7: Advanced Macros (изощрённые макросы)
- Глава 8: Macro Tricks (макросы: небольшие хитрости)
- Упражнения
Стандартное Справочное руководство по синтаксису также является полезным источником, но его ценность возрастает с опытом и знаниями пользователя… Прочие учебники когда-то были доступны на веб-сайте SPSS. Вероятно, можно попытаться как-то получить их через IBM.
Предпосылки и принципы использования синтаксиса
Начинать своё путешествие в мир синтаксиса лучше всего с кнопки Paste, доступной в большинстве диалоговых окон графического оконного интерфейса (GUI). Насколько я себе это представляю, основная задача GUI — содействие в написании синтаксиса!
Другой вариант - отображать исполняемые инструкции в окне результатов (Output) (см. совет Ведите журнал!)
Давайте создадим наш первый синтаксис:
- Используя оконное меню, загрузите файл данных employee data.sav, который входит в комплект поставки SPSS.
- Используя меню редактора данных, выберите FILE>NEW>SYNTAX (это откроет новое окно синтаксиса)
- Проверьте лог (журнал) в окне результатов, он должен содержать запись GET FILE='C:\Program Files\SPSS\Employee data.sav'. (Разумеется, конкретные пути в вашей системе могут быть другими). Если журнал не ведётся, обратитесь к совету Ведите журнал! за инструкциями.
- Дважды щёлкните мышью на записи журнала в окне результатов (в правой части этого окна), скопируйте в буфер обмена команду
GET FILE
. - Вставьте её в редактор синтаксиса.
- Выберите меню ANALYZE>DESCRIPTIVE>FREQUENCIES, поместите переменную jobcat в список Variable(s).
- Щёлкните на кнопку Paste. Соответствующая команда появится в окне синтаксиса.
- Сохраните файл синтаксиса (используя меню окна синтаксиса): FILE>SAVE (или используйте сочетание клавиш Ctrl-S)
Для подробного описания того, как пользоваться окном синтаксиса, журналом SPSS, записываемым в отдельный файл и выводимым в окно результатов, см. страницу Syntax Editor Window на веб-сайте Центрального университета Мичигана
Вот содержание того файла, который мы только что сделали:
GET FILE='C:\program files\spss\employee data.sav'. FREQUENCIES VARIABLES=jobcat /ORDER= ANALYSIS.
Полезность синтаксиса сложно переоценить. Чем больше вы используете SPSS, тем чаще синтаксис будет заменять работу с меню.
Допустим, некая Мария Геннадьевна копается с меню чтобы осуществить кое-какие преобразования с данными по объёмам продаж, добавить метки переменных и значений и произвести примерно 50 различных процедур обработки. После того, как она закончит с этой работой, сценарии развития ситуации могут быть такими, например:
a) Начальник Марии Геннадьевны сочтёт результаты столь интересными, что…
- попросит проделать такой же анализ, но по отдельным филиалам
- прикажет отныне проводить такой анализ еженедельно
b) данные по продажам за некоторые периоды были пропущены (или неправильно введены), и теперь надо переделать анализ.
Если все свои операции до этого Мария Геннадьевна сохранила в файле синтаксиса, ей потребуется на переделку примерно 2-3% от того времени, которое она затратила бы, переделывая анализ «вручную» (пользуясь меню). Очевидно, таким образом, что синтаксис ведёт к громадному увеличению производительности и экономии времени.
Даже если Мария Геннадьевна и не сохранила всё в файл синтаксиса, она может этот синтаксис восстановить из отдельно ведущегося файла журнала. См страницу Syntax Editor Window на веб-сайте Центрального университета Мичигана, если не знаете, как это сделать.
Прочие преимущества использования файлов синтаксиса:
- документирование (синтаксис сам собой говорит, что было сделано, каким путём вы добились тех или иных результатов)
- воспроизводимость результатов (это следствие предыдущего: попробуйте переделать час работы через меню!)
- пакетная обработка (для затратных по времени и ресурсам задач синтаксис можно запустить на выполнения в то время, когда система более производительна)
- открывает дверь в мир макросов (ведь для работы с макросами надо сначала познакомиться с синтаксисом)
- позволяет пользоваться всеми возможностями SPSS (некоторые возможности доступны только через синтаксис)
- эффективный метод коммуникации в профессиональном сообществе (В списке рассылки SPSSX-L и новостных группах синтаксис используется как в вопросах, так и в ответах. Ответы в виде синтаксиса понятны людям, использующим локализованные версии SPSS).
Список рассылки SPSSX-L
Разумеется, хороший способ изучения синтаксиса — посмотреть на уже готовые решения. Просматривайте их, даже если они не кажутся вам полезными в настоящее время.
Упражнения
Манипуляция строками (см. также Поэлементный разбор и маркировка данных)
Разберём здесь синтаксис Упражнение по преобразованию строк.SPS. Выполним последовательно следующие операции:
- Удалим незначащие головные нули (или любые другие символы)
- Заменим точки на запятые (или любой символ "x" на символ "y")
- Удалим "/" и всё, что левее. (или любые другие… понимаете, о чём я?)
- Удалим"/" и всё, что правее
- Объединим строки str1 и str2
* Упражнение по преобразованию строк. * Замена / удаление определённых символов в строках, объединение строк. * Raynald Levesque.
Сначала создадим пример набора данных.
DATA LIST FIXED /name 1-25 (A). BEGIN DATA 000John Doe /10.14.12 0Mary Poppins /17.21 Billy Joe /21.25 000000Peter Pan /10.35 END DATA. LIST.
При выполнении команды DATA LIST
SPSS сообщает, что:
Data List will read 1 records from the command file
Это означает, что команда DATA LIST
будет понимать следующее за ней содержание в файле синтаксиса (набор данных между командами BEGIN DATA...END DATA
) как наблюдения, состоящие из одной записи (одной строчки). Можно для себя отметить, что вообще-то команда DATA LIST может читать и более сложные структуры данных, например, состоящие из нескольких записей/строк на одно наблюдение.
Система также выводит информацию о координатах начала и окончания данных, относимых к каждой из читаемых переменных:
Variable Rec Start End Format
name 1 1 25 A25
Результат выполнения команды LIST
:
name 000John Doe /10.14.12 0Mary Poppins /17.21 Billy Joe /21.25 000000Peter Pan /10.35 Number of cases read: 4 Number of cases listed: 4
Определим имена и метки переменных, которые будут содержать «исправленные» строки:
STRING name1 TO name4 (A25). VARIABLE LABELS name 'Исходное значение' name1 'Без головных нулей' name2 'Замена . на ,' name3 'Удалено все до "/" включительно' name4 'Удалено все после "/" включительно'.
1. Удаляем ведущие нули
COMPUTE name1=LTRIM(name,"0"). LIST name name1.
name name1 000John Doe /10.14.12 John Doe /10.14.12 0Mary Poppins /17.21 Mary Poppins /17.21 Billy Joe /21.25 Billy Joe /21.25 000000Peter Pan /10.35 Peter Pan /10.35 Number of cases read: 4 Number of cases listed: 4
2. Заменим точки "." на запятые ","
Цикл LOOP
позволяет, оставаясь на текущем наблюдении, необходимое число раз проверить наличие оставшихся точек в строке, заменяя очередную найденную точку на запятую. Цикл прекращается после того, как функция INDEX
не найдет больше точек в строке. После этого SPSS переходит к обработке следующего наблюдения. Знак «-» обеспечивает работоспособность кода в случае использования команды INCLUDE
.
COMPUTE name2=name1. LOOP IF INDEX(name2,".")>0. - COMPUTE SUBSTR(name2,INDEX(name2,"."),1)=",". END LOOP. LIST name1 name2.
name1 name2 John Doe /10.14.12 John Doe /10,14,12 Mary Poppins /17.21 Mary Poppins /17,21 Billy Joe /21.25 Billy Joe /21,25 Peter Pan /10.35 Peter Pan /10,35 Number of cases read: 4 Number of cases listed: 4
Это выглядит довольно просто. Три строчки кода и все точки (или другие символы) заменены. Но захотите ли вы использовать такое же решение для замены точек в 400 переменных? См. решение в Упражнениях по макросам.
3. Удаляем «/» и всё, что левее
COMPUTE name3=SUBSTR(name1,INDEX(name1,"/")+1). LIST name1 name3.
name1 name3 John Doe /10.14.12 10.14.12 Mary Poppins /17.21 17.21 Billy Joe /21.25 21.25 Peter Pan /10.35 10.35 Number of cases read: 4 Number of cases listed: 4
4. Удаляем «/» и всё, что правее
COMPUTE name4=SUBSTR(name1,1,INDEX(name1,"/")-1). LIST name1 name4.
name1 name4 John Doe /10.14.12 John Doe Mary Poppins /17.21 Mary Poppins Billy Joe /21.25 Billy Joe Peter Pan /10.35 Peter Pan Number of cases read: 4 Number of cases listed: 4
5. Объединяем строки str1 и str2
STRING str1 str2 str3 str4 (A2). COMPUTE str1="A". COMPUTE str2="B".
Обратите внимание, это бы НЕ сработало:
COMPUTE str3=CONCAT(str1,str2).
Это бы не сработало, поскольку, фактически, str1 равно A с пробелом справа. Аналогично, str2 равна B с пробелом справа.
Поэтому CONCAT(str1, str2)
даст строку из 4 символов «A B », которая усечётся до 2 символов«A » чтобы «влезть» в двухсимвольный формат переменной str3, заданный выше.
А это БУДЕТ работать:
COMPUTE str4=CONCAT(RTRIM(str1),str2). LIST str1 str2 str3 str4.
str1 str2 str3 str4 A B A AB A B A AB A B A AB A B A AB Number of cases read: 4 Number of cases listed: 4
Упражнения на работу с датами, временем и возрастом
Последовательно проделаем следующие манипуляции:
- Создаём переменную формата даты из числовой, такой как 19901204 (см. п. 6 для обратной операции)
- Создаём переменную формата даты из 3 числовых переменных, содержащих день, месяц и год
- Переводим строчную переменную в формат даты (см. также п. 7)
- Рассчитываем возраст
- Наращиваем дату на 1 день
- Создаём числовую переменную, такую как 19901204, из даты
- Создаём строковую переменную, такую как 19901204, из даты
NB! Цель этих примеров — помочь вам понять, как это всё делается, а не написать наиболее короткий и «красивый» код.
1. Создаём переменную формата даты из числовой, такой как 19901204
DATA LIST LIST /date1. BEGIN DATA 19901204 20000131 END DATA. LIST. COMPUTE day1=MOD(date1,100). COMPUTE month1=MOD(TRUNC(date1/100),100). COMPUTE year1=TRUNC(date1/10000). COMPUTE date2=DATE.DMY(day1,month1,year1). FORMATS date2(SDATE10). VARIABLE WIDTH date2(11). EXECUTE.
2. Создаём переменную формата даты из 3 числовых переменных, содержащих день, месяц и год
DATA LIST LIST /year1 month1 day1. BEGIN DATA 1999 12 07 2000 10 18 2000 07 10 2001 02 02 END DATA. LIST. COMPUTE mydate=DATE.DMY(day1,month1,year1). FORMATS mydate(DATE11). VARIABLE WIDTH mydate(11). EXECUTE.
Для разнообразия приведём пример другого формата даты:
COMPUTE mydate2=mydate. FORMATS mydate2(ADATE11). VARIABLE WIDTH mydate2(11). EXECUTE.
3. Переводим строчную переменную в формат даты
DATA LIST LIST /datestr(A10). BEGIN DATA 11/26/1966 01/15/1981 END DATA. LIST.
Метод 1 (общий)
COMPUTE mth=NUMBER(SUBSTR(datestr,1,2),F8.0). COMPUTE day=NUMBER(SUBSTR(datestr,4,2),F8.0). COMPUTE yr=NUMBER(SUBSTR(datestr,7),F8.0). COMPUTE mydate=DATE.DMY(day,mth,yr). FORMAT mydate(SDATE11). VARIABLE WIDTH mydate (11). EXECUTE.
Дата в заданной выше переменной записана в виде mm/dd/yyyy (мм/дд/гггг). Этот код будет работать и в случае, если исходный формат будет mm.dd.yyyy или mm-dd-yyyy. Но не составляет труда сделать определённые модификации, чтобы конвертировать и из таких форматов, как yyyy/mm/dd, dd/mm/yyyy.
Метод 2
Он сработает лишь если формат записи даты в строчной переменной соответствует формату даты в SPSS. Тогда мы просто преобразовываем с помощью функции Number
.
COMPUTE mydate=NUMBER(datestr,ADATE10). FORMATS mydate(ADATE10). VARIABLE WIDTH mydate(10).
Цель последней команды отобразить все 4 цифры года в окне редактора данных.
EXECUTE.
4. Рассчитываем возраст
Переменные даты содержат число секунд, прошедших с 14 октября 1582 год. (Эта «странная» дата означает начало григорианского календаря). Внутреннее значение переменной даты одно и то же, независимо от того, какой формат её отображения используется. Например, для переменной, содержащей дату 26.11.1966:
внутр. знач. формат что на экране 12121574400 ADATE11 11/26/1966 12121574400 SDATE11 1966/11/26 12121574400 MOYR8 NOV 1966 12121574400 WKYR8 48 WK 66
Поэтому команда
COMPUTE agesec=DATE.DMY(1,7,2001) - dtbirth.
подсчитает количество секунд между датой рождения (dtbirth) и 1 июля 2001 года.
Чтобы пересчитать это количество в целые года и часть года, разделим это на количество секунд в году:
COMPUTE age1=agesec/(365.25*24*60*60).
Лучшим способом будет сначала конвертировать возраст в дни, а затем разделить их на 365.25:
COMPUTE age2=CTIME.DAYS(DATE.DMY(1,1,2001) - dtbirth)/365.25.
Если вам нужна категориальная переменная (скажем, agegr), такая, что agegr равно 0, если возраст попадает в интервал 0- 4.99, 1, если возраст между 5 и 9.99, и т.д., то делайте следующее:
COMPUTE agegr=TRUNC(age2/5). VALUE LABELS agegr 0 '0-4.99' 1 '5-9.99' 2 '10-14.99'.
(Более общий метод можно посмотреть здесь: Группировка данных и создание соответствующих меток.SPS).
5. Наращиваем дату на 1 день
COMPUTE date1=date1 + 60*60*24.
6. Создаём числовую переменную, такую как 19901204, из даты
COMPUTE numb1=XDATE.YEAR(date1)*10000 + XDATE.MONTH(date1)*100 + XDATE.MDAY(date1).
7. Создаём строковую переменную, такую как 19901204, из даты
* (продолжение примера 6). STRING str1(A8). COMPUTE str1=STRING(numb1,F8.0).
Конвертация (преобразование) строчных переменных в числовые
Следующие ниже примеры взяты из этого файла синтаксиса.
Обобщение этих подходов см. в Мастер-классе по макросам SPSS.
*Пример 1. DATA LIST FIXED /mydata 1-10 (A). BEGIN DATA 6,188 400 12,125.25 END DATA. LIST. COMPUTE nb=NUMBER(mydata,COMMA10). LIST. * Пример 2. DATA LIST FIXED /mydata 1-10 (A). BEGIN DATA 6188 400 12125.25 END DATA. LIST. COMPUTE nb=NUMBER(mydata,F10). LIST. * Пример 3. DATA LIST FIXED /mydata 1-10 (A). BEGIN DATA 6.188 400 12.125,25 END DATA. LIST. COMPUTE nb=NUMBER(mydata,DOT10). LIST. * Пример 4. DATA LIST FIXED /mydata 1-10 (A). BEGIN DATA $6,188 $400 $12,125.25 END DATA. LIST. COMPUTE nb=NUMBER(mydata,DOLLAR10). LIST. * Пример 5. DATA LIST FIXED /mydata 1-10 (A). BEGIN DATA 6.188% 400% 12.12525% END DATA. LIST. COMPUTE nb=NUMBER(mydata,PCT10). LIST. FORMATS nb(PCT10.5). LIST.
...