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
73
74
75
76
77
* Тема: Замена пропусков медианным значением по наблюдению.
* Ключевые слова: пропущенные значения, макрос, медиана, FLIP, RMV.
* Опубликован: 09.03.2008.
* Автор: Raynald Levesque, rlevesque@videotron.ca.
* Перевод: А. Балабанов.
* Размещение: http://www.spsstools.ru/Syntax/WorkWithMissing/ReplaceMissingByMEDIANvaluesWithinEachCase.txt (.sps).

/************************************************.
* Синтаксис заменяет пропущенные значения ("миссинги") медианой, вычисленной по 
  значениям без пропусков в пределах каждого наблюдения.
* Raynald Levesque rlevesque@videotron.ca
************************************************/.

* При обработке наблюдений без пропусков возникают предупреждения, так как 
  команда RMV не срабатывает. Предупреждения можно проигнорировать.

SET MPRINT=on.

* Файл примера для иллюстрации работы синтаксиса.
NEW file.
INPUT PROGRAM.
SET SEED=98675423.
VECTOR q(8F8.2).
LOOP id=1 TO 25.
	LEAVE id.
	LOOP #cnt=1 TO 8. 	
*		приблизительно 10% ответов должны иметь пропуски. 		
		IF UNIFORM(1)<.9 q(#cnt)=1+TRUNC(UNIFORM(9)).
	END LOOP.
	END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
EXECUTE.
LIST.

*Предположим, не ограничивая общности, что все переменные у нас числовые.
*Если это не так: 
*	Сохраните числовые переменные, нуждающиеся в обработке, в отдельном файле ("NC") вместе с идентификационной переменной (id).
*	Удалите сохраненные во внешний файл переменные из главного файла (оставив id) и сохраните результат в файл "FILEB".
*	примените приведенный ниже код к файлу "NC".
*	"слейте" результат с файлом "FILEB". 

*Создадим переменную, которая потребуется нам после транспонирования файла данных (команда FLIP).
STRING nnames(A8).
COMPUTE cn=$casenum.
COMPUTE nnames=CONCAT('v',LTRIM(STRING(cn,F6.0))).
EXECUTE.

* Определим макрос, который будет заменять пропущенные значения.

*/////////////////////////////////////////////////////.
DEFINE !doit (nbvar=!TOKENS(1)).
FLIP /NEWNAMES=nnames.
VECTOR !CONCAT('r(',!nbvar,'F8)').

SUMMARIZE
  /TABLES=v1 TO !CONCAT(v,!nbvar)
  /FORMAT=NOLIST TOTAL
  /TITLE='Выведем медианы на печать для проверки'
  /MISSING=VARIABLE
  /CELLS=MEDIAN .

!DO !cnt=1 !TO !nbvar 
RMV !CONCAT(r,!cnt) = MEDIAN(!CONCAT(v,!cnt,',ALL)').
!DOEND

MATCH FILES FILE=* /KEEP=case_lbl r1 TO  !CONCAT(r,!nbvar).
FLIP.
*### В следующей строке 8 - число переменных в исходном файле данных. 
MATCH FILES FILE=* /KEEP=q1 TO  q8 id.
!ENDDEFINE.
*/////////////////////////////////////////////////////.

*### При вызове макроса значение 25 означает число наблюдений в исходном файле данных.
!doit nbvar=25.
LIST.