* Опубликован: 30.12.2005.
Solution ID: 100000322
Подтип вопроса: Статистические распределения
Заголовок:
Генерация переменных многомерного гипергеометрического распределения в SPSS
Описание:
Вопрос:
Как можно сгенерировать в SPSS переменные многомерного гипергеометрического распределения с заданным количеством наблюдений?
Ответ:
Если вы делаете выборку объёма n БЕЗ возвращения из генеральной совокупности (ГС) с k классами объектов, где k>2, вектор из k чисел (количества объектов каждого класса, отобранных из совокупности), имеет многомерное гипергеометрическое распределение.
Следующий макрос генерирует наблюдения и переменные многомерного гипергеометрического распределения. Вы указываете число наблюдений, которое необходимо сгенерировать (ncases), количество классов объектов в ГС (classes), количество объектов n, которое надо выбирать для каждого случая (samsize) и размеры каждого класса в ГС (popc). Алгоритм похож на прямой метод отбора из урны, генерирующий мультиномиальное распределение (см. Johnson, N. L., Kotz, S.,
& Balakrishnan, N. (1997). "Discrete Multivariate Distributions", Wiley).
1. Размеры классов в ГС (pop1 – popk) берутся из соответствующих компонент параметра popc и численность каждого класса в выборке sam1 – samk устанавливаются равным 0. Размер ГС вычисляется как сумма pop1 – popk и сохраняется в переменной poptot.
2. Для каждого из samsize элементов для каждого случая вычисляются:
а) Вычисляется дискретная случайная переменная с равномерным распределением на участке от 1 до poptot и сохраняется в Y.
б) Для каждого из k классов последовательно вычисляется переменная psum как сумма численностей классов в ГС, рассмотренных к настоящему моменту. Если Y оказывается меньше или равной psum, но больше, чем psum для предыдущего класса, наблюдение считается отобранным из текущего класса. Объём выборки из этого класса увеличивается на 1 и размер ГС уменьшается на 1, так же как и переменная poptot (обратите внимание, что psum не уменьшается, поэтому нет риска того, что одно и то же значение Y будет соответствовать двум смежным классам).
* макрос для генерации многомерного гипергеометрического распределения.
* В первом вызове задаются 3 класса с размерами классов 50, 30 и 20.
* отбираются 25 объектов без возвращения и
* sam1 - sam3 содержат соответствующие частоты.
* генерируется 200 наблюдений.
* Второй пример задаёт 4 класса с размерами в ГС 20, 10, 30 и 20.
* отбирается 30 объектов без возвращения и
* sam1 - sam4 содержат соответствующие частоты.
* генерируется 300 наблюдений.
* .
*************************************************************.
define mvhypgen
(ncases = !tokens(1)
/classes = !tokens(1)
/samsize = !tokens(1)
/popc = !enclose('[',']') ).
new file.
input program .
loop id = 1 to !ncases .
vector pop sam (!classes , F8).
+ do repeat popn = pop1 to !concat('pop',!classes)
/samn = sam1 to !concat('sam',!classes)
/pc = !popc .
+ compute popn = pc.
+ compute samn = 0.
+ end repeat.
+ compute poptot = sum(pop1 to !concat('pop',!classes)).
+ loop #j = 1 to !samsize .
+ compute y = trunc(uniform(poptot)) + 1.
+ compute psum = 0.
+ loop #k = 1 to !classes .
+ compute psum = psum + pop(#k).
+ do if (y le psum and y gt (psum - pop(#k))).
+ compute sam(#k) = sam(#k) + 1.
+ compute pop(#k) = pop(#k) - 1.
+ compute poptot = poptot - 1.
+ end if.
+ end loop.
+ end loop.
+ end case.
end loop.
end file.
end input program.
execute.
!enddefine .
mvhypgen ncases = 200 classes = 3 samsize = 25
popc = [ 50 30 20 ] .
mvhypgen ncases = 300 classes = 4 samsize = 30
popc = [ 20 10 30 20 ] .