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

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


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

22.10.2006

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

Немного о временных (scratch) переменных

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

 

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

В начале выпуска - информация о новом эконометрическом он-лайн журнале "Квантиль". Цитирую сообщение редакционного совета:

"Уважаемые любители и профессионалы эконометрики!

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

Сайт журнала - http://quantile.ru. На сайте пользователь может просмотреть содержание выпусков и скачать интересующие статьи или эссе.

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

 

Станислав Анатольев, редактор"

 

А теперь - к теме выпуска...

Немного о временных (scratch) переменных

Пока готовился предыдущий выпуск о проверяемости логических условий в SPSS, нас посетила мысль о том, что неплохо было бы составить аналогичные заметки по временным переменным SPSS. Не вдаваясь в обсуждение корректности перевода принятого в документации SPSS термина "scratch variables" как "временные переменные", уточним, что речь идёт о переменных, чьи имена начинаются с префикса # и часто используются в преобразованиях данных. Собственно, вся информация, которую я собираюсь сообщить по этому вопросу, помещается в очень небольшом пункте в Command Syntax Reference, который так и называется - "Scratch Variables". В нашей рассылке уже затрагивался этот вопрос. Не поленившись заглянуть в её скромный архив, мы находим в пятом выпуске:

"Определение "временных" (scratch) векторных переменных

Порой нет нужды создавать векторные переменные в явном виде. Иногда можно использовать scratch-вектора, которые содержатся лишь в памяти ЭВМ и не записываются в файл данных. Такие переменные задаются в командном языке SPSS с префиксом "#". Например:

VECTOR #myvec (10).

cоздаст в памяти 10 временных переменных с именами #myvec1 - #myvec10. В редакторе данных изменения заметны не будут.

Вычисления с временными переменными не отличаются от вычислений с обычными переменными. Например, небольшой синтаксис

VECTOR #myvec(10).

COMPUTE #myvec(1) = $casenum.

COMPUTE #myvec(2) = #myvec(1)*10.

COMPUTE result = #myvec(2).

EXE.

запишет в "реальную" переменную result результат вычислений, произведённых с помощью временных векторных переменных. А именно - result будет содержать "табулированный" (умноженный на 10) порядковый номер наблюдения. Здесь, кстати, используется специальная системная переменная $casenum с префиксом "$", которая означает текущий номер наблюдения в файле данных."

Ключевой здесь является фраза "вычисления с временными переменными не отличаются от вычислений с обычными". Прямо скажем, она была бы совсем правдой, если бы звучала так: "как правило, результат работы с временными переменными не отличается от работы с обычными переменными". Что же отличает работу с временными переменными от работы с обычными?

 

1. Первым очевидным отличием является то, что значения этих переменных не отображаются в редакторе данных и не сохраняются в файле. Это основное свойство этих переменных, которое делает их полезным вспомогательным инструментам при осуществлении преобразований. Если вам требуется промежуточная переменная в ходе преобразований, которая после окончания преобразований вам больше не понадобится, временная переменная - хороший вариант. Такие переменные не оставляют "следов" в файле данных (поэтому часто они используются, например, в качестве индексных переменных цикла LOOP), а также могут давать выигрыш в скорости вычислений, так как их значения не сохраняются в файле данных. Особенно это заметно при работе с большим количеством векторных переменных - сотнями или тысячами штук.

В примере ниже значения переменной a передаются через невидимого "посредника" (временную переменную #temp) в переменную b без потерь:

COMPUTE #temp = a.

COMPUTE b = #temp.

EXECUTE.

 

2. В продолжение первого пункта следует обсудить вопрос о времени жизни временных переменных. Единожды созданные, scratch-переменные существуют в памяти лишь до первого прохода по данным: команды EXECUTE, либо статистической или иной процедуры, вызывающей чтение всех данных (DESCRIPTIVES, SAVE и т.д.). Это означает, что попытка обратиться к переменной #temp после выполнения предыдущего примера, закончится неудачей:

COMPUTE c = #temp.

SPSS сообщит, что не знает переменной #temp. Временные переменные, таким образом, в полном смысле являются временными.

 

3. Менее очевидным, но легко проверяемым фактом является тот, что переменные со значком # не могут участвовать в статистических процедурах. Подсчитать среднее значение для #ab в следующем примере можно будет, лишь поместив значения #ab в "реальную" переменную, например, c:

COMPUTE #ab = a * b.

COMPUTE c = #ab.

DESCRIPTIVES VARS = c.

... но не так:

COMPUTE #ab = a * b.

DESCRIPTIVES VARS = #ab.

В последнем случае SPSS сообщит об ошибке, а значения #ab будут потеряны. По иронии судьбы, разрушительно действует на временные переменные и команда TEMPORARY.

 

4. Иногда важно и то, что инициализация временных числовых переменных происходит со значением 0 (строковые временные переменные, так же, как и строковые обычные переменные инициализируются со строкой из пробелов). Обычные числовые переменные после их объявления принимают пропущенные значения. Это значит, например, что команды

VECTOR #a (2F2.0).

COMPUTE c1=#a(1).

COMPUTE c2=#a(2).

EXECUTE.

Дадут столбцы с нулями в переменных c1 и c2.

Подобное обстоятельство не означает, что временная переменная не может принять системное пропущенное значение. Следующие действия

COMPUTE #aaa=LN(0).

COMPUTE c=#aaa.

EXECUTE.

обернутся пропущенными значениями в переменной c. А вот пользовательские пропуски, равно как и метки переменных и значений, временным переменным назначить нельзя.

 

5. Последним, но важным свойством временных переменных из отмечаемых здесь, является их "глобальный" характер. При вычислениях их значения существуют не только в рамках текущего наблюдения, но и за его пределами - для всех следующих за ним наблюдений. Обычно это незаметно из-за построчного характера вычислений. Пример

COMPUTE #temp = $casenum.

COMPUTE casenum = $temp.

EXECUTE.

исправно поместит в итоге номера наблюдений в переменную casenum. Ведь при нахождении курсора вычислений в первом наблюдении переменная #temp получит значение 1, которое будет "видно" всем наблюдениям. Но переход ко второму наблюдению будет осуществлён уже после получения переменной casenum значения 1 в первом наблюдении, т.е. после исполнения второго COMPUTE. Во втором же наблюдении #temp получит значение 2, что обеспечит casenum=2 для второго наблюдения. И так далее. "Уловить" глобальный характер временных переменных может, например, такая конструкция:

IF $casenum=1 #temp = c.

COMPUTE d = c - #temp.

Переменная #d получит разность каждого значения переменной c с её первым значением. Единожды приняв в первом наблюдении первое значение переменной c, временная переменная #temp затем сохраняет его во всех вычислениях в последующих наблюдениях.

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

COMPUTE #aaa=c.

COMPUTE d=LAG(#aaa).

Подытожим сказанное. Использование временных переменных - хороший способ ускорить вычисления и избежать замусоривания файла данных вспомогательными значениями, ненужными после окончания вычислений. Вместе с этим, следует помнить, что работа с такими переменными незначительно отличается от работы с обычными переменными. Учёт этих особенностей позволит, в одних случаях, составить более эффективный код обработки данных, а в других - поможет лучше понять работу программы и разобраться в возможных проблемах.

 

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

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

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


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

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

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

Случайная выборка n мужчин и n женщин.sps

Случайные выборки с заданными значениями пола, возраста и образования.sps

Разделить файл на 2 файла случайным образом.SPS

 

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

Продублировать наблюдение n раз, где n - значение переменной.SPS (см. также "Восстановить таблицу сопряжённости")

Восстановить таблицу сопряжённости в исходный файл данных.SPS (разукрупнить данные)

Размножить наблюдения x и y раз.SPS например, из наблюдения, где возраст=20, муж=5 и жен=6, сделать 5 наблюдений, где возраст=20 и пол=1 и 6 наблюдений, где возраст=20 и пол=0

 

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


В избранное