Оглавление

 


Обзор методических материалов

Учебники

Raynald Levesque является автором книги SPSS Programming and Data Management (Программирование и управление данными в SPSS). Несколько первых изданий книги выпущены корпорацией SPSS. Теперь книга выпускается IBM без соавторства Рейналя. Здесь вы найдёте её описание и содержание. Вы можете загрузить бесплатную версию издания в формате pdf, включая примеры данных и синтаксиса. 

Следующие издания опубликованы учебным отделом SPSS. Стоимость каждой из них (была когда-то) 99 долларов США:

Я не видел первой книги и никак не могу её прокомментировать. Однако, вторую нахожу очень хорошей. Вот главы этой 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) (см. совет Ведите журнал!)

Давайте создадим наш первый синтаксис:

  1. Используя оконное меню, загрузите файл данных employee data.sav, который входит в комплект поставки SPSS.
  2. Используя меню редактора данных, выберите FILE>NEW>SYNTAX (это откроет новое окно синтаксиса)
  3. Проверьте лог (журнал) в окне результатов, он должен содержать запись GET FILE='C:\Program Files\SPSS\Employee data.sav'. (Разумеется, конкретные пути в вашей системе могут быть другими). Если журнал не ведётся, обратитесь к совету Ведите журнал! за инструкциями.
  4. Дважды щёлкните мышью на записи журнала в окне результатов (в правой части этого окна), скопируйте в буфер обмена команду GET FILE.
  5. Вставьте её в редактор синтаксиса.
  6. Выберите меню ANALYZE>DESCRIPTIVE>FREQUENCIES, поместите переменную jobcat в список Variable(s).
  7. Щёлкните на кнопку Paste. Соответствующая команда появится в окне синтаксиса.
  8. Сохраните файл синтаксиса (используя меню окна синтаксиса): 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 на веб-сайте Центрального университета Мичигана, если не знаете, как это сделать.

Прочие преимущества использования файлов синтаксиса:

  1. документирование (синтаксис сам собой говорит, что было сделано, каким путём вы добились тех или иных результатов)
  2. воспроизводимость результатов (это следствие предыдущего: попробуйте переделать час работы через меню!)
  3. пакетная обработка (для затратных по времени и ресурсам задач синтаксис можно запустить на выполнения в то время, когда система более производительна)
  4. открывает дверь в мир макросов (ведь для работы с макросами надо сначала познакомиться с синтаксисом)
  5. позволяет пользоваться всеми возможностями SPSS (некоторые возможности доступны только через синтаксис)
  6. эффективный метод коммуникации в профессиональном сообществе (В списке рассылки SPSSX-L и новостных группах синтаксис используется как в вопросах, так и в ответах. Ответы в виде синтаксиса понятны людям, использующим локализованные версии SPSS).

 

Список рассылки SPSSX-L

Разумеется, хороший способ изучения синтаксиса — посмотреть на уже готовые решения. Просматривайте их, даже если они не кажутся вам полезными в настоящее время.

Упражнения

Манипуляция строками (см. также Поэлементный разбор и маркировка данных)

Разберём здесь синтаксис Упражнение по преобразованию строк.SPS. Выполним последовательно следующие операции:

  1. Удалим незначащие головные нули  (или любые другие символы)
  2. Заменим точки на запятые (или любой символ "x" на символ "y")
  3. Удалим "/" и всё, что левее. (или любые другие… понимаете, о чём я?)
  4. Удалим"/" и всё, что правее
  5. Объединим строки 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

Упражнения на работу с датами, временем и возрастом

Последовательно проделаем следующие манипуляции:

  1. Создаём переменную формата даты из числовой, такой как 19901204 (см. п. 6 для обратной операции)
  2. Создаём переменную формата даты из 3 числовых переменных, содержащих день, месяц и год
  3. Переводим строчную переменную в формат даты (см. также п. 7)
  4. Рассчитываем возраст
  5. Наращиваем дату на 1 день
  6. Создаём числовую переменную, такую как 19901204, из даты
  7. Создаём строковую переменную, такую как 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 дням, чтобы учесть високосные года. 

Лучшим способом будет сначала конвертировать возраст в дни, а затем разделить их на 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.