* Реструктурирование данных с сохранением группирующего параметра. **Программа составлена Рейналем Левек и применяется к обработке вопросников об оценке качества читаемых курсов **. ** (слушателей просят высказать своё согласие/несогласие с рядом утверждений, характеризующих прослушанный курс). ** Потом может быть интересно в единой таблице сопоставить распределения ответов на отдельные вопросы: ** посмотреть, какие аспекты курса нуждаются в улучшении. **Мой веб-сайт, посвящённый SPSS http://www.spsstools.net **. **Пример поддерживает группирующий признак, преобразовывая данные к "широкому" формату **. **Затем уже на "широком" массиве данных генерируется описательная статистика по каждому из заданных вопросов **. **Синтаксис генерирует отдельный отчёт для каждого значения группирующего признака **. **Данная программа может быть полезна для накопления исторической информации о качестве читаемых курсов **. PRESERVE. SET Printback=ON Length=None Width=80. DATA LIST LIST /var1(A1) vec b a (3F8.0). BEGIN DATA A 1 2 3 A 5 2 4 A 5 3 3 A 5 2 5 B 5 1 5 C 5 3 5 C 5 2 2 D 3 3 3 D 5 5 8 D 0 2 . D 1 1 1 END DATA. * Преобразуем те значения, которые выходят за пределы стандартной шкалы согласия / несогласия (от 1 до 5) в -1. * Далее -1 будет объявлен пропущенным значением. DO REPEAT var=vec TO a. IF Not Any(var, 1, 2, 3, 4, 5) var=-1. END REPEAT PRINT. SAVE OUTFILE='c:\\temp\\mydata.sav'. GET FILE='c:\\temp\\mydata.sav'. ** Определим макрос, задающий число необходимых колонок в широком файле (переменных) **. SET MPRINT=no. AGGREGATE OUTFILE=* /BREAK=var1 /n = N(var1). COMPUTE nobreak=1. AGGREGATE OUTFILE=* /BREAK=nobreak /n = MAX(n). DO IF $CASENUM=1. WRITE OUTFILE='c:\\temp\\define n.sps' /'DEFINE !n()'n'!ENDDEFINE.'. END IF. EXECUTE. INCLUDE FILE='c:\\temp\\define n.sps'. ** Теперь определим макрос, который реструктурирует данные из "высокого" формата в "широкий" **. *////////////. DEFINE !flip(!POS=!TOKENS(1) /!POS=!TOKENS(1) /vnames=!CMDEND) GET FILE='c:\\temp\\mydata.sav'. AUTORECODE VARIABLES=var1 /INTO var1num. !LET !nbvar=!NULL !DO !var !IN (!vnames) /* Считаем число переменных */ !LET !nbvar=!CONCAT(!nbvar,"1") /* создаём нумерованные имена переменных (вектор) */ - STRING !CONCAT('vname',!LENGTH(!nbvar)) (A8). - COMPUTE !CONCAT('vname',!LENGTH(!nbvar))=!QUOTE(!var). /* Запоминаем имя последней переменной */ !LET !lastnam=!var !DOEND !LET !nbvar=!LENGTH(!nbvar) VECTOR vname=vname1 TO !CONCAT('vname',!nbvar) /v=!HEAD(!vnames) TO !lastnam. STRING vname(A8). LOOP cnt=1 TO !nbvar. - COMPUTE c=v(cnt). - COMPUTE vname=vname(cnt). - COMPUTE vnameidx=cnt. - DO IF NOT SYSMIS(c). - XSAVE OUTFILE='c:\\temp\\temp.sav' /KEEP=var1 vname vnameidx c var1num. - END IF. END LOOP. EXECUTE. GET FILE='c:\\temp\\temp.sav'. SORT CASES BY vnameidx var1. COMPUTE casen=$CASENUM. RANK VARIABLES=casen(A) BY vnameidx !1 /RANK INTO idx . VECTOR c(!n). COMPUTE c(idx)=c. AGGREGATE OUTFILE=* /PRESORTED /BREAK=vnameidx var1num /var1 vname c1 TO !CONCAT('c',!n)=FIRST(var1 vname c1 TO !CONCAT('c',!n)). ADD FILES FILE=* /DROP=vnameidx !1. EXECUTE. !ENDDEFINE. *////////////. ** Вызовем макрос для выполнения преобразований **. SET MPRINT=yes. !flip var1num var1 vnames=vec b a. SET MPRINT=no. *Переименовываем переменные. RENAME VARS (VNAME C1 C2 C3 C4 = ITEM V1 V2 V3 V4). EXECUTE. ** Теперь определим макрос для вычисления описательной статистики **. *////////////////////. DEFINE !doit(nb=!TOKENS(1)) !LET !vlast=!CONCAT(v,!nb) VECTOR v=v1 TO !vlast. MISSING VALUES v1 TO !vlast (-1). DO REPEAT cnt=1 TO 5 /c=c1 TO c5 /Nc=Nc1 TO Nc5. . COUNT c=v1 TO !vlast (cnt). . COUNT Nc=v1 TO !vlast (cnt). . COMPUTE mean=MEAN(v1 TO !vlast). . COMPUTE SD=SD(v1 TO !vlast). . COMPUTE n=NVALID(v1 TO !vlast). . COMPUTE c=c/n*100. . COMPUTE NMis=NMIS(v1 TO !vlast). . FORMATS c(PCT4.0) NMis Nc(COMMA8). END REPEAT PRINT. *STRING Item(A4). *COMPUTE Item = SUBSTR(case_lbl,2,2). FORMATS n(COMMA8) mean (F8.2) sd (F8.2). VARIABLE LABEL mean "Среднее" Nc1 "Полн. несогл." Nc2 "Несогл." Nc3 "Нейтр." Nc4 "Согл." Nc5 "Полн. согл." c1 "Полн. несогл.%" c2 "Несогл.%" c3 "Нейтр.%" c4 "Согл.%" c5 "Полн. согл.%" NMis "Пропуски". !ENDDEFINE. *//// ///// //////. * Вызов макроса, вычисляющего статистику. SET MPRINT=yes. !doit nb=!n. SET MPRINT=no. SORT CASES BY VAR1 ITEM. EXECUTE. SPLIT FILE SEPARATE BY var1. Report /FORMAT= CHWRAP(ON) PREVIEW(OFF) CHALIGN(BOTTOM) UNDERSCORE(ON) ONEBREAKCOLUMN(OFF) CHDSPACE(1) SUMSPACE(0) AUTOMATIC LIST BRKSPACE(-1) PAGE(1) MISSING'.' LENGTH(1, 71) ALIGN(LEFT) TSPACE(1) FTSPACE(1) MARGINS(1,101) /TITLE= CENTER 'Отчёт по тестам' ')Год (может быть передан через скрипт, см. комм. ниже)' 'Статистика по вопросам*' LEFT '' /FOOTNOTE= LEFT '* Среднее основано на порядковой шкале, где 5=полное согласие; 4=согласие; 3=неопределённость; 2=несогласие; 1=полное несогласие;' ' SD=Стандартное отклонение (SD показывает изменчивость рейтингов); N=число действительных ответов на данный вопрос;' ' Пропуски=число пропущенных ответов (из-за неприменимости вопросов, неотвеченных вопросов и нераспознанных сканером ответов);' ' Статистика строится на основе действительных ответов студентов, пропуски исключаются из расчёта статистик;' ' Непосредственно число выборов каждой из градаций вопроса можно определить, исходя из представленных процентов, учтя число действительных ответов.' /VARIABLES mean (VALUES) (RIGHT) (OFFSET(0)) (4) sd (VALUES) (RIGHT) (OFFSET(0)) (4) n (VALUES) (RIGHT) (OFFSET(0)) (4) nmis (VALUES) (RIGHT) (OFFSET(0)) (5) SEP1(DUMMY) (3) ' ' c5 (VALUES) (RIGHT) (OFFSET(0)) (5) c4 (VALUES) (RIGHT) (OFFSET(0)) (5) c3 (VALUES) (RIGHT) (OFFSET(0)) (5) c2 (VALUES) (RIGHT) (OFFSET(0)) (5) c1 (VALUES) (RIGHT) (OFFSET(0)) (5) /BREAK item (LABELS) (LEFT) (OFFSET(0)) (10) . SPLIT FILE OFF. **Возможные дополнения. Указанные ниже скрипты помогут сэкономить время на подготовку отчётов **. **Первое: поскольку данные пример может быть полезен для добавления фрагментов данных в более крупный (основной) файл, ** полезным будет добавление переменной с указанием на время, к которому относятся фрагменты данных. ** Начать выполнение синтаксиса можно с вызова скрипта, который запрашивает время, к которому относятся данные (например, год и месяц), ** после чего создаёт макрос !fy, содержащий это значение. Вы можете дополнить синтаксис командой, создающей переменную var со значением ** !fy, после чего информация о времени может быть помещена в заголовок отчёта посредством ** указания строки ')var' в синтаксисе, где var - имя переменной, содержащей информацию о времени **. **См. скрипт Рейналя Левека: http://www.spsstools.net/Scripts/dialogs/GetFyFromUserThenRunSyntax.txt **. **Где-то в начале вашей программы поместите команду, подобную той, что приведена ниже, с указанием пути к файлу скрипта **. **SCRIPT FILE='C:\\--(укажите путь к файлу .sbs)--\\GetFyFromUserThenRunSyntax.sbs'. **. ** Указанная версия скрипта пытается вызвать синтаксис report.sps после своего завершения. Можно поправить скрипт так, ** чтобы этого вызова не происходило - примеч. перев. **Второе: Можно использовать скрипт SPSS Clean Viewer для удаления ненужных частей выдачи **. **См.: http://www.spsstools.net/Scripts/OutputDoc/DeleteStatisticsAndCaseProcessingSummary.txt **. **Вызов:. **SCRIPT FILE='C:\\--(подставьте сюда нужный путь к файлу)--\\Clean Viewer.sbs'. **. **Третье: Можно использовать скрипт, экспортирующий выдачу в MS Word для распечатки **. **См. скрипт Рейналя Левека: http://www.spsstools.net/Scripts/ImportExport/ExportVisibleOutputToWordViaHTML.txt **. *Четвёртое: если вся выдача направляется одному и тому же человеку, можно использовать скрипт, который направляет всю выдачу по указанному адресу **. **См. скрипт Рейналя Левека: http://www.spsstools.net/Scripts/ImportExport/SendDocumentByEmail.txt **. *Следующая команда восстанавливает исходные установки системы SPSS, сохранённые в начале. RESTORE.