Советы по работе в SPSS

В начало Частые вопросы Синтаксис Макросы Скрипты Python Советы Ссылки

Некоторые советы по использованию SPSS

Берегите исходные данные!

Допустим, исходный файл данных называется «mydata.sav». Возьмите за правило никогда не изменять этот файл с помощью синтаксиса. Вместо этого, сохраняя изменённый файл в первый раз, дайте ему имя, например, «mydata mod.sav». Это предохранит вас от случайного повреждения исходных данных неосторожным применением таких команд, как SELECT IF или AGGREGATE.

Синтаксис 1, синтаксис 2, синтаксис 3, …

Когда разрабатываете сложный синтаксис, периодически сохраняйте очередную версию со своим именем.

Моя панель инструментов в окне синтаксиса

Полезно доработать стандартную панель инструментов в окне синтаксиса «под себя» (см. Руководство пользователя для соответствующих инструкций). Вот внешний вид моей панели.

SPSS icones.jpg (20616 bytes)

  1. Очистить редактор данных (в 14 и более поздних версиях имеет эффект открытия нового редактора данных)
  2. Открыть новое окно синтаксиса
  3. Открыть новое окно скрипта
  4. Перечень последних вызванных команд
  5. Выполнить текущую команду (на которой находится в данный момент курсор)
  6. Выполнить часть синтаксиса, выделенную в данный момент
  7. Выполнить часть синтаксиса, начиная с того места, где стоит курсор и до конца
  8. Выполнить весь синтаксис, который есть сейчас в окне
  9. Открывает окно с кратким описанием той команды (например, FLIP или DO REPEAT), на которой находится курсор.
  10. Открывает файл spssbase.pdf (электронную версию Руководства пользователя по синтаксису — Syntax Reference Guide). Постоянно этим пользуюсь.
  11. Имеет тот же эффект, что и выполнение команды EXECUTE. Избавляет от надписи «Transformation Pending» (преобразование данных незакончено) в статусной строке. Очень удобно.
  12. «Самопальная» иконка. Связана с выполнением скрипта Очистить активное окно результатов.sbs. Когда я пишу или отлаживаю синтаксис, я пользуюсь этой командой каждый раз перед очередным запуском синтаксиса. Таким образом, в окне результатов у меня всегда только «свежая» информация. Коммент. А.Б.: Как «привязать» выполнение данного скрипта к иконке? В нужном окне (Output, Syntax, Script) выбираете меню View -> Toolbars… -> Customize…-> New Tool… Переключаете группу Action в Script, вводите путь к файлу синтаксиса, вводите подсказку для кнопки, которая будет отображаться на ней при наведении мыши. Затем OK, затем переносите новую кнопку на панель инструментов. Её внешний вид можно отредактировать, нажав кнопку Edit Tool…
     

Меняете рабочую директорию каждый месяц?

Существует много обстоятельств, в которых вам приходится менять пути к рабочим файлам в синтаксисе. Например:

  • если вы периодически запускаете синтаксис (раз в неделю или месяц) на новых данных, которые находятся в новых папках;
  • если вы работаете как в офисе, так и дома и вам не всегда удобно делать идентичными пути к дискам и папкам;
  • или вы запускаете один и тот же синтаксис на разных файлах ваших клиентов.

Я справляюсь с этим, помещая в начало каждого синтаксиса следующий макрос:

define !Path1 ()'d:\project xy\my program files\'!enddefine.
define !Path2 ()'d:\project xy\my data files\'!enddefine.
GET FILE=!Path2+"data1.sav".
INCLUDE !Path1+"evaluate.sps".
*** evaluate.sps также может ссылаться на !path1 и !Path2 ***
*** сюда вставляем другие необходимые вычисления ***.
SAVE OUTFILE=!Path2+"results.sav".

Такой метод позволяет изменять пути один раз на весь файл синтаксиса.

Как правильно задавать вопросы?

В идеале, задавая вопрос, вы должны снабдить его примером файла данных, а также файлом с примерным видом результатов, которые хотели бы получить. Более продвинутым пользователям (особенно, если конфигурация данных относительно сложная), рекомендуется делать это с помощью процедур DATA LIST или INPUT PROGRAM, т.к. это сохраняет много времени для человека, который пытается ответить на ваш вопрос. Ведь в некоторых случаях много времени уходит на создание примерного файла данных, чтоб на нём откатать синтаксис, например. Чем больше вы позаботитесь об экономии времени для потенциального помощника, тем больше вероятность, что он уделит какое-то время вашему вопросу. О чём ещё надо сказать?

  • Зачем? Полезно объяснить, для чего вам требуются те или иные манипуляции с данными. Ведь иногда достичь вашей цели можно более простым способом, чем тот, что вы пытаетесь реализовать.
  • Число наблюдений и переменных. Решение для файла с 100 наблюдениями не всегда подойдёт для файла с 10 000 000 наблюдений. Точно также и количество переменных может повлиять на уместность того или иного решения. Поэтому неплохо сообщить и эту информацию.
  • Частота использования. Как часто вы будете применять искомое решение. Разумеется, разовое использование потребует от синтаксиса заметно меньше автоматизации, чем это будет в случае, если синтаксис будет запускаться каждую ночь в автоматическом режиме через Production facility.

Задавая вопрос, вы можете упростить свой пример для того, чтобы упростить и его понимание. Однако, чтобы получить работающее решение, необходимо сообщить ту информацию, о которой сказано выше.

Задать правильный вопрос — вот лучший способ получения правильного ответа…

Студенты или преподаватели (те, кто имеет доступ к огромным библиотекам) часто спрашивают «У кого-нибудь есть синтаксис, который считает статистику XYZ как она определена в книге ABC?». Разумеется, это очень удобный способ задавания вопроса. Однако, если у кого-то под рукой не окажется этой книги, он просто пропустит ваш вопрос без всякого внимания. Поэтому если у вас есть выписанная или отсканированная формула и вы можете при необходимости отослать её по электронной почте, скажите об этом. Но не прикладывайте эти файлы к общему вопросу. Отошлите их тем, кто откликнется.

Когда следует использовать команду EXECUTE?

Понимание этого вопроса и ответа может сэкономить для вас много времени. Эти сообщения были помещены в SPSSX-L 2 апреля 1999 года (David Matheson, техническая поддержка SPSS)

Вопрос.

Я выполняю серии преобразований в SPSS. Очень был удивлён, узнав, что получение корректных результатов может требовать помещения команды EXECUTE между командами преобразований данных.
Вот один из примеров моего синтаксиса.

DATA LIST LIST /da w (2F8.1).
BEGIN DATA
4,3 6,3
4 6 ,7
4,1 3,8
4 5 5,8
4,1 6,3
5 7,1
END DATA.
COMPUTE RETURN = da-LAG(da).
COMPUTE sv =(w<=1 or w>=5).
SELECT IF (sv=0).
LIST.

Результаты для переменной RETURN в некоторых случаях были некорректны. Корректные результаты были получены, если команда EXECUTE была помещена между строками 2 (compute RETURN…) и 4 (SELECT IF…). Каковы более общие правила, устанавливающие регламент использования команды EXECUTE?

Ответ.

Здесь правильным решением было поместить EXECUTE перед SELECT IF. (В данном конкретном случае помещение EXECUTE между двумя командами COMPUTE тоже бы сработало) Иначе, когда вы считаете RETURN как DA - LAG(DA) для конкретного наблюдения, наблюдение, вначале предшествовавшее текущему наблюдению, может быть уже исключено из файла и LAG(DA) может ссылаться на значение DA не из нужного вам наблюдения.

Для дальнейшей иллюстрации использования команды EXECUTE между командами трансформации, рассмотрим 3 последовательных наблюдения с кодами 1, 2 и 3.

Предположим, мы хотим сохранить, или убрать наблюдение номер 2 в зависимости от результата его сравнения с наблюдением 1. Аналогично нам нужно будет сравнить наблюдение 3 с наблюдением 2 и сохранить или выбросить номер 3 в результате. Предположим, что наблюдение 2 было выкинуто по результатам сравнения, но наблюдение 3 прошло бы тест в сравнении с наблюдением 2 таким образом, что 3 следовало бы в результате сохранить. Без команды EXECUTE (или другой команды, инициирующей «проход» по всем данным) перед SELECT IF, наблюдение 2 будет оценено и выкинуто перед тем, как будет оценено наблюдение 3. В результате наблюдение 3 будет сравниваться с «предыдущим» наблюдением, которым в данном случае будет наблюдение 1 и будет сохранено или выкинуто уже по ошибке. Помещение EXECUTE перед SELECT IF гарантирует наличие всех наблюдений для функции LAG.

Но, разумеется, мы можем себе представить и такую процедуру сравнения, при которой последующее наблюдение сравнивается с последним из предыдущих наблюдений, успешно прошедших сравнение. В таком случае мы должны будем убрать EXECUTE и достигнем нужного результата.

Аналогичная ситуация возникает когда наблюдения должны быть отобраны по исходному порядковому номеру в файле данных. Допустим, нам нужно отобрать каждое пятое наблюдение, и мы используем следующий синтаксис:

compute seq = $casenum.
select if (mod(seq,5) = 0).
frequencies x.
* функция mod возвращает остаток от деления первого числа на второе.

У вас не будет ни одного наблюдения для построения частотной таблицы. Первому наблюдению будет присвоено значение 1 в переменной seq, поскольку значение системной переменной $casenum для него будет равно 1. (mod(seq,5)=0) вернёт «ЛОЖЬ» и наблюдение будет удалено. Второе наблюдение теперь стало первым и будет удалено тем же манером (теперь для него $casenum = 1, seq = 1). То же самое случится и с тем наблюдением, которое изначально было пятым, десятым и т.д. А вот следующий синтаксис будет работать.

compute seq = $casenum.
execute.
select if (mod(seq,5) = 0).
frequencies x.

Добавление execute перед select обеспечивает корректность вычисления seq перед тем, как наблюдения начнут удаляться.

Если вы используете команды преобразований переменных (COMPUTE, IF, и т.д.), за которыми следует команда MISSING VALUES (пропущенные значения), затрагивающая те же переменные, может потребоваться использование оператора EXECUTE перед MISSING VALUES. Ведь MISSING VALUES изменяет описание базы данных (dictionary) до того, как преобразования будут иметь место. Например, рассмотрим:

IF (x = 0) y = z*2.
MISSING VALUES x (0).

Наблюдения, где x=0 будут рассматриваться как пропущенные и переменная y не будет изменена. Помещение EXECUTE перед MISSING VALUES принудит SPSS выполнить вычисления до того, как 0 для переменной x получит статус пропущенного значения.

Оператор EXECUTE часто необходим, если вы используете команду WRITE для записи данных в ASCII-файл, или если используете команду XSAVE вместо SAVE, для сохранения данных в .sav-файл. Команды WRITE и XSAVE имеют тот же статус, что и COMPUTE (при их интерпретации процессор SPSS помещает их в список отложенных вычислений). Если ваша программа оканчивается командами write или xsave без команд пересчёта данных, файл, в который вы хотите записать, окажется пустым. Если же WRITE или XSAVE являются частью циклов LOOP или DO IF, команду EXECUTE использовать не надо.

Если после команд WRITE или XSAVE вы запускаете какую-то статистическую процедуру (например, частотную таблицу FREQ), данные в файл будут записаны без дополнительных вызовов EXECUTE.

Если вы производите очень много вычислений, SPSS может выдавать сообщения о нехватке памяти для их выполнения. В таком случае полезно будет вставить несколько команд EXECUTE между командами трансформаций для того, чтобы заставить SPSS произвести одну порцию вычислений и освободить память для следующей. Не помещайте ECEXUTE в таких конструкциях, как LOOP..END LOOP, DO IF..END IF или DO REPEAT..END REPEAT. Также не помещайте EXECUTE между командами, которые определяют временные (scratch) переменные и последующими командами, которые к ним обращаются. Если вы производите большое количество вычислений с последующим вызовом таких требовательных к ресурсам памяти процедур, как CLUSTER или MANOVA, выполните EXECUTE перед запуском такой процедуры. Хотя процедура и сама вызовет выполнение вычислений во всём массиве данных, помещение EXECUTE перед процедурой освободит память, которая требуется для вычислений самой процедуре.

Это лишь примеры некоторых случаев, когда EXECUTE требуется поместить внутри или после команд преобразований данных. Помещение EXECUTE после каждой команды на вычисление будет неэффективно в лучшем случае и неработоспособно в худшем (например, серия вычислений в цикле LOOP или DO IF).

Немного о команде INCLUDE

Если файл синтаксиса вызывается на выполнение через команду INCLUDE, рекомендуется вначале этого файла иметь строку комментария (т.е. строку, начинающуюся со знака «*» и заканчивающуюся точкой). Это лучше сделать для того, чтобы обойти иногда встречающуюся особенность интерпретатора команд «проглатывать» первую строку кода.

Заметьте, что синтаксис файла, который вызывается на выполнение с помощью INCLUDE, должен быть написан с использованием некоторых особых правил:

  • Команды должны начинаться с первой колонки;
  • Линии кода, продолжающие предыдущую команду, не должны начинаться с первой колонки.

Например, следующий код будет работать в прямом режиме, но не будет работать, будучи вызван через INCLUDE:

DO IF $CASENUM=1.
    COMPUTE firstc=1.
END IF.

Любой из двух вариантов, данных ниже, будет работать через INCLIDE:

DO IF $CASENUM=1.
COMPUTE firstc=1.
END IF.

или

DO IF $CASENUM=1.
COMPUTE firstc=1.
END IF.

См. синтаксис Выполнение отдельных частей синтаксиса.SPS для примеров типичного использования команды INCLUDE. Заметим, что выполнение файла, вызванного через INCLUDE, заканчивается как только возникает ошибка. Некоторые сообщения системы, имеющие характер предупреждений, также останавливают выполнение такого синтаксиса. Здесь типичными являются 2 ситуации:

Как приписать метки переменных и метки значений из старого файла переменным в новый файл с аналогичной структурой?

Если имена переменных те же самые, всё, что нужно сделать - вызвать меню FILE > APPLY DATA DICTIONARY …

ИЛИ (через синтаксис)

APPLY DICTIONARY FROM='C:\Program Files\SPSS\old data file.sav'.

Чтобы применить метку переменной и метки значений данной переменной к другим переменным, см. этот синтаксис.

Комментарии в несколько строк

Простейший способ ввести большие комментарии в файл синтаксиса, это:
- делать отступы в начале второй и последующих линий
- не ставить точек в конце строк комментариев, за исключением последней строки.

При этом в начале первой линии требуется наличие значка «*» (или ключевого слова «Comment»).

▲ наверх