* Сохраните этот файл как "C:\temp\dograph.sps". * Автор: Raynald Levesque, rlevesque@videotron.ca, 9 декабря 2000. * Макрос строит гистограммы одинакового масштаба по одной штуке на каждую категорию группирующей переменной. Работает в паре с шаблоном графика dograph.sct (для использования в версиях SPSS до 11 включительно) - А.Б. */////////////////////////////////////////////////////////. DEFINE !dograph(cat=!TOKENS(1) /val=!TOKENS(1) /nbbins=!TOKENS(1) /title=!TOKENS(1)) * Загружаем нужный файл данных и затем вызываем этот макрос. * cat - имя переменной, содержащей категории (на каждую категорию по отдельной гистограмме). * val - имя переменное, чьи значения будет содержать гистограмма. * nbins - желаемое число столбцов в гистограмме. * title - просто заголовок для графика. * В данном синтаксисе:. * no_data=0 означает, что соответствующее наблюдение - это реальные данные.. * no_data=1 означает, что соответствующее наблюдение было создано искусственно, чтобы иметь один и тот же масштаб по x и y на всех графиках. COMPUTE no_data=0. * Добавляем к каждому наблюдению файла минимальное и максимальное значения для !val и для !cat. AGGREGATE /OUTFILE='C:\temp\min and max.sav' /BREAK=no_data /minv = MIN(!val) /maxv = MAX(!val) /mincat1=MIN(!cat) /maxcat1=MAX(!cat). MATCH FILES /FILE=* /TABLE='C:\TEMP\min and max.sav' /BY no_data. * Определяем шаг (delta) значений по оси x между двумя последовательными столбцами гистограммы и затем через вспомогательный макрос приписываем каждому наблюдению номер столбца, куда оно попадает на будущей гистограмме. COMPUTE delta=TRUNC(1+(maxv-minv)/!nbbins). FORMATS delta maxcat1 mincat1(F8.0). * Определим макросы для последующих операций со значениями delta,mincat1 и maxcat1. DO IF $CASENUM=1. WRITE OUTFILE='C:\temp\macros1.sps' /"DEFINE !mincat1()"mincat1"!ENDDEFINE." /"DEFINE !maxcat1()"maxcat1"!ENDDEFINE." /"DEFINE !delta()"delta"!ENDDEFINE.". END IF. EXECUTE. INCLUDE FILE='C:\temp\macros1.sps' . COMPUTE value2 = RND(!val/delta)*delta. XSAVE OUTFILE='c:\temp\data1.sav'. * Подсчёт числа наблюдений в каждом столбце и максимальной частоты столбца в графике для каждой категории. AGGREGATE /OUTFILE=* /BREAK=!cat value2 /N = N(value2). COMPUTE no_data=0. AGGREGATE /OUTFILE='c:\temp\max count per bin.sav' /BREAK=no_data /maxn = MAX(n) /maxval2=MAX(value2) /minval2=MIN(value2). MATCH FILES /FILE=* /TABLE='c:\temp\max count per bin.sav' /BY no_data. * Определим 2 макроса, из которых потом считаем минимальное и максимальное значения value2. DO IF $CASENUM=1. FORMATS maxval2 minval2 (F8.0). WRITE OUTFILE='C:\temp\macros2.sps' /"DEFINE !maxval2()"maxval2"!ENDDEFINE." /"DEFINE !minval2()"minval2"!ENDDEFINE.". END IF. EXECUTE. INCLUDE FILE='C:\temp\macros2.sps' . * Теперь приступим к определению "фиктивных" наблюдений. * Их цель - подогнать все графики под один и тот же масштаб по осям x и y. COMPUTE no_data=1. * Добавляем нужное количество фиктивных наблюдений к реальным значениям value2, чтобы суммарное количество фиктивных и реальных наблюдений совпадало с максимальной частотой столбца. COMPUTE wgt=maxn-n. DO IF wgt>.1. XSAVE OUTFILE='c:\temp\new cases.sav' /KEEP=!cat value2 no_data wgt. END IF. EXECUTE. NEW FILE. GET FILE='c:\temp\new cases.sav'. * Заполняем "пустоты" в value2 (создаём и добавляем одно фиктивное наблюдение в каждый пустой до настоящего времени столбец). DO IF $casenum=1. - LOOP categ=!mincat1 TO !maxcat1. - LOOP varx=!minval2 TO !maxval2 BY !delta. - XSAVE OUTFILE='c:\temp\fill gaps.sav' /KEEP=categ varx /RENAME=(categ=!cat)(varx=value2). - END LOOP. - END LOOP. END IF. EXECUTE. MATCH FILES FILE=* /BY !cat /FIRST=first /DROP=categ varx. EXECUTE. * Достаточно сохранить первый фиктивный случай для каждой категории чтобы "стандартизировать" ось y. SELECT IF first. ADD FILES /FILE=* /IN=compl /FILE='C:\TEMP\data1.sav' /IN=data1 /RENAME (id maxv minv mincat1 maxcat1 delta = d0 d1 d2 d3 d4 d5) /FILE='c:\temp\fill gaps.sav' /IN=fill_gap /DROP= d0 d1 d2 d3 d4 d5. * пропущенное значение no_data означает, что наблюдение фиктивное; пропущенное значение веса wgt означает, что вес равен 1. RECODE wgt no_data (SYSMIS=1) (ELSE=COPY) . WEIGHT BY wgt. SORT CASES BY !cat. SPLIT FILE BY !cat. FORMATS value2 (F8.0). VARIABLE LABEL value2 !QUOTE(!val). GRAPH /TEMPLATE='c:\temp\dograph.sct' /BAR(STACK)=COUNT BY value2 BY no_data /MISSING=REPORT /TITLE=!title. !ENDDEFINE. *\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.