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
* Тема: Замена пропущенных значений методом "hot deck" в пределах каждой страты.
* Ключевые слова: пропущенные значения, случайное значение, hot deck.
* Автор: Th. van der Weegen (Католический университет); T.vanderWeegen@maw.ru.nl .
* Перевод: А. Балабанов.
* Создан: 24.03.2006.
* Размещение: http://www.spsstools.net/Syntax/WorkWithMissing/hotdeck.txt (.sps).

* Метод "hot deck" (метод "рабочей колоды карт") заключается в поиске донорского значения
  для пропущенного в том же массиве данных. Принцип поиска может различаться
  в зависимости от конкретной реализации метода. Согласно статье Wikipedia
  (http://en.wikipedia.org/wiki/Imputation_(statistics)) термин возник в "эпоху
  перфокарт", когда массив данных представлял собой набор карт с перфорацией.  
* В данном примере пропущенному значению случайным образом сопоставляется валидное 
  значение из той же группы наблюдений (с тем же значением переменной stratum) - А.Б.

* Считаем пример данных.
get file='c:\\program files\\spss\\Employee data.sav'.

* Сымитируем несколько пропущенных значений.
* В данном файле у переменной salary значение 0 соответствует коду 
  пропущенного значения - А.Б.
IF RANGE(id,1,40) salary=0.
RENAME variables (id,jobcat,salary=respnr,stratum,x).
match files file=*  /keep=respnr,stratum,x.
descriptives var=x.

* Подготовка данных.
recode x (missing=1)(else=0) into xnew.
recode x (missing=1)(else=0) into xmis.
compute seqnbeg=$casenum.
* seqnbeg необходима для восстановления исходного порядка следования наблюдений.
sort cases by stratum,xmis,seqnbeg.
compute #strat=lag(stratum).
if ($casenum=1 or #strat ne stratum) seqnstr=1.
compute #volg=lag(seqnstr).

do if (missing(seqnstr)).
+ compute seqnstr=#volg+1.
end if.
formats seqnbeg,seqnstr(f7.0).

* подсчитываем число валидных значений по переменной x в каждой страте (подгруппе).

aggregate outfile='$hot.sav' /presorted /break=stratum /stratn=n(stratum)
   /stratm=nmiss(x).
match files table='$hot.sav' /file=* /by stratum 
  /keep=respnr,stratum,x,seqnbeg,seqnstr,xnew,xmis,stratn,stratm.


* Если значение пропущено, сопоставляем ему некоторый номер наблюдения из той же страты.
if (xmis=1) seqnstr=trunc(1+uniform(stratn-stratm)).


* Сопоставляем непосредственно значения.

sort cases by stratum,seqnstr,xnew.
do if (xnew=0).
+ compute xnew=x.
else if (seqnstr=lag(seqnstr) and stratum=lag(stratum)). 
+ compute xnew=lag(xnew).
else.
+ compute xnew=$sysmis.
end if.


* Сохраним результат с исходной последовательностью наблюдений и переменными.

sort cases by seqnbeg.
compute x=xnew.
descriptives var=x.
save outfile='hotresult.sav' /keep=respnr,stratum,x.