* Тема: Замена пропусков медианным значением по наблюдению. * Ключевые слова: пропущенные значения, макрос, медиана, 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.