1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
* Опубликован: 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 ] .