Данный пример включает 3 раздела:

  • Исходный вопрос
  • Размещённый ответ
  • Комментарии к использованию макроса

Исходный вопрос

Я строю большое количество столбиковых диаграмм (bar charts). Из каждой диаграммы я должен исключить категории, в которые попало менее 10 студентов. Я сейчас запускаю частотный анализ, а затем вручную удаляю те категории, которые должны быть пропущены. Но мне кажется, есть лучший способ решить эту проблему. Буду рад вашим предложениям.

Размещённый ответ

DATA LIST LIST /age prog year.
BEGIN DATA
25 1 2
25 1 2
25 1 2
25 1 2
25 1 4
25 1 4
25 1 4
25 1 4
25 1 4
25 1 4
25 1 7
25 1 7
25 1 7
25 1 7
25 1 2
26 1 2
27 2 1
27 2 1
27 2 1
27 2 1
27 2 1
27 2 1
END DATA.

COMPUTE dummy=1.
SET MPRINT=no.

*////////////////////.
DEFINE !chart (minnb=!TOKENS(1) /cat=!TOKENS(1))
FILTER OFF.
* Сортировка необходима для команды MATCH FILES.
SORT CASES BY !cat.
!LET !fname=!QUOTE(!CONCAT('C:\temp\',!cat,'.SAV'))
AGGREGATE
    /OUTFILE=!fname
    /PRESORTED
    /BREAK=!cat
    /nb = N(dummy).
MATCH FILES /FILE=*
    /TABLE=!fname
    /BY !cat.
FREQUENCY VARIABLES=!cat.
COMPUTE flag=(nb>=!minnb).
FILTER BY flag.
GRAPH
    /BAR(SIMPLE)=COUNT BY !cat
    /MISSING=REPORT.
* Удаляем переменную nb.
MATCH FILES FILE=* /DROP=nb.
!ENDDEFINE.
*////////////////////.

SET MPRINT=yes.
!chart minnb=5 cat=age.
!chart minnb=6 cat=prog.
!chart minnb=5 cat=year.

* Этот метод подходит, если между печатью графиков вам ещё что-то требуется делать 
  и корректировать.

* Следующий макрос годится, если вам нужно печатать серию графиков с одним и тем же
  минимальным порогом для включения категории в график.

SET MPRINT=no.

*////////////////////.
DEFINE !chart2 (minnb=!TOKENS(1) /cats=!CMDEND)
/* minnb = минимальная частота категории для отображения*/.
/* cats    = имена переменных с категориями, для которых надо построить графики*/.
COMPUTE dummy=1.
!DO !cat !IN (!cats)
FILTER OFF.
* Сортировка необходима для команды MATCH FILES.
SORT CASES BY !cat.
!LET !fname=!QUOTE(!CONCAT('C:\temp\',!cat,'.SAV'))
AGGREGATE
    /OUTFILE=!fname
    /PRESORTED
    /BREAK=!cat
    /nb = N(dummy).
MATCH FILES /FILE=*
    /TABLE=!fname
    /BY !cat.
FREQUENCY VARIABLES=!cat.
LIST.
COMPUTE flag=(nb>=!minnb).
FILTER BY flag.
GRAPH
    /BAR(SIMPLE)=COUNT BY !cat
    /MISSING=REPORT.
* Удаляем переменную nb.
MATCH FILES FILE=* /DROP=nb.
!DOEND
* Удаляем переменную dummy.
MATCH FILES FILE=* /DROP=dummy.
!ENDDEFINE.
*///////////////////

SET MPRINT=yes.
!chart2 minnb=5 cats= age prog year.
EXECUTE.

Комментарии к использованию макроса

Для краткости я прокомментирую ответ с первым макросом (он называется !chart). (Последовательность действий для второго макроса такая же).

1. Запустите SPSS

2. Откройте (загрузите) свои данные через меню: File>Open>Data

3. Откройте редактор синтаксиса через меню: File>New>Syntax

4. Выделите синтаксис для макроса !chart и поместите его в редактор синтаксиса.

Макрос — это часть присланного синтаксиса, начинающаяся с

*////////////////////.

DEFINE !chart (minnb=!TOKENS(1) /cat=!TOKENS(1))

и заканчивающаяся инструкциями

!ENDDEFINE.

*////////////////////.

SET MPRINT=yes.

!chart minnb=5 cat=age.

5. Комментарии: сам макрос заканчивается командой !ENDDEFINE. Инструкция SET MPRINT=yes нужна просто для того, чтобы вы видели код макроса в окне результатов.

Строчка !chart minnb=5 cat=age — это уже вызов макроса. Она означает: выполнить макрос chart (построить диаграмму), используя переменную age (возраст), исключая из графика те категории возраста, куда попадают менее 5 человек.

6. Предположим, что одна из категориальных переменных в вашем файле — language (язык) и вы хотите исключить вывод языков, не набравших минимальной частоты 10. Тогда замените строку

!chart minnb=5 cat=age.

на следующие 3 строки:

COMPUTE dummy=1.
!chart minnb=10 cat=language.
EXECUTE.

7. Замечание: Команда COMPUTE, приведённая выше, находится двумя строками выше команды DEFINE в присланном ответе.

8. Теперь настаёт чарующий момент, когда вы готовы запустить макрос. Чтобы это сделать, выберите меню: Run>All

9. Проверьте окно результатов. Там должен быть график.

10. Если вам нужно сделать ещё графики с переменными region (регион) и climate (климат), добавьте ещё две строки:

!chart minnb=10 cat=region.
!chart minnb=10 cat=climate.

11. Комментарии: макрос !chart позволяет вам варьировать имена переменных для которых строится график и минимальный порог частоты отображаемой категории.

12. Если вам надо построить графики для нескольких переменных с одной и той же минимальной частотой, используйте макрос с именем !chart2. Пример вызова этого макроса:

!chart2 minnb=10 cat=age climate region.