Рассылка закрыта
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Январь 2006 → | ||||||
1
|
||||||
---|---|---|---|---|---|---|
2
|
3
|
4
|
6
|
7
|
8
|
|
9
|
10
|
11
|
13
|
14
|
15
|
|
16
|
17
|
18
|
20
|
21
|
22
|
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
Статистика
0 за неделю
Статистика в SPSS: за пределами кнопочного интерфейса
Статистика в SPSS: за пределами кнопочного интерфейса. Выпуск 3
В рассылке используются материалы веб-сайта www.spsstools.ru
Содержание выпуска
Генерация данных с помощью структуры INPUT PROGRAM - END INPUT
PROGRAM
Использование команды SET SEED
Новое на сайте www.spsstools.ru
Здравствуйте, уважаемые подписчики,
Генерация данных с помощью структуры INPUT PROGRAM - END INPUT PROGRAM
Команды INPUT PROGRAM - END INPUT PROGRAM имеют в SPSS, главным образом, два применения: генерация данных, в том числе случайных данных, и (или) чтение данных из внешнего файла или синтаксиса BEGIN DATA - END DATA, в том числе данных сложной структуры. В этом выпуске мы рассмотрим первое направление использования, связанное с генерацией данных.
Команда INPUT PROGRAM позволяет определять данные, осуществляя одновременно с этим различные операции с ними, в том числе и с использованием условных операторов и циклических процедур.
Возможно, простейшим примером определения данных с помощью INPUT PROGRAM, является этот синтаксис:
NEW FILE.
INPUT PROGRAM.
DATA LIST LIST / x y z.
END INPUT PROGRAM.
BEGIN DATA
1 2 3
2 2 3
4 5 1
END DATA.
Здесь команда DATA LIST, определяющая структуру данных, помещается внутри INPUT PROGRAM, а после строки END INPUT PROGRAM, программа читает данные между BEGIN DATA и END DATA. Команду NEW FILE (новый файл) рекомендуют помещать перед INPUT PROGRAM для того, чтобы очистить память от ошибок предыдущих сессий и отменить все незавершённые (pending) операции.
Аналогичный результат может быть получен и более простой комбинацией знакомых по прошлому выпуску рассылки команд DATA LIST и BEGIN DATA - END DATA:
DATA LIST LIST / x y z.
BEGIN DATA
1 2 3
2 2 3
4 5 1
END DATA.
Более интересным приложением INPUT PROGRAMM будет "генерация", а не просто чтение данных. В нижеследующем примере мы сгенерируем идентификационную переменную id, значения которой будут равны номеру наблюдения в файле данных. Сгенерируем 100 наблюдений:
NEW FILE.
INPUT PROGRAM.
NUMERIC id (F3.0).
LOOP id=1 TO 100.
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
EXE.
Обратите внимание, что команда END INPUT PROGRAM сама по себе не вызывает пересчёт данных и вычисления нужно явно запустить командой EXECUTE (или любой командой, вызывающей пересчёт данных, например FREQUENCIES). Действительно, если выполнять пример этого синтаксиса построчно, можно увидеть перед запуском команды EXECUTE сообщение "Transformations pending" (задержанные вычисления) в статусной строке. Кстати, здесь мы использовали сокращённую запись команды EXECUTE, оставив только первые 3 символа: EXE. Таким приёмом можно записывать все команды, сокращая каждое слово команды до 3 символов в целях ускорения написания кода (INPUT PROGRAM - INP PRO, NUMERIC - NUM, и т.д.). Подобную сокращённую запись я видел, кажется, в Fox Pro. Наверняка специалисты в области программирования скажут, что такая возможность существует во многих программных языках.
В рассмотренном примере мы сначала определили переменную id как числовую без отображения десятичных знаков, но могли и пропустить это определение - переменная была бы создана SPSS самостоятельно с форматом F8.2 по умолчанию. Далее вступает в работу цикл LOOP, который будет выполнен 100 раз, причём каждый раз перед завершением очередной итерации программой выполняется команда END CASE, означающая завершение определения очередного наблюдения и переход к определению следующего. Каждый раз, завершая наблюдение, программа "оставляет" в нём те значения, которые были вычислены за время работы с этим наблюдением. Так, условие цикла LOOP вызывает вычисление переменной id=1, id=2, id=3 и т.д. в зависимости от номера итерации. После выполнения всего цикла программе встречается команда END FILE, символизирующая окончание определения файла данных.
Теперь проделаем почти то же самое, но более "сложным" способом: с привлечением временной, "фиктивной" переменной, команды COMPUTE и системной переменной $CASENUM:
NEW FILE.
INPUT PROGRAM.
NUMERIC id id1 (F3.0).
LOOP #iter=1 TO 100.
- COMPUTE id = #iter.
- COMPUTE id1 = $CASENUM.
- END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
EXE.
Данный пример создаёт две идентичные переменные, id и id1, разными способами. При вычислении первой использовалась временная переменная #iter (временные переменные, которые не включаются в состав файла данных, но во время вычислений "ведут" себя так же, как и обычные переменные, определяются с символом "#" впереди имени). Таким образом, для нас переменная #iter остаётся невидимой, но мы видим её значения, которые приняла переменная id. Переменной id1 в том же цикле присваивались значения системной переменной $CASENUM, которая содержит порядковый номер текущего наблюдения. Особенно полезна переменная $CASENUM бывает, когда нужно пересортировать наблюдения по некоторому принципу, а потом вернуться к исходному порядку. Но об этом в другой раз.
Кроме этого вы могли заметить, что мы использовали в данном примере визуальное структурирование цикла LOOP, поставив символы "-" в первую колонку каждой команды внутри цикла. SPSS допускает такие "вольности", если символ структуры стоит именно в первой колонке. Вместо "-", кстати, может быть и "+", но он иногда может быть воспринят как символ продолжения строки и привести к ошибкам. Строго говоря, в данном случае мы могли бы не вставлять лишних символов в начало строки, а просто "отбить" пробелами визуальный отступ внутри цикла. Но такая практика приведёт к ошибкам при вызове одного синтаксиса из другого или при исполнении программы в автоматическом режиме, например, через опцию Production Facility. Так что условимся делать отступы именно таким образом, если нам это будет надо. В сложной программе это помогает ориентироваться в коде.
Рассмотрим теперь, пожалуй, самое интересное приложение команды INPUT PROGRAM, генерацию случайных данных (или псевдослучайных, как иногда говорят знатоки этого дела :-) ).
После знакомства с основами математической статистики у многих практиков возникает желание "пощупать" такую теоретическую концепцию, как нормальное распределение. Увидеть, как будет выглядеть выборка из истинно нормальной совокупности, как лягут значения на гистограмму и так далее. С помощью INPUT PROGRAM и функции генерации случайных чисел сделать это весьма легко. Осуществим выборку 240 наблюдений из практически бесконечной генеральной совокупности, распределённой нормально с параметрами 20, 5 (т.е. со средним значением 20 и стандартным отклонением 5 единиц):
NEW FILE.
INPUT PROGRAM.
LOOP #iter=1 TO 240.
- COMPUTE id = #iter.
- COMPUTE x= RV.NORM(20,5).
- END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
GRAPH
/HISTOGRAM=x .
Роль господа Бога в данном случае сыграла функция RV.NORM, совместившая в себе действие генератора случайных чисел и заданной нами плотности вероятности. В арсенале SPSS имеется большой набор теоретических функций распределения (их можно увидеть в списке функций кнопочного меню команды COMPUTE: Transform -> Compute...), и при необходимости вы сможете создать гипотетические данные, обладающие почти любыми нужными вам свойствами. В данном примере мы заставили SPSS произвести вычисления (в том числе и генерацию случайных чисел) не с помощью EXECUTE, а с помощью запроса на построение гистограммы сгенерированной переменной. Похоже на нормальное распределение?
Содержимое структуры INPUT PROGRAM - END INPUT PROGRAM может быть очень разным. Вот лишь некоторые примеры синтаксиса из коллекции Рейналя, где встречается эта команда:
http://www.spsstools.ru/Syntax/AUC/AreaUnderTheCurveUsingTrapezoidalIntegration.txt - здесь создаётся иной, отличный от LOOP цикл: с помощью DO REPEAT выполняются однотипные вычисления для заданного массива переменных. В данном случае генерируются случайные значения из равномерной плотности распределения на участке (0, 25). Здесь запись UNIFORM(25) аналогична записи RV.UNIFORM(0, 25) в силу исторических особенностей развития программы SPSS.
А здесь http://www.spsstools.ru/Syntax/Bootstrap/GenerateRandomTriadNumbers.txt дан пример генерации файла особой структуры с использованием вложенных циклов LOOP. При этом специфическая команда LEAVE (перевод в значении "сохранить", "оставить") позволяет избежать "перепрыгивания" строк из-за вложенности циклов. Попробуйте, ради интереса, убрать строку с командой LEAVE и сравните полученный результат с результатом работы исходного синтаксиса.
http://www.spsstools.ru/Syntax/ChartsTables/BarChartsForSchoolTypesBySexWherePercentagesOfEachSexAddUpTo100Percent.txt. Этот синтаксис генерирует случайные данные дискретного характера. Демонстрируется сразу два подхода. Дихотомическую переменную удобно имитировать с помощью логического выражения, например, "inschool=UNIFORM(1)<.5." Понятно, что, поскольку функция UNIFORM(1) возвращает случайное значение из отрезка (0, 1) с равномерной плотностью, то выполнение неравенства будет происходить примерно в половине случаев. То есть вероятность того, что переменная inschool примет значение "истина" (1 в числовой записи) будет 0.5. С такой же вероятностью она принимает значение "ложь" (0 в числовой записи). Другой вариант - генерация мультиномиальной переменной через числовую с последующим отбрасыванием дробной части: "typeschl=TRUNC(1+UNIFORM(3))." Эта запись обеспечит равновероятные значения 1, 2 или 3 для целевой переменной typeschl.
Использование команды SET SEED
Команда SET SEED часто используется при генерации случайных данных. В частности, она оказывается весьма полезна тогда, когда требуется, чтобы сгенерированные переменные, с одной стороны, имели случайный характер, а с другой - могли быть в точности воспроизведены путём повторной генерации другим пользователем, в другое время, на другом компьютере и так далее. Это очень удобно во многих случаях. Допустим, вы отсылаете кому-то синтаксис генерации данных с комментариями относительно результатов работы статистических процедур на основе сгенерированных данных. Ваш коллега повторяет генерацию и может следовать вашим комментариям как будто вы работаете с одним и тем же файлом данных. Легко представить, что "другим пользователем или коллегой" можете быть вы сами, спустя какое-то время, после того как наткнётесь на ранее написанную вами же программу.
"В точности повторить случайность" оказывается возможным, если немного знать о принципе работы генератора случайных чисел. Он может использовать самые изощрённые алгоритмы рандомизации, однако в SPSS генератор начинает "плясать" от конкретного числа, которое, как я себе представляю, меняется каждый раз после запуска генератора. Если заказать программе это начальное число, или "зерно" (seed) генератора, вся процедура для одного и того же комплекса вычислений даст строго определённые результаты. Наблюдения будут вычислены независимо, случайно друг от друга, но каждый запуск генератора случайных чисел с одним и тем же параметром SEED при неизменности внешних условий будет давать одни и те же результаты. Внутри одной выборки данные будут иметь "случайный" характер, но повторные выборки будут абсолютно идентичны.
ВНИМАНИЕ! Установка начального значения генератора действует до генерации первого случайного значения. После этого начальное значение становится другим, видоизменяется по некоторому жёсткому алгоритму. Поэтому другое следующее случайное значение будет также, скорее всего, другим. Рассмотрим пример:
DATA LIST FREE / x y z.
BEGIN DATA
1 2 3 4 3 1 3 5 5 4 3 2 3 4 5 3 2 3 4 5 3 2 2 2 1 0 7
END DATA.
SET SEED = 12.
COMPUTE x = RV.NORM(0, 1).
COMPUTE y = RV.NORM(0, 1).
EXE.
Вначале мы просто создали три переменных и заполнили их какими-то значениями, после чего начинаем генерировать поверх этих переменных случайные значения из одного и того же распределения. Генератор последовательно заполняет значения x и y в каждом наблюдении случайными величинами. Начиная с генерации второго значения, параметр SEED более не равен 12, но, повторный запуск данного синтаксиса обеспечит нам точно такие же значения переменных (x = -0.24, -0.67, ...; y = 0.03, -0.08, ...), так как исходная точка была одной и той же.
Ситуация изменится, если вы измените порядок генерации наблюдений, вставив, например, между командами COMPUTE x и COMPUTE y команду EXECUTE. Этим вы заставите генератор проходить сначала полностью по переменной x, а затем - полностью по переменной y, а не последовательно x-y, x-y, ..., как это было раньше. Как результат - изменятся и значения переменных после генерации.
Таким образом, с одной стороны генератор случайных чисел даёт случайные числа, но, с другой стороны, его вычисления оказываются вполне предсказуемыми. Если есть необходимость добавить "неожиданный элемент случайности" (масло масленое, но что поделать!), вы можете "сбросить" параметр SEED в любое целое положительное число командой SET SEED = RANDOM.
Приятной вам генерации! :-)
Ведущий рассылки,
Балабанов Антон
Новое на сайте www.spsstools.ru
Переведены и добавлены следующие примеры синтаксиса:
Кластерный
анализ с матрицей схожести (частотами) на входе.SPS
Сохранить
центры из иерархического КА в качестве начальных центров для КА методом K-средних.SPS
© См. www.spsstools.ru, 2005-2006
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.others.spss Архив рассылки |
Отписаться
Вебом
Почтой
Вспомнить пароль |
В избранное | ||