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
* Тема: Замена пропусков средним значением по наблюдению.
* Ключевые слова: пропущенные значения, макрос, макроаргументы.
* Опубликован: 09.03.2008.
* Автор: Ray.
* Перевод: А. Балабанов.
* Размещение: http://www.spsstools.ru/Syntax/WorkWithMissing/ReplaceMissingWithMean.txt (.sps).

*(Вопрос) Автор вопроса как-то прислал мне следующий макрос (тогда в нём
	отсутствовали первые 4 строки после его определения).
	Макрос заменяет пропущенные значения величинами, полученными
	при усреднении значений остальных переменных в данном наблюдении
	(переменные указываются при вызове макроса). Причем замена происходит
	при определенных условиях.
	Технически вопрос следующий: передаваемый набор аргументов
	(имен переменных) в ходе обработки надо трансформировать так, чтобы между ними
	появились запятые. 

*(Ответ) Размещен в SPSSX-L 04.11.2002. Автор: Ray; веб-сайт www.spsstools.net .
* Необходимые преобразования над аргументами делают добавленные 4 строчки в начале макроса
  (!LET - !DOEND).
* В конце макрос подсчитывает сумму значений в тех наблюдениях, где производились замены.
* Пример файла данных не приводится.

* Исходный макрос видоизменен так, что замена пропусков происходит лишь в том случае, когда
  число пропущенных значений в наблюдении не превосходит 75% от числа указанных переменных - А.Б.
* Проставить запятые между аргументами может потребоваться, например, для использования списка 
  переменных в некоторых функциях (SUM и др.) - А.Б.

SET MPRINT=no.
define impute (!positional !enclose ('(',')'))

!LET !varlist=!HEAD(!1)
!DO !var !IN (!TAIL(!1))
!LET !varlist=!CONCAT(!varlist,',',!var)
!DOEND

COUNT  #mitems = !1  (MISSING).
COUNT  #items  = !1  (lo thru hi).
compute #diff = #mitems /(#mitems+#items).
DO IF (#diff LT .75).
compute #FILL = MEAN(!varlist).
DO REPEAT x = !1.
if missing(x) x = #fill.
END REPEAT.
compute scale1 = SUM(!varlist ).
END IF.
EXECUTE .

!enddefine.
******************************************************************.

SET MPRINT=yes.
* ВЫЗОВ макроса
impute (q2a q2b q2c q2d q2e).