Об одной особенности генерации случайных выборок в SPSS
При необходимости моделирования случайности (случайных значений,
случайного порядка, случайной выборки и т.д.), в программных продуктах типа
SPSS так или иначе приходится обращаться к программному генератору случайных
чисел. В SPSS для генерации случайных чисел доступно несколько классов распределений.
Например, функция RV.NORM(0,1) возвращает одно значение случайной величины,
имеющей стандартное нормальное распределение. Хотя генератор возвращает "как
бы случайные" числа, на самом деле в его основе лежит вполне определённый
алгоритм. В результате, если вы с помощью генератора осуществляете одни и те
же действия в одной и той же последовательности с одним и тем же набором данных,
всякий раз вы будете получать одни и те же результаты, ЕСЛИ ТОЛЬКО исходное
состояние генератора будет одним и тем же. Это исходное состояние (читай - число)
можно посмотреть командой синтаксиса SHOW SEED. К вопросу о начальном значении
(SEED) генератора мы уже обращались ранее, в третьем выпуске рассылки. Там мы
подчёркивали принципиальную возможность точного воспроизведения как бы случайного
процесса путём запоминания и последующей установки начального значения генератора
(например, инструкцией SET SEED = x.), где x - некоторое целое
число от 1 до 2 000 000 000. Там же мы указали и на возможность случайного сброса
начального значения при необходимости (инструкция SET SEED = RANDOM.)
Вернуться к этой теме меня побудил вопрос подписчика, который
заметил некорректную работу синтаксиса "Генерация
случайных телефонных номеров.sps": по заданному файлу с интервалами
телефонных номеров на нескольких АТС синтаксис всякий раз формировал одну и
ту же "случайную" выборку для телефонного опроса. Я проверил это замечание,
сгенерировав подряд несколько выборок. Выборки получались разными, но результаты
первой выборки у меня совпали с результатами выборки, присланной подписчиком!
Это говорило о том, что причина одинаковых выборок у автора вопроса была, скорее,
не в программном коде, а в одинаковом начальном значении генератора случайных
чисел в его системе. Действительно, оказалось, что повторная генерация выборки
в его случае производилась уже в другой сессии SPSS (например, после закрытия
программы и повторного её запуска). Разумеется, в практике именно такая ситуация
и будет самой распространённой. Но при запуске SPSS устанавливает параметр SEED,
как правило, в одно и то же значение: 2 000 000. А это значит, что, если до
генерации телефонной выборки с помощью данного кода генератор случайных чисел
не использовался, его начальное значение будет одинаковым, что, на одних и тех
же входных данных даст всегда один и тот же результат. Моей рекомендацией было
добавление в начало кода генерации строки SET SEED = RANDOM., что гарантирует
случайную выборку, отличную от предыдущей (более аккуратным вариантом было бы
указание в качестве начального значения, скажем, даты генерации выборки: 25112006,
если повторная выборка генерируется в другой день).
Кстати, с 13-й версии SPSS предлагает 2 варианта генераторов случайных
чисел. По умолчанию используется "старый" вариант, совместимый с SPSS
12 и ранними версиями. Новый (Meinner Twister) генератор, по утверждению документации,
больше подходит для имитационного моделирования, и его результаты не могут быть
воспроизведены с помощью старого генератора. Генераторы имеют разные параметры
для установки начальных значений. SEED - параметр "старого" варианта,
MTINDEX - параметр "нового" варианта. В отличие от SEED, параметр
MTINDEX может принимать практически любое значение: положительное, нулевое,
отрицательное, дробное. Выбор активного генератора возможен инструкцией SET
RNG:
SET RNG = MC. /* включает старый генератор */
SET RNG = MT MTINDEX = -1.23 /* включает новый генератор и устанавливает
его начальное значение как -1.23 */
SHOW RNG SEED /* покажет активный генератор и начальное значение
генератора MC */
Возможность просмотреть начальное значение для MT-генератора командой
SHOW MTINDEX пока отсутствует. Работа активного генератора не изменится после
установки "чужого" начального значения (например, установка MTINDEX
= 3 не повлияет на работу генератора MC).
Как и для SEED, умолчанием MTINDEX чаще всего является число 2
000 000. Возможна его установка в положение RANDOM. При перезапуске сессии SPSS
активным является тот же генератор, который был выбран таковым в предыдущей
сессии, но начальное значение при перезапуске всегда одно и то же. И об этом,
как мы проиллюстрировали разобранной здесь ситуацией, полезно помнить.