Генерация случайных переменных многомерного гипергеометрического распределения
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 ] . |