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.