Учим синтаксис (синтакс) SPSS

Home / В начало Learning Syntax / Учим синтаксис Standard data files / Стандартные файлы данных

Здесь собраны методические материалы и упражнения по синтаксису SPSS

 


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

Книги

Я (Raynald Levesque — А.Б.) являюсь автором книги SPSS Programming and Data Management (Программирование у управление данными в SPSS). Книга издана корпорацией SPSS. Здесь вы найдёте её описание и содержание . Вы можете загрузить бесплатную версию второго издания в формате 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. Зайдите на домашнюю страницу Центрального офиса SPSS, выберите ссылку store справа вверху.

 

Основные положения

Начинать своё путешествие в мир синтаксиса лучше всего с кнопки 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).

 

Список рассылки

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


Упражнения

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

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

 

Разберём синтаксис Упражнение по преобразованию строк.txt

* Упражнение по преобразованию строк.
* Замена / удаление определённых символов в строках, объединение строк.
* Raynald Levesque.
* Создадим фиктивный массив данных.
DATA LIST FIXED /name 1-25 (A).

Data List will read 1 records from the command file (команда Data List прочтёт 1 запись из командного файла — сообщение системы (т.е. наблюдение состоит из одной записи - по умолчанию))

Variable Rec Start End Format

name 1 1 25 A25

BEGIN DATA
000John Doe /10.14.12
0Mary Poppins /17.21
Billy Joe /21.25
000000Peter Pan /10.35
END DATA.
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 LABEL 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. Чтобы заменить точки "." на запятые ",".
COMPUTE name2=name1.

Цикл позволяет «пробежать» по всем символам строки. Знак «-» обеспечивает работоспособность кода в случае использования команды INCLUDE.

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.

Наверх