В коллекции Рейналя имеется синтаксис Создать
переменную со средними значениями другой переменной.SPS (Ray, 17.06.2003),
который, как следует из названия, создаёт новую переменную, помещая в неё среднее
значение существующей переменной файла данных. Подобная задача является характерным
примером того, когда особая логика организации данных в статистическом пакете
создаёт определённые трудности в использовании статистики по файлу данных в
дальнейших расчётах. Поскольку данная операция хотя и требуется, но не слишком
часто, её реализация в SPSS хотя и возможна, но чуть более сложна, чем, например,
простое вычисление среднего значения.
Если бы мы работали в пакете MS Excel, то, наверное, сначала
рассчитали бы среднее, а затем "размножили" его по всем наблюдениям
с помощью специальных символов закрепления "$" при адресации на ячейку,
содержащую среднее. В SPSS процедура также включает 2 этапа, схожих по своему
содержанию с действиями в Excel, но иных по техническому исполнению: создание
внешнего файла со статистикой (средними значениями) и затем "подшивание"
этой статистики к исходному файлу данных.
Безусловно, на месте среднего значения могут быть и другие обобщающие
характеристики переменной, такие, как минимум, максимум, дисперсия, процент
наблюдений, превышающих установленный порог и так далее. Команда AGGREGATE,
использующаяся на первом этапе, предоставляет широкий спектр соответствующих
функций.
В примере синтаксиса, который мы разберём, будут задействованы
2 ключевые команды: AGGREGATE - расчёт статистики и помещение её во внешний
файл данных и MATCH FILES (буквально - сопоставление файлов), т.е. слияние исходного
файла и файла статистических показателей. Данные команды доступны и через кнопочный
интерфейс программы (AGGREGATE - через Data - Aggregate, MATCH FILES - через
Data - Merge Files - Add Variables).
Откроем файл примера, поставляющегося с SPSS (Employee data.sav);
на вашем компьютере может потребоваться изменить путь к этому файлу...
GET FILE = 'C:\Program Files\SPSS\Employee data.sav'.
... и определим техническую задачу нашего исследования: вычислить
отклонение жалованья сотрудника (переменная salary) от среднего жалованья. Задачу
можно понимать на двух уровнях сложности. В качестве среднего жалованья может
выступать общее среднее, а может выступать среднее той группы работников, к
которой принадлежит данный сотрудник. Во втором случае модель среднего жалованья
будет, скорее всего, более точной (с меньшими отклонениями), и отклонения от
такого среднего не будут являться результатом действия группирующего фактора.
Благо, пакет SPSS, как правило, предоставляет несколько вариантов
получения того или иного результата, поэтому посмотрим в начале, как можно построить
отклонения от общей средней и от средней по группам работников (например, по
категориям, jobcat) с помощью иных средств, отличных от AGGREGATE и MATCH FILES.
1. Вычисляем отклонения от общей средней посредством сохранения
и последующей модификации стандартизированных значений.
В меню Analyze - Descriptive Statistics - Descriptives присутствует
опция "Save standardized values as variables" - "сохранить стандартизированные
значения как переменные". Воспользуемся ей, чтобы получить отклонения заработков
относительно средней величины, выраженные в количестве стандартных отклонений.
Эквивалент этой операции на командном языке выглядит следующим образом:
DESCRIPTIVES
VARIABLES=salary /SAVE
/STATISTICS=MEAN STDDEV MIN MAX.
Опция /SAVE обеспечила создание новой переменной (zsalary), содержащей
стандартизированные значения переменной salary. Из таблицы Descriptive Statistics
в окне результатов видим, что стандартное отклонение составило 17 075.6 условных
единиц. Таким образом, чтобы получить абсолютные отклонения жалованья от собственного
среднего, достаточно теперь умножить стандартизированные значения на 17 075.6:
COMPUTE saldev=zsalary*17075.6.
EXECUTE.
2. Вычисляем отклонения от среднего жалованья по категориям
служащих (переменная jobcat) посредством одномерного однофакторного дисперсионного
анализа.
В самом деле, если использовать переменную jobcat как фактор
в дисперсионном анализе, возможности команды UNIANOVA по сохранению прогнозов
(Predicted) и остатков (невязок модели - Residuals), обеспечат нам появление
в файле данных соответствующих переменных.
UNIANOVA
salary BY jobcat
/INTERCEPT = INCLUDE
/SAVE = PRED RESID
/DESIGN = jobcat.
После выполнения этой команды в переменных pre_1 и res_1 оказались,
соответственно, средние размеры жалованья по категориям служащих и отклонения
от среднего жалованья в своей категории для каждого работника.
3. То же самое, через команды AGGREGATE и MATCH FILES.
Рассмотренные выше способы вычисления средних значений и отклонений
от них являются, без сомнения, удобными, поскольку не требуют использования
дополнительных файлов и слияний - программа использует внутренние процедуры
для создания новых переменных. Тем не менее, их нельзя назвать универсальными
способами, так как, во-первых, они основаны на наших знаниях об особенности
реализации тех или иных статистических процедур, во-вторых, использование этих
методов будет иметь свои особенности при наличии пропусков в данных, в-третьих,
поставленная перед нами задача по агрегированию файла данных может оказаться
более специфичной (например, могут потребоваться не средние величины, а иные
функции).
Задачи с общими и частными средними реализуются аналогичными
сочетаниями команд AGGREGATE и MATCH FILES.
Вариант А: общее среднее.
Команда AGGREGATE предназначена для расчёта статистик по группам
наблюдений. В её теле присутствует подкоманда /BREAK, устанавливающая переменную,
относящую наблюдения к той или иной группе. Соответственно, количество рассчитанных
статистик будет определяться числом уникальных значений переменной, указанной
в параметре /BREAK (включая пропущенные значения). В данном случае, поскольку
нас интересует общее среднее, необходимо указать, что все наблюдения относятся
к одной и той же группе. В этом нам поможет константа nobreak:
COMPUTE nobreak=1.
После инструкции COMPUTE вычисления принудительно можно не выполнять,
так как следующая команда AGGREGATE всё равно будет обрабатывать весь файл данных
- заодно и произведёт те вычисления, которые были запрошены ранее.
В команде AGGREGATE мы указываем имя внешнего файла, который
будет содержать статистику ('c:\temp\temp.sav'), а также имя группирующей переменной
(nobreak) и тот факт, что наблюдения были отсортированы по значениям этой переменной
(/PRESORTED). В самом деле, хотя сортировка и не производилась, она была и не
нужна, т.к. nobreak имеет значение 1 для всех наблюдений. Вообще же, если группирующая
переменная действительно имеет разные значения, знатоки рекомендуют заранее
отсортировать файл данных командой SORT CASES BY, а затем использовать AGGREGATE
именно с параметром /PRESORTED. Это освобождает AGGREGATE от необходимости выполнять
сортировку по ходу своего алгоритма, что благоприятно сказывается на объёме
требуемой памяти и скорости преобразований. Для больших файлов такое разнесение
сортировки и агрегирования может оказаться очень полезным. Ну а в данном случае
мы просто выпендрились...
Ключевым параметром является указание того, что переменная msal
в новом файле должна содержать среднее (MEAN) по переменной salary из текущего
файла.
Агрегирование произведено. Если раньше вы никогда не использовали AGGREGATE,
на этом этапе полезно прервать чтение и заглянуть в получившийся файл (c:\temp\temp.sav),
дабы увидеть, что он из себя представляет. Затем вновь откройте исходный файл
данных и доведите исполнение синтаксиса вновь до этого места.
Теперь наша задача - сделать так, чтобы единственное наблюдение
переменной msal из файла c:\temp\temp.sav оказалось размножено по всем наблюдениям
текущего файла. Это сделает команда сопоставления файлов MATCH FILES. Слияние
производится в текущий файл данных (параметр "*"). Внешний файл со
статистикой объявляется подстановочной таблицей (/TABLE) по ключу nobreak. Это
означает, что значения всех переменных для тех наблюдений из внешнего файла,
для которых значения nobreak совпадут со значением nobreak из наблюдений текущего
файла, будут приписаны этим наблюдениям в текущий файл по принципу один-ко-многим.
Поскольку других значений ключа, кроме 1, у нас нет ни в том, ни в другом файле,
а во внешнем файле имеется только две переменные - ключ nobreak и msal, визуально
данное действие добавит в текущий файл переменную msal, которая будет иметь
значение 34 419 для всех наблюдений.
MATCH FILES FILE=*
/TABLE='c:\temp\temp.sav'
/BY nobreak.
Остаётся подсчитать отклонения и дать метки новым переменным:
Очень похожими будут наши действия в том случае, если требуется
подсчитать средние и отклонения от них по категориям служащих (переменная jobcat).
В этом случае мы будем использовать не константу nobreak в качестве разделителя,
а непосредственно переменную jobcat. Причём в данном случае важно предварительно
произвести сортировку наблюдений по ней, если в последующей команде AGGREGATE
мы используем параметр /PRESORTED (предварительно отсортированный файл).