Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Статистика в SPSS: за пределами кнопочного интерфейса. Выпуск 26


В рассылке используются материалы веб-сайта www.spsstools.ru

Содержание выпуска

Макрос для создания двоичных переменных

Новое на сайте www.spsstools.ru


Здравствуйте, уважаемые подписчики!

 

Макрос для создания двоичных переменных

Как и планировалось ранее, сегодня объектом нашего пристального внимания станет синтаксис Создание фиктивных переменных.SPS из русской версии коллекции Рейналя. Автор синтаксиса: rlevesque@videotron.ca, 28.12.2002.

Назначение синтаксиса - автоматизация разложения категорий номинальной переменной по нескольким двоичным (дихотомическим, бинарным, фиктивным, индикаторным, dummy - кто как называет) переменным. Потребность в этом возникает, например, если мы желаем включить номинальную переменную в регрессионную модель. В этом случае переменная должна быть введена как серия двоичных переменных (либо как одна двоичная переменная, если нас интересует противопоставление отдельной категории номинальной переменной всем остальным её категориям). Процесс создания таких переменных "вручную" (например, через процедуры перекодирования) может быть весьма утомителен. А в реальном исследовательском процессе, когда исследуются модели с разными комбинациями независимых переменных и разными параметрами, перекодирование переменных в двоичные может занять неприлично много времени. Потребность в дихотомизации переменных возникает не только в регрессионном анализе, но и, например, в ходе обычного сравнения средних t-критериями, при котором надо противопоставить одну категорию группирующей переменной всем остальным. Для таких задач, разумеется, можно использовать стандартные меню дисперсионного анализа (ANOVA) и пользоваться там механизмами задания контрастов для post hoc-сравнений, но для простых задач мы интуитивно ищем более простые и понятные всем решения. Таким образом, предлагаемый макрос может существенно облегчить жизнь исследователя, если всегда держать соответствующий синтаксис под рукой.

 

Функции данного макроса

1. За один вызов макроса он может "разложить" одну номинальную (а, впрочем, и порядковую, и метрическую, если требуется) переменную, содержащую k категорий, на k двоичных переменных. Каждая двоичная переменная будет равна 1 для случаев, когда исходная переменная равна категории, закреплённой за двоичной переменной и 0 - в противном случае *, **.

2. Если при вызове макроса некоторая категория будет выбрана в качестве базовой, двоичная переменная для этой категории создана не будет. Все остальные двоичные переменные для этой категории, естественно, будут равны 0. Таким образом, макрос преобразует переменную c k категориями в k-1 двоичных переменных. Это обычная практика в регрессионном анализе, так как включение в модель всех k двоичных переменных вызовет проблему мультиколлинеарности (равенство некоторой двоичной переменной единице неизбежно вытекает из равенства всех остальных двоичных переменных нулю, dn = 1 - 1 (d1) - 1(d2) - ... - 1(dk)).

3. Количество категорий перекодируемой переменной определяется макросом автоматически.

4. Коды категорий не обязательно должны быть последовательными.

5. Макрос позволяет задать "понятные" имена двоичных переменных, формируя имена из постоянной части, связанной с именем исходной номинальной переменной (задаётся пользователем), и кода, соответствующего коду категории исходной переменной. Так, в примере ниже номинальная переменная jobcat раскладывается на три двоичных переменных job1, job2, job3.

6. Макрос работает с тем файлом данных, путь к которому был указан при вызове макроса.

7. Макрос НЕ позволяет формировать сложные контрасты (объединять категории, осуществлять противопоставления не "каждой категории всем остальным категориям", а "категории среднему уровню зависимой переменной" и т.д.).

8. Макрос НЕ позволяет оперировать отрицательными кодами (хотя и может быть доработан для устранения этого недостатка).

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

10. Системные или пользовательские пропущенные значения дают пропущенные значения для созданных двоичных переменных.

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

** Предполагается, что номинальные и порядковые переменные закодированы (т.е. имеют числовой тип).

 

Ключевые идеи алгоритма

При вызове пользователь задаёт следующие параметры макроса:

NomVar - имя номинальной переменной для которой требуется создать двоичные переменные;

PreNam - корень (первая часть) имени новых переменных;

RefCat - базовая категория (для неё не создаётся переменной) (параметр остаётся пустым, если базовая категория не выделяется);

FPath - полный путь и имя файла данных.

 

Далее.

Загружаем файл FPath.

Для подсчёта различимых категорий переменной, заданной параметром NomVar в файле Fpath, используется процедура агрегирования (AGGREGATE).

Создаются 3 строковые переменные, одна из которых содержит уникальные значения переменной NomVar, вторая - имя переменной NomVar. В третьей переменной (имеющей k значений, по числу уникальных категорий) формируем k имён будущих двоичных переменных, объёдиняя постоянную часть имени с кодом категории.

Для каждого уникального значения переменной NomVar (если только оно не заданно в качестве базовой категории) записываем (c помощью команды WRITE) во внешний файл синтаксиса перечень команд, создающих двоичную переменную и метки их значений ("да" для 1 и "нет" для 0).

Вновь загружаем исходный файл FPath.

Исполняем только что созданный программой синтаксис. Перекодировка завершена.

 

Разбор программного кода

Инструкцией SET отключаем дополнительную распечатку тела макроса в окне результатов (возможно, она у вас и не была включена).

SET MPRINT=no.

Начинаем определение макроса !DumCode с соответствующими параметрами. Для наглядности отделяем вводимые параметры друг от друга символами '/'. Кроме того, для параметра RefCat (базовая категория) задаём значение по умолчанию "НЕТ". Если задание базовой категории не требуется, пользователь просто пропускает этот параметр при вызове.

DEFINE !DumCode(NomVar =!CharEnd ('/')
/PreNam =!CharEnd ('/')
/RefCat =!DEFAULT("НЕТ") !CharEnd ('/')
/FPath =!CMDEnd)

Открываем файл данных. На место макропараметров (с восклицательными знаками) подставляются данные, переданные пользователем при вызове макроса.

GET FILE=!FPath.

Ищем все различимые категории (число записей в новом файле становится равно числу различимых категорий переменной NomVar).

AGGREGATE
/OUTFILE=*
/BREAK=!NomVar
/N_BREAK=N.

Определяем 3 строковых переменных и для удобства создаём дополнительную переменную catvalue, равную переменной !NomVar. Предварительное определение строковых переменных через STRING необходимо, так как по умолчанию инструкция COMPUTE попытается создать числовую переменную.

STRING vname1 TO vname3 (A7).

COMPUTE catvalue=!NomVar.

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

COMPUTE vname1=RTRIM(LTRIM(STRING(catvalue,F8.0))).

В переменную vname2 пишем имя переменной !NomVar. Если не использовать параметр !QUOTE, SPSS попытался бы в строковую переменную vname2 скопировать значения числовой переменной !NomVar. Возникла бы ошибка. Нам нужно поместить сюда имя переменной для последующего использования при формировании синтаксиса.

COMPUTE vname2=!QUOTE(!NomVar).

Теперь объединяем в переменную vname3 строковый вариант числовых значений catvalue (vname1) и постоянную часть имени двоичных переменных, переданную пользователем. Обратим внимание, что ссылка на макроаргумент !PreNam в данном случае идёт через дополнительную макрофункцию !EVAL. Я сохранил эту функцию, поскольку она присутствовала в оригинальном коде макроса, но в данном случае можно без неё обойтись. Она была бы необходима, если бы !PreNam являлся бы именем внешнего макроса, а не макроаргументом. Думаю, что к особенностям работы с функцией !EVAL мы вернёмся в одном из следующих выпусков рассылки. В данном случае вы можете её убрать или оставить: по своему усмотрению.

COMPUTE vname3=CONCAT(!QUOTE(!EVAL(!PreNam)),vname1).

Команда DO IF пробегает по всем значениям переменной catvalue и всякий раз, когда значение, стоящее там, не совпадёт со значением макропараметра !RefCat (базовой категорией), во внешний файл синтаксиса будут записаны команды создания и описания соответствующей дихотомической переменной. Соответственно, не будет создана лишь дихотомия для той категории, которая объявлена базовой. Если же пользователь пропустил параметр !RefCat при вызове, !RefCat всё равно будет иметь значение по умолчанию "НЕТ". Условие, стоящее в структуре DO IF, включает проверку как на равенство категории catvalue значению параметра !RefCat, так и на равенство параметра !RefCat значению "НЕТ" (в случае, если параметр не задан и используется его значение по умолчанию). Строго говоря, необходимости во втором условии нет, так как до него проверка не доходит: строка catvalue<>НЕТ вызывает ошибку (попытка сравнить catvalue с несуществующей переменной "НЕТ") и цикл DO IF не начинается. Соответственно, не выполняется и закрывающая инструкция END IF. Зато выполняется команда WRITE для каждого наблюдения без исключения (ведь ограничения не заданы) и производит, даже при наличии ошибки в выполнении синтаксиса, нужный результат. Дихотомические переменные создаются для всех категорий номинальной переменной. Одна беда: если команда на вызов макроса поступит в пакетном режиме (вызовом внешнего файла синтаксиса), возникшая в ходе выполнения макроса ошибка остановит его. Требуется либо более корректно обрабатывать ситуацию отсутствия базовой категории, либо использовать для вызова запускающего синтаксиса команду INSERT вместо INCLUDE. Однако, не будем сейчас разбирать все возможные случаи. Будем считать, что макрос вызывается в интерактивном режиме.

DO IF catvalue<>!RefCat OR !QUOTE(!RefCat)="НЕТ".

WRITE OUTFILE='c:\temp\define dum.sps'
/ 'COMPUTE ' vname3 '=(' vname2 '=' catvalue ').'
/ 'VALUE LABELS ' vname3 ' 0 "нет" 1 "да".'.

END IF.

Команда EXECUTE выполняет все отложенные к настоящему моменту вычисления. Формируется файл define dum.sps.

EXECUTE.

Теперь настало время использовать созданный синтаксис. Но делать мы это будем на исходном, а не на агрегированном файле данных. Его надо снова загрузить.

GET FILE=!FPath.

Теперь подключаем синтаксис.

INCLUDE 'C:\temp\define dum.sps'.

EXECUTE.

!ENDDEFINE.

Описание макроса завершено, но к его исполнению мы ещё не приступали. Предлагается сохранить тело определения макроса в отдельном файле, чтобы к нему было удобнее обращаться. Например, в файле 'c:\temp\dumcode.sps'.

Тогда загрузить макрос в память в рамках текущей сессии можно из редактора синтаксиса одной командой:

INCLUDE 'c:\temp\dumcode.sps'.

На всякий случай приведём всё тело макроса без комментариев в "облегченном" варианте: без инструкции !EVAL, значения параметра !RefCat по умолчанию и дополнительной проверки в структуре DO IF:

DEFINE !DumCode(NomVar =!CharEnd ('/')
/PreNam =!CharEnd ('/')
/RefCat =!CharEnd ('/')
/FPath =!CMDEnd)

GET FILE=!FPath.

AGGREGATE
/OUTFILE=*
/BREAK=!NomVar
/N_BREAK=N.

STRING vname1 TO vname3 (A7).

COMPUTE catvalue=!NomVar.

COMPUTE vname1=RTRIM(LTRIM(STRING(catvalue,F8.0))).

COMPUTE vname2=!QUOTE(!NomVar).

COMPUTE vname3=CONCAT(!QUOTE(!PreNam),vname1).

DO IF catvalue<>!RefCat.

WRITE OUTFILE='c:\temp\define dum.sps'
/ 'COMPUTE ' vname3 '=(' vname2 '=' catvalue ').'
/ 'VALUE LABELS ' vname3 ' 0 "нет" 1 "да".'.

END IF.

EXECUTE.

GET FILE=!FPath.

INCLUDE 'C:\temp\define dum.sps'.

EXECUTE.

!ENDDEFINE.

Ниже привеодится несколько примеров вызова макроса.

Следующий пример создаёт двоичные переменные с 1 в качестве базовой категории.

!DumCode NomVar=jobcat /PreNam=job /RefCat=1 /FPath='C:\Program Files\SPSS\employee data.sav'.

Следующий пример создаёт двоичные переменные с 2 в качестве базовой категории.

!DumCode NomVar=jobcat /PreNam=job /RefCat=2 /FPath='C:\Program Files\SPSS\employee data.sav'.

Следующий пример создаёт двоичные переменные без базовой категории.

!DumCode NomVar=jobcat /PreNam=job /FPath='C:\Program Files\SPSS\employee data.sav'.

 

В конце выпуска - вопрос для небольшого самостоятельного исследования. Выше мы упоминали, что макрос не позволяет обрабатывать отрицательные коды категорий. Желающие могут проверить себя и установить (экспериментально или аналитически) причину такого ограничения. Ответ - в следующем выпуске рассылки.

 

Всего доброго,

Ведущий рассылки,

Балабанов Антон

Новое на сайте www.spsstools.ru

Переведены и добавлены примеры синтаксиса:

Создание фиктивных переменных (AnswerNet).SPS

Создать переменную с частотами значений переменной var1.SPS

Определить глобальную переменную.SPS

Задать метки переменных через макрос.SPS

Удалить все метки переменных в заданном .sav-файле.SPS

 

© См. www.spsstools.ru, 2005-2006


В избранное