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

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


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

13.10.2006

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

Неопределённость логических выражений в SPSS

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

 

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

Неопределённость логических выражений в SPSS

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

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

IF n=2 OR n>5 t=-1.

COMPUTE y=(x=1)*10+(x=2)*11+(x=3)*12.

DO IF y>0.

COMPUTE my=y.

ELSE.

COMPUTE my=$SYSMIS.

END IF.

В первом случае переменная t принимает значения -1, если переменная n равна 2 или её значение превосходит 5, иначе t сохраняет прежнее значение. Во втором случае значения 1, 2 и 3 переменной x "перекодируются" в значения переменной y 10, 11 и 12, соответственно, а все прочие значения становятся нулями (так как логическое выражение "x=1" интерпретируется как 0, если оно ложно, и как 1, если истинно). Третье выражение заменяет значения переменной my пропусками, если значение переменной y не превосходит 0, и присваивает ей значения y, большие нуля.

Как сработает то или иное условие при наличии в данных пропусков, пользовательских пропущенных значений, либо включённой фильтрации наблюдений?

Системные пропущенные значения (system-missing) являются, пожалуй, основной причиной, по которой программа, по мнению пользователя, может вести себя "странно". Пустое значение переменной, как правило, делает невозможным оценку истинности выражения, с ней связанного. Казалось бы, пропущенное значение для переменной n делает ложным выражение "n=2", поскольку в ячейке значения переменной не содержится двойки. Тем не менее, возможен и другой взгляд на эту проблему. Вправе ли мы утверждать, что стоящий перед нами автомобиль не является красным, если, на самом деле, вовсе никакого автомобиля перед нами нет? Или вот более практическая ситуация: вправе ли мы утверждать, что доход респондента за последний месяц не не попадает в интервал 5000-10000 руб., если респондент отказался отвечать на наш вопрос, то есть в соответствующей переменной интервал дохода не указан? Скорее всего, делать в такой ситуации какие-либо выводы о доходе этого респондента мы не можем. SPSS практикует именно такой, второй, подход. Так или иначе, в ходе вычислений могут возникать ситуации, когда логическое выражение остаётся неопределённым из-за недостаточности данных для его оценки. Неопределённость выражений может наблюдаться и в полностью заполненной матрице данных когда, например, мы обращаемся к функции LAG при обработке первого наблюдения, либо вводим условие вида x/y>0 и при этом в переменной y нам встречаются нули.

Итак, при наличии пропущенных значений в переменных, входящих в условное выражение, само выражение, как правило, становится неопределённым. Действия программы при этом будут зависеть от контекста, в котором находится условие. Так, в первом примере в случае пропуска в переменной n значение переменной t останется неизменным. Важно понимать, что оно останется неизменным как для наблюдений, где логическое выражение было ложным, так и для наблюдений, где оно было неопределенным. Для второго примера каждое наблюдение должно получить какую-то запись в переменной y. В случае пропуска в переменной x, y будет содержать пропущенное значение. Для третьего примера в тех наблюдениях, где y есть пропуск, ни одна из инструкций COMPUTE до и после ELSE не будет выполнена, т.е. значения переменной my для этих наблюдений останутся неизменными. Подчеркнём, однако же, что даже если все значения переменных, входящих в условия в примерах 1-3 окажутся пропущенными, изменения в словаре SPSS всё равно будут произведены: если в файле данных на момент выполнения синтаксиса будут отсутствовать переменные t, y и my, соответственно, они будут созданы. Их значения в этом случае будут инициализированы как пропуски.

Выше мы говорили, что пропуски, как правило, делают логические выражения неопределёнными. Исключениями из этих правил являются некоторые ситуации, когда мы создаём сложные условия с помощью операторов "И" и "ИЛИ" ("AND" и "OR"). В частности, если с одной стороны оператора AND стоит неопределённое выражение, а с другой стороны - ложное, то мы всё ещё можем делать вывод о результате всего выражения. В самом деле, что бы ни стояло на месте неопределённого выражения, объединение его с ложным высказыванием посредством оператора AND всегда даст ложное высказывание. Аналогично, если хотя бы одно выражение из тех, что объединяются оператором OR является истинным, истинным является и всё сложное высказывание, вне зависимости от определённости остальных. Именно так поступает SPSS в этих случаях, а также в более сложных случаях, когда в одном условии присутствует несколько операторов AND или OR или различных их комбинаций. Кстати, аналогично логическому оператору AND, арифметический оператор "*" в выражениях вида "x*0" вернёт 0 даже при пропусках в переменной x.

Различия между ожидаемыми и фактическими результатами вычислений могут также происходить из-за наличия в словаре файла данных пропущенных значений, определённых пользователем. Такие значения не участвуют в вычислениях и трактуются аналогично системным пропущенным значениям, в том числе и в логических выражениях. Если, мы хотим гарантированно учесть все доступные значения переменных, в том числе и объявленные пользователем как пропущенные, на переменную следует ссылаться посредством функции VALUE, которая возвращает фактическое значение переменной вне зависимости от установок пользовательских пропусков. Например, так:

IF VALUE(n)=2 OR VALUE(n)>5 t=-1.


Разумеется, при наличии системного пропуска (отсутствия всякого значения), VALUE таки вернёт пропуск.

Фильтрация данных посредством инструкции FILTER BY делает невидимыми отфильтрованные наблюдения для статистических процедур, однако никак не влияет на вычисления и результаты логических выражений. Так, например, инструкция

COMPUTE y=(x=1)*10+(x=2)*11+(x=3)*12.


повлияет на все наблюдения, в том числе и отфильтрованные. Исключить из преобразований отфильтрованные, но присутствующие в данных наблюдения, можно разными способами. Например, добавлением дополнительного условия на значение фильтрующей переменной. Так, если фильтр установлен переменной filter_$, синтаксис может быть таким:

DO IF y>0 AND filter_$=1.

COMPUTE my=y.

ELSE IF filter_$=1.

COMPUTE my=$SYSMIS.

END IF.

Кстати, учитывая, что значение 1 трактуется в логических выражениях как "истина", запись filter_$=1 избыточна. Достаточно записать

DO IF y>0 AND filter_$.

COMPUTE my=y.

ELSE IF filter_$.

COMPUTE my=$SYSMIS.

END IF.

Вопросы неопределённости логических выражений, рассмотренные выше, относятся к переменным разных форматов, определённых на числовом типе. Для строковых переменных системных пропущенных значений не существует, поскольку "пустая" строковая переменная - это всегда строка, состоящая из пробелов в количестве, заданном длиной переменной. Для "коротких" строк (длиной до 8 символов включительно) возможно определение пользовательских пропущенных значений, но эти значения учитываются лишь статистическими процедурами (например, FREQUENCIES) и не влияют на вычисление логических выражений. Показательно, что функции VALUE или MISSING к строковым переменным неприменимы. Неопределённость (а точнее - ошибки) при вычислении логических выражений с участием строковых значений всё ещё могут возникать, если мы, например, смешиваем значения разных типов (число и строка) с двух сторон оператора сравнения. При этом ошибка может возникнуть как на этапе трансляции синтаксиса:

IF y=g a=1.


(если y имеет числовой тип, а g - строковый), так и по ходу вычислений в каждом наблюдении в отдельности:

IF y=NUMERIC(g,F2.0) a=1.


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

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

До новых встреч!

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

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


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

Переведены и добавлены примеры синтаксиса (страница http://www.spsstools.ru/SampleSyntax.htm#RandomSampling)

Подобрать контрольную группу, подобную экспериментальной.SPS (Сопоставление на основе propensity scores)

Пропорциональный отбор без возвращения.sps

Пропорциональный случайный отбор.sps

 

...а также страница http://www.spsstools.ru/SampleSyntax.htm#ReadWriteOrCreateData

Добавление записей, продолжающих список.SPS

Создать константу для каждого непропущенного значения даты.SPS

Определение новых переменных в пустом файле данных.SPS

Определение переменных от varX до varY.SPS

 

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


В избранное