Здесь собраны методические материалы и упражнения по синтаксису SPSS
- Обзор методических материалов
- Книги (можно загрузить бесплатно!)
- Основные положения (включая объяснение, почему же синтаксис так необходим)
- Список рассылки
- Упражнения
Обзор методических материалов
Книги
Я (Raynald Levesque — А.Б.) являюсь автором книги SPSS Programming and Data Management (Программирование у управление данными в SPSS). Книга издана корпорацией SPSS. Здесь вы найдёте её описание и содержание . Вы можете загрузить бесплатную версию второго издания в формате 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. Зайдите на домашнюю страницу Центрального офиса SPSS, выберите ссылку store справа вверху.
Основные положения
Начинать своё путешествие в мир синтаксиса лучше всего с кнопки 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).
Список рассылки
Разумеется, хороший способ изучения синтаксиса — посмотреть на уже готовые решения. Просматривайте их, даже если они не кажутся вам полезными в настоящее время.
Упражнения
Манипуляция строками (см. также Поэлементный разбор и маркировка данных)
- Удаляем незначащие головные нули (или любые другие символы)
- Заменяем точки на запятые (или любой символ "x" на символ "y")
- Удаляем "/" и всё, что левее. (или любые другие… понимаете, о чём я?)
- Удаляем"/" и всё, что правее
- Объединяем строки 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
Упражнения на работу с датами, временем и возрастом
- Создаём переменную формата даты из числовой, такой как 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 дням, чтобы учесть високосные года.
Лучшим способом будет сначала конвертировать возраст в дни, а затем разделить их на 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).
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.



