* Тема: Замена пропущенных значений методом "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.