Заменить пропущенные значения медианой по строке
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 | ************************************************. * Синтаксис замены пропущенных значений медианой из непропущенных значений в строке. * Автор: Raynald Levesque. ************************************************. * Синтаксис может выдавать предупрежения в том случае, если в наблюдении нет пропусков, а, значит, процедура 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 в данном случае). * удалите эти колонки из главного файла и сохраните его с именем 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. |
Related pages
...