Случайно отобрать x% наблюдений из каждой страты
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 | *(Вопрос) Как можно отобрать x% наблюдений из каждой страты? Я не знаю ни числа наблюдений в каждой страте, ни общего числа наблюдений. *(Ответ) Отправлен по электронной почте автору вопроса в декабре 2001 года. Автор: rlevesque@videotron.ca. * Для наглядности создадим пример данных. NEW FILE. INPUT PROGRAM. LOOP H=1 TO 10. * допустим, минимальное число наблюдений в страте (hn) равно 15. COMPUTE hn=15 + TRUNC(UNIFORM(25)). LEAVE h hn. LOOP id=1 TO hn. + COMPUTE val=UNIFORM(100). + END CASE. END LOOP. END LOOP. END FILE. END INPUT PROGRAM. LIST. FREQ VAR=hn. SET MPRINT=no. * Решение. * (весь приведённый выше код вы заменяете просто инструкцией GET FILE, загружающей ваши данные). * Определим макрос, который выполнит все нужные действия. *////////////////////////. DEFINE !sample (hvar=!TOKENS(1) /frac=!TOKENS(1)) /* Подсчитаем число наблюдений в каждой страте */. /* (полагаем, что переменной hn не существует) */. COMPUTE nobreak=1. RANK VARIABLES=nobreak BY !hvar /N INTO hn2. * Подсчитаем общее число наблюдений (N). RANK VARIABLES=!hvar BY nobreak /N INTO n. * Подсчитаем размер выборки (ssize) из каждой страты (округлено до ближайшего целого). COMPUTE ssize=RND(!frac*hn2). COMPUTE draw=UNIFORM(1). RANK VARIABLES=draw BY !hvar /RANK INTO rdraw. EXECUTE. * Осуществим выборки. SELECT IF (rdraw <= ssize). !ENDDEFINE. *////////////////////////. * Использование макроса. * Здесь стратифицирующая переменная называется h, а доля, подлежащая выборке, равна 20%. SET MPRINT=yes. !sample hvar=h frac=.2. * Следующая строка просто чтобы проверить успешность отбора. SORT CASES BY h rdraw. |