Решение SPSS AnswerNet Код решения: 100000957 Заголовок: Систематический отбор с заданным размером выборки Описание: Вопрос Мне нужно сделать систематическую выборку наблюдений из файла с заданным объёмом выборки. Допустим, имеется N=10 000 наблюдений, и я хочу выборку объёмом n=500 наблюдений, т.е. отбираю одно наблюдение из каждых 20. Первое наблюдение в выборке - это наблюдение с номером K, где K - случайное число от 1 до 20. Следующее наблюдение, попадающее в выборку - это (K+20)-е наблюдение, далее - (K+40)-е и т.д. Как это сделать в SPSS или SPSS/PC+? Ответ В принципе, алгоритм отбора следующий. Приписываем каждому наблюдению его порядковый номер в файле, а также номер интервала, в который оно попадает. Длина интервала рассчитывается из соотношения L=N/n. Номер K генерируется как случайное число от 0 до L, после чего отбирается K-е наблюдение из каждого интервала. При этом число наблюдений в файле, т.е. объём генеральной совокупности, должно быть известно. Когда вы фиксируете размер выборки, величина интервала, из которого осуществляется выборка очередного наблюдения, может не быть целой величиной, если объём генеральной совокупности не кратен объёму выборки. В таком случае K тоже может оказаться нецелым числом и указывать, например, что должно быть отобрано наблюдение с номером 244.34. В таких случаях обычно округляют номер наблюдения до следующего целого значения (245 в данном случае). В деталях алгоритм таков: 1. Определим размер генеральной совокупности как число наблюдений в файле, из которого делаем выборку. Это можно сделать процедурой DESCRIPTIVES, либо автоматизировать процесс, скомбинировав команды AGGREGATE и MATCH FILES для записи размера генеральной совокупности в переменную NSIZE. Затем рассчитываем длину интервала как размер ГС, делённый на размер выборки и сохраняем результат в переменную L. 2. Записываем в переменную CASENO порядковый номер наблюдения в файле. В SPSS для этого можно использовать системную переменную $CASENUM. 3. Создадим переменную START и сделаем первым её значением случайное число между 0 и L. Скопируем это значения во все следующие наблюдения. Это константа послужит нам числом K - началом отсчёта. 4. Вычислим значения переменной INTERV, которые будут показывать, к какому интервалу длины L принадлежит каждое наблюдение. Номера интервалов начнём с 0, а не с 1. 5. Вычислим переменную SAMCASE как (L*INTERV + START). Если SAMCASE получилось нецелым, округлим его до большего целого. 6. Отберём наблюдение в выборку, если SAMCASE = CASENO. РЕАЛИЗАЦИЯ В SPSS Следующий код выполнит шаги алгоритма в версиях SPSS, начиная с 4-й, включая версии SPSS для Windows и Macintosh. Для SPSS/PC+ требуются незначительные исправления. Первая команда устанавливает датчик случайных чисел в исходное положение (в качестве его значения можно использовать дату и время). Команда EXECUTE заставляет процессор SPSS сделать проход по данным, чтобы присвоить значения CASENO всем наблюдениям перед тем, как начнётся отбор. (Иначе первое удаляемое наблюдение передаст своё значение $CASENUM переменной CASENO для следующего наблюдения, которое, таким образом, также будет удалено, передаст своё значение следующему наблюдению, и так далее...) SET SEED = 950203123 . * Сохраняем размер генеральной совокупности в переменной. COMPUTE DUM = 1. AGGREGATE OUTFILE = tsize /BREAK = DUM /NSIZE = N. MATCH FILES /FILE = * /TABLE = tsize /BY DUM. * Считаем длину интервала L (для выборки объёмом в 500 единиц в данном примере). COMPUTE L = NSIZE/500. COMPUTE CASENO = $CASENUM. * Генерируем стартовое (начальное) значение отсчёта от 0 до L. IF (CASENO = 1) START = UNIFORM(L). IF (MISSING(START)) START = LAG(START). * Вычисляем, в какой интервал попадает наблюдение. COMPUTE INTERV = TRUNC(CASENO/L). IF (INTERV = CASENO/L) INTERV = INTERV - 1. COMPUTE SAMCASE = INTERV * L + START. IF (SAMCASE > TRUNC(SAMCASE)) SAMCASE = TRUNC(SAMCASE) + 1. EXECUTE. SELECT IF (SAMCASE = CASENO). EXECUTE.