Унивариантный анализ данных SAS

Из R.Cody, J.Smith. Applied statistics and the SAS programming Language, Pretence Hall, 1991


Описание данных.

Даже в случае выполнения комплексного статистического анализа Вам необходимо описать данные достаточно простым и легко понятным способом. Этого можно добиться несколькими способами. Во-первых - это использовние описательных суммарных статистик. Наверное наиболее популярный способ описания оценок заключается в следующем: (1) количество людей, которые находились в выборке (называется объемом выборки и в статистических книгах и распечатках программы SAS обозначается латинской буквой "n"); (2) средняя (арифметическая средняя оценок); и (3) стандартное отклонение этих оценок. Стандартное отклонение - это показатель того насколько широко вариируют оценки. Грубо говоря, если оценки формируют "колокообразное" (нормальное) распределение, то примерно 68% всех оценок будет находиться в пределах 1 стандартного отклонения от среднего (плюс или минус), а 95% всех оценок будут находиться в пределах 2 стандартных отклонений.

Теперь давайте создадим набор данных SAS для того, чтобы проанализиовать некоторые концепции, связанные с описательными статистиками. Предположим мы провели исследование (хотя и очень небольшое) и измерили рост, вес и выяснили пол семи человек. Мы собрали следующие данные:

Пол

Рост (дюймы)

Вес (фунты)

M

68.5

155

F

61.2

99

F

63.0

115

M

70.0

205

M

68.6

170

F

65.1

125

M

72.4

220

М - мужчина F- женщина

Может существовать несколько вопросов, которые мы могли бы задать по поводу этих данных. По всей вероятности мы хотели бы посчитать сколько мужчин и сколько женщин имеется в нашей выборке. Мы также хотели бы посмотреть средние и стандартное отклонение для переменных РОСТ и ВЕС. Кроме того, мы может быть хотели бы посмотреть гистограмму наших переменных и по всей вероятности определить можем ли мы считать, что наши данные имеют нормальное распределение. Это достаточно простые задачи, при условии, что анализируется всего лишь семь человек. Однако мы крайне редко заинтересованы в анализе таких маленьких выборок. После того как мы начнем рассматривать выборку в 20-30 человек статистический анализ вручную становится достаточно сложным. Программа SAS, которая может сосчитать эти данные и подсчитать некоторые описательные статистики показана ниже:

DATA HTWT; (1)
INPUT SUBJECT GENDER $ HEIGHT WEIGHT; (2)
DATALINES; (3)
1 M 68.5 155
2 F 61.2 99
3 F 63.0 115
4 M 70.0 205
5 M 68.6 170
6 F 65.1 125
7 M 72.4 220
;
PROC MEANS DATA=HTWT; (4)
TITLE ' Описательная статистика '; (5)
RUN; (6)

В этом примере наши данные снова расположены прямо в программе. Для небольших наборов данных это достаточно приемлемый метод. Для более крупных наборов данных мы обычно будем размещать данные в отдельном файле, а затем просить программу SAS найти их и указывать, где мы это сможем сделать. В данной программе мы решили использовать списочную форму ввода, где каждое значение отделено от следующего одним, или более пробелами. Первые три строки определяют шаг анализа данных (DATA). В (1) мы указываем, что мы создаем набор данных SAS, который называется HTWT. Как уже упоминалось, имена наборов данных в SAS, точно также как и имена переменных SAS, могут быть в длину от одного до восьми знаков. Они должны начинаться либо буквой либо знаком подчеркивания ( _ ). Другие буквы в именах переменных, или в именах наборов данных могут в дополнение включать цифры. Таким образом наше название HTWT соответствует этим критериям и оно является правильным именем для набора данных SAS. Задание (2) это ключевое слово INPUT. Это задание указывает имена переменных, которые мы будем считывать. В данной форме команды INPUT (ввод) последовательность переменных соответствует порядку значений. Поскольку наши данные расположены в следующем порядке: обследованные (SUBJECT), пол (GENDER), рост (HEIGHT), и вес (WEIGHT) наша команда INPUT перечисляет имена переменных в этом же самом порядке. Если бы в наших данных имелись какие-нибудь пропущенные данные, при этой форме ввода нам бы пришлось использовать точку (.) для того, чтобы показать, что в этом месте должно было находиться пропущенное значение. Кроме того мы хотели бы напомнить, что знак $, который следует за наименованием переменной пол (GENDER) показывает, что мы используем буквенные значения для этой переменной ('M' и 'F') - М и Ж. Команда (3) DATALINES указывает, что следом пойдут сами значения, и что на этом шаг манипуляции данными закончен. После ввода данных идет одинокая точка с запятой (;), это достаточно удобный способ показать, что больше данных с цифрами нет. Команда (4) в нашем запросе является запросом на описательные статистики. Поскольку мы не просим ничего другого, процедура MEANS (средние) выдаст нам количество наблюдений, которое использовалось для подсчета описательной статистики для каждой из наших описательных переменных, среднее, стандартное отклонение, минимальное и максимальное значение. Вскоре мы покажем как запрашивать только те статистические показатели, которые Вы хотите, а не принимать только то, что по умолчанию хочет машина. Давайте пока посмотрим на результаты самой программы:

Simple Descriptive Statistics
Variable N   Mean        Std Dev      Minimum     Maximum
-------------------------------------------------------------------
SUBJECT  7   4.0000000   2.1602469   1.0000000   7.0000000
HEIGHT   7   66.9714286  4.0044618  61.2000000  72.4000000
WEIGHT   7   155.5714286 45.7961321 99.0000000 220.0000000
-------------------------------------------------------------------

Мы видим, что в нашей выборке есть семь человек (n=7); что самый маленький человек имеет рост 61.2 дюйма, а самый высокий человек имеет рост 72.4 дюйма (эти данные мы берем из столбцов "minimum value" и "maximum value"); средний рост составляет 66.971 (округленно) и стандартное отклонение 4.004. Обратите пожалуйста внимание, что мы также получили статистику по переменной, которая называется SUBJECT. Средний номер исследуемого по всей вероятности нас не будет очень интересовать. Вскоре мы Вам покажем как подсчитывать статистические переменные только для тех показателей, которые нас интересуют.

Вы можете указать какие статистики Вы хотели бы подсчитать, указывая специальные ключевые слова в процедуре MEANS. Большинство процедур SAS имеют ключевые слова, которые располагаются между названием процедуры и точкой с запятой. Многие из этих ключевых слов перечисляются в данном тексте. Более полный список всех ключевых слов может быть найден в руководствах, которые публикуются производителями программы SAS. Как уже упоминалось опция MAXDEC=n контролирует количество знаков после десятичной точки, N печатает количество наблюдений и ключевое слово MEAN обеспечивает распечатку среднего значения. Поэтому, если бы Вы хотели чтобы было указано только количество наблюдений и средняя, и Вы бы хотели, чтобы все результаты были округлены с точностью до третьего знака после запятой, Вы бы написали следующее:

PROC MEANS DATA=HTWT N MEAN MAXDEC=3;

Вы также могли бы захотеть указать какие цифровые значения Вы хотите, чтобы использовались для подсчета описательной статистики. Таким образом мы бы могли избежать расчета описательной статистики для численной переменной, которая называется номер обследованного (SUBJECT). Мы добиваемся этого при помощи команды VAR. VAR (сокращение от слова VARIABLES - переменные) - это команда, которая дает процедуре MEANS, а также многим другим процедурам дополнительную информацию. Синтаксис достаточно прост - это слово VAR за которым следует список имен переменных. Поэтому если бы мы захотели создать описательную статистику только для переменной рост (HEIGHT) и мы бы хотели иметь размер выборки, средние и все это округлить до трех знаков после запятой, мы бы написали следующее:

PROC MEANS DATA=HTWT N MEAN MAXDEC=3;
    TITLE ' Простая описательная статистика ';
    VAR HEIGHT;
RUN;

Последовательность ключевых слов не является важной. Список часто используемых ключевых слов в процедуре средние (MEANS) является следующим:

Ключевое слово

Описание

N

Количество наблюдений, на основании которых рассчитывался данный статистический показатель

NMISS

Количество наблюдений с пропущенными значениями

MEAN

Арифметическая средняя

STD

Стандартное отклонение для выборки

STDERR

Стандартная ошибка

CLM

Нижняя и верхняя границы двухстороннего 95% доверительного интервала средней

LCLM

Нижний односторонний 95% доверительный интервал для средней. Если указываются ключевые слова LCLM и UCLM, то подсчитываются двухсторонний доверительный интервал, в противном случае данное ключевое слово даст Вам односторонний доверительный интервал

UCLM

Верхняя граница одностороннего 95% доверительного интервала, если указываются ключевые слова LCLM и UCLM, то подсчитывается двухсторонний доверительный интервал, в противном случае данное ключевое слово дает Вам односторонний доверительный интервал

MIN

Минимальное: наименьшее значение для данной переменной

MAX

Максимальное: наибольшее значение для данной переменной

SUM

Сумма

VAR

Дисперсия

CV

Коэффициент вариации

SKEWNESS

Ассиметрия

KURTOSIS

Эксцесс

T

t-тест Стьюдента, тестирующий нулевую гипотезу о том, что среднее значение в популяции равно нулю

PRT

Вероятность получения большего абсолютного значения t в случае справедливости нулевой гипотезы

MAXDEC=n

Где n указывает количество знаков после десятичной запятой

Еще один дополнительный пример. Предположим мы хотели бы рассчитать размер выборки, среднее, стандартное отклонение, стандартную ошибку и 95% доверительный интервал для среднего выборки. В дополнение к этому мы бы хотели, чтобы статистические показателя были округлены до двух значений после запятой. В этой ситуации мы бы написали:

PROC MEANS DATA=HTWT MAXDEC=2 N MEAN STD STDERR CLM;

А результат выглядел бы так :

Simple Descriptive Statistics                                  


Variable  N  Mean  Std Dev  Std Error  Lower 95.0% CLM  Upper 95.0% CLM
-----------------------------------------------------------------------
SUBJECT   7   4.00   2.16     0.82           2.00            6.00
HEIGHT    7  66.97   4.00     1.51          63.27           70.67
WEIGHT    7 155.57  45.80    17.31         113.22          197.93
-----------------------------------------------------------------------

Стандартная ошибка среднего используется для того, чтобы рассчитать "доверительный интервал" среднего и этот подход достаточно полезен если наши данные представляют собой выборку из некоторой популяции. Например, если бы наши семь человек были бы случайной выборкой выпускников школы в Нью-Джерси, мы могли бы использовать среднее выборки (66.97) как оценку для среднего роста всех выпускников школ Нью-Джерси. Стандартная ошибка среднего говорит нам о том, насколько эта оценка может отличаться от истинной. Если наша популяция распределена по нормальному закону, выборочное значение среднего (базирующееся на случайной выборке) будет находиться в пределах одной стандартной ошибки (1.51), или "истинного" среднего значения в 68% случаев и в пределах двух стандартных ошибок (3.02) в 95% случаев. Указывая опцию CLM, процедура MEANS распечатает 95% доверительный интервал. Если мы посмотрим на приведенную выше распечатку, мы увидим там, что с 95% вероятностью наш интервал, который простирается от 63.27 до 70.67 содержит истинное популяционное среднее для роста. Для веса этот интервал простирается от 113.22 до 197.93. Если бы Вы захотели посчитать 95% доверительный интервал вручную, Вам бы потребовалось добавить и вычесть t-оценку, (причем с учетом количества степеней свободы), умноженное на стандартное отклонение среднего.

Как упоминалось в этой главе ранее, процедура MEANS по умолчанию распечатывает количество наблюдений, среднее, минимальное и максимальное значения, стандартное отклонение. Предположим, Вы хотели бы, чтобы к этому списку была добавлена стандартная ошибка. Если Вы запросите любую статистику (MAXDEC = не является статистикой), то процедура MEANS распечатает только эту статистику. Поэтому если Вы хотите пренебречь установками по умолчанию и запросить дополнительную статистику, Вы должны указать все те статистики, которые Вы хотели бы иметь в распечатке. Например, для того чтобы добавить стандартную ошибку к списку, использованному по умолчанию, Вам необходимо было бы написать:

PROC MEANS DATA=HTWT MAXDEC=2 N MEAN STD MIN MAX STDERR;

Еще об описательных статистиках.

Если бы Вы хотели получить более обширный список статистик, включая тестирование на нормальность распределения, графики ствол с листьями и коробочные графики, Вам необходимо будет воспользоваться процедурой UNIVARIATE. Эта крайне полезная процедура, которая может рассчитать, среди всего прочего:

1. Количество наблюдений

2. Среднее

3. Стандартное отклонение

4. Дисперсию

5. Коэффициент ассиметрии

6. Коэффициент эксцесса

7. Неоткорректированные и откорректированные суммы квадратов

8. Коэффициент вариации

9. Стандартную ошибку среднего

10. t-тест, сравнивающий значение переменной с нулем

11. Максимальное значение (наибольшее значение)

12. Минимальное значение (наименьшее значение)

13. Диапазон

14. Медиану, границы 3-го и 2-го квартилей

15. Межквартильное расстояние

16. Моду

17. 1-й, 5-й, 10-й, 90-й, 95-й и 99-й процентили

18. Пять наивысших и пять самых низких значений (очень полезно для проверки данных)

19. Статистики W или D, которые проверяют распределены ли данные нормально

20. График ствол с листьями

21. Коробчатый график

22. График нормальной вероятности, который сравнивает кумулятивное частотное распределение с нормальным распределением

Для того, чтобы прогнать процедуру UNIVARIATE с использование наших переменных РОСТ (HIGHT) и ВЕС (WEIGHT) мы должны были бы написать:

PROC UNIVARIATE DATA=HTWT;
    TITLE 'More Descriptive Statistics';
    VAR HEIGHT WEIGHT;
RUN;

По умолчанию в распечатке, из списка приведенного выше, мы получим первые 18 значений. Для того чтобы дополнительно запросить тест на нормальность распределения, график ствола с листьями и коробчатый график, нам необходимо добавить ключевые слова NORMAL и UNIVARIATE следующим образом:

PROC UNIVARIATE DATA=HTWT NORMAL PLOT;
    TITLE 'More Descriptive Statistics';
    VAR HEIGHT WEIGHT;
RUN;

Небольшой кусочек распечатки, которая будет получена после нашего запроса показана ниже:

 

 

 

В распечатке процедуры UNIVARIATE очень много информации. Под заголовком "Мoments" перечисляется достаточно большое количество статистических показателей. Большинство из них говорят сами за себя. Вот список с некоторыми объяснениями:

N

Количество наблюдений

Sum Wgts

Сумма весов (если использовалась команда WEIGHT-вес)

Mean

Арифметическая средняя

Sum

Сумма значений

Std Dev

Стандартное отклонение

Varianse

Дисперсия

Skewness

Ассиметрия (показатель симметрии или ассиметрии распределения)

Kurtosis

Коэффициент эксцесса ( показатель пикообразности или уплощенности распределения)

USS

Неоткорректированная сумма квадратов (сумма значений в квадрате, каждое значение возводится в квадрат и затем квадраты складываются)

CSS

Откорректированная сумма квадратов (сумма квадратов отклонений от среднего, обычно более полезный показатель, чем USS)

CV

Коэффициент вариации

Std Mean

Стандартная ошибка среднего (стандартное отклонение деленное на квадратный корень из n)

T:Mean=0

t-тест Стьюдента для проверки гипотезы о том, что популяционная средняя равняется нулю

Prob>T

p-оценка для t-статистики (двухстороняя)

Sgn Rank

Тест Вилкоксона (обычно используется для связанных совокупностей)

Prob>S

p-значение для теста Вилкоксона

Nuv ^ = 0

Количество не нулевых наблюдений

W:Normal

(D:Normal)

Статистика Шапиро-Вилка для проверки нормальности (SAS также будет подсчитывать тест Колмогорова D:Normal если количество наблюдений более 2000)

Prob>W

(Prob>D)

Р-оценка, которая тестирует нулевую гипотезу о том, что популяционное значение расперелено нормально (когда выполнялся тест на нормальность D, статистика записывается как Prob>D).

Когда мы далее смотрим на распечатку, мы обнаруживаем подзаголовок "Кванитли (Def =5)", два вида полезной информации. Левостороняя группа цифр перечесляет квантили, которые включают самое большое значение (100%), значения на границе третьего квартиля (75%), медиану (50%) и значения в первом квартиле, а также самое низкое значение (0%). Мы указываем на это потому, что это единственное место, которое мы знаем, где Вы могли бы подсчитать медиану. (Правда, неплохо было бы, если бы медиана являлась ключевым словом в процедуре MEANS?) "Def =5" - это заголовок, который указывает, что SAS использует 5 определение, перечисленное в руководстве по SAS. Это определение описывается как эмпирическая функция распределения с усреднением. Мы отправляем тех кто интересуется очень незначительными, но чрезвычайно интересными различиями пяти возможных определений к руководству по использованию SAS к описанию процедуры UNIVARIATE. Для остальных 99.6% наших читателей мы рекомендуем оставить DEF =5.

Правосторонний набор цифр перечисляет процентили, которые нас довольно часто интересуют (99%, 95% и так далее).

Чуть ниже этих двух столбиков Вы можете найти диапазон, межкватильный диапазон (Q3 - Q1) и моду.

Список крайних значений, который следует далее, чрезвычайно полезен. Этот список также распечатывается даже без особого запроса с нашей стороны. Он перечисляет пять самых низких и пять самых высоких значений в наборе данных. Мы считаем это полезным для проверки данных. Явно неправильные значения могут быть легко обнаружены. Рядом с каждым крайним значением имеется номер соответствующего наблюдения. Идентификация может быть проделана более качественно при использовании ключевого слова ID с процедурой UNIVARIATE. Переменная ID, обычно номер пациента, распечатывается рядом с каждым крайним значением, вместо номера наблюдения. Таким образом, когда мы находим ошибки в данных, глядя на эту переменную ID, значительно легче найти неправильное значение. Мы можем использовать нашу переменную SUBJECT в качестве переменной ID для того, чтобы это продемонстрировать. В этой ситуации запрос на выполнение процедуры UNIVARIATE будет выглядеть следующим образом:

PROC UNIVARIATE DATA=HTWT NORMAL PLOT;
    TITLE 'More Descriptive Statistics';
    VAR HEIGHT WEIGHT;
    ID SUBJECT;
RUN;

Следующая часть распечатки процедуры UNIVARIATE является результатом действия ключевого слова PLOT. На левой стороне страницы находится график ствола с деревьями. Его можно представить себе как гистограмму, которая была поставлена на бок. Однако вместо того, чтобы использовать крестики для прорисовки столбиков, используется значение, которое идет следом за цифрой "ствола". Например, самый низкий рост 72.4 поэтому рядом со стволовым значением 72 мы видим '4', которая сообщает нам не только, что это значение между 72 и 74, но и то, что истинное значение составляет 72.4. Посмотрите на ствол, помеченный "68". Обратите внимание, что имеется два значения между 68 и 70. "Листовые" значения '5' и '6' показывают, что один рост равен 68.5, а другой рост равен 68.6. Этот стиль "гистограмм" выдает значительно больше информации по структуре значений, которые формируют столбики. В нашем небольшом примере график ствола с листьями не очень сильно поражает воображение, но с выборками от 20 до 200 наблюдений он является крайне полезным.

Другое изобретение известного статистика Тьюки - коробчатый график, показан на правой стороне страницы. Правила, используемые SAS, являются следующими: верхние и нижние линии коробки представляют собой 25-й и 75-й процентили выборки. Медиана представлена прерывистой линией внутри коробки и среднее значение показано знаком +. Вертикальные линии наверху и внизу коробки называются усами и их величина соответствует значениям в данных до максимального размера, который в 1.5 раза больше, чем межквартильное расстояние. Значения, которые находятся за пределами усов, но находятся внутри трех межквартильных расстояний от границы коробки, показаны значками (о). Еще более крайние значения обозначаются (*). Целью коробчатого графика является представление картины данных в той форме, в которой их можно сравнивать друг с другом, особенно если их расположить рядом друг с другом. В следующем разделе мы Вам покажем как создавать описательную статистику для нескольких групп. Когда Вы будете делать это с процедурой UNIVARIATE (используя команду BY) Вам автоматически будут представлены, расположенные рядом друг с другом, коробчатые графики для каждого значения переменной BY, или для комбинации переменных BY, если у Вас указано более одной такой переменной.

График нормальной вероятности, который показан последним, является также результатом действия ключевого слова PLOT и представляет собой график данных по сравнению с нормальным распределением. На оси-y показаны наши данные, а на оси-x они связаны с обратной стандартной нормальной функцией. Звездочки (*) указывают на реальные значения, а знаки плюс (+) дают нам референтную линию, которая основывается на среднем значении и стандартном отклонении. В принципе, если выборочное отклонение отличается от нормального, то много звездочек (*) будет отклоняться от плюсиков (+). Вы обнаружите, без сомнения, что стволы с листьями и коробчатые графики являются более простым способом анализировать форму распределения.

Описательная статистика по подгруппам.

Вместо того, чтобы подсчитывать описательную статистику для каждого человека в вашей выборке, Вы могли бы заказать статистические показатели для определенных подгрупп в Ваших данных. Например, в том наборе данных, которые мы использовали для предыдущих разделов, мы хотели бы подсчитать среднее, стандартное отклонение, количество наблюдений РОСТА и ВЕСА отдельно для мужчин и для женщин. Мы можем добиться этого двумя способами. Во-первых мы можем отсортировать данные по полу (GENDER), а затем указать команду BY в процедуре MEANS следующим образом:

* Отсортировать данные по переменной пол ( GENDER);
PROC SORT DATA=HTWT;
    BY GENDER;
RUN;

* Запросить выполнение PROC MEANS для каждого пола (переменная GENDER);
PROC MEANS DATA=HTWT N MEAN STD MAXDEC=2;
    BY GENDER; * Эта команда как раз и приводит к раздельному анализу ;
    VAR HEIGHT WEIGHT;
RUN;

Результаты, получающиеся при выполнении этой команды, показаны ниже:

--------------------- GENDER=F ------------------
Variable  N          Mean       Std Dev
-------------------------------------------------
HEIGHT    3         63.10          1.95
WEIGHT    3        113.00         13.11
-------------------------------------------------

--------------------- GENDER=M ------------------
Variable  N          Mean       Std Dev
-------------------------------------------------
HEIGHT    4         69.88          1.82
WEIGHT    4        187.50         30.14
-------------------------------------------------

Большинство процедур SAS позволяет Вам включать команду BY и она будет выполять процедуру для каждого уровня переменной BY. Не забывайте всегда отсортировывать данные прежде, чем пользоваться этой командой по той самой переменной, которая будет указана в ключевом слове BY или знать, что набор данных уже отсортирован. Иногда в очень большой программе Вы можете запросить сортировку набора данных, который уже был отсортирован (поскольку Вы его уже отсортировали и забыли, что это сделели). В версии SAS 6.08 и выше, если Вы запрашиваете сортировку набора данных, который уже был отсортирован SAS, сортировка не выполняется и Вам будет выдано сообщение в окне LOG, что данные уже были отсортированы в той последовательности, которая Вам необходима.

Альтернативой использованию команды BY в процедуре MEANS является использование комнды CLASS. Если Вы используете команду CLASS вместо команды BY, распечатка будет очень похожей, в чем Вы можете убедиться, сравнив напечатанное ниже с тем, что было показано выше.

GENDER    N Obs  Variable  N          Mean       Std Dev
--------------------------------------------------------
F             3  HEIGHT    3         63.10          1.95                  WEIGHT    3        113.00         13.11
M             4  HEIGHT    4         69.88          1.82                  WEIGHT    4        187.50         30.14
--------------------------------------------------------

Преимущество в использовании процедуры CLASS заключается в том, что Вам не нужно сортировать данные. Для больших наборов данных это может означать большую экономию времени обработки и, возможно, денег. С другой стороны, использование команды CLASS требует значительно больше памяти, чем процедура BY, особенно если имеется несколько классификационных переменных и много уровней в каждой из них. В общем необходимо попытаться использовать вначале команду CLASS и прибегать к использованию команды BY, если этого требует ограничение в памяти. Мы обсудим использование команды CLASS в процедуре MEANS немного позднее в этой главе.

Частотные распределения.

Теперь давайте посмотрим каким образом программа SAS может подсчитать количество мужчин и женщин, имеющихся в нашей выборке. Этим занимается следующая программа SAS:

DATA HTWT;
INPUT SUBJECT GENDER $ HEIGHT WEIGHT;
DATALINES;
1 M 68.5 155
2 F 61.2 99
3 F 63.0 115
4 M 70.0 205
5 M 68.6 170
6 F 65.1 125
7 M 72.4 220
;
PROC FREQ DATA=HTWT;
    TITLE ' Использование PROC FREQ для расчета частот';
    TABLES GENDER;
RUN;

На сей раз вместо процедуры MEANS мы используем процедуру (PROC), называемую FREQ. За процедурой FREQ следует запрос таблицы частот для переменной "ПОЛ" (GENDER). Слово TABLES (или TABLE), что по английски означает таблица, используемое с процедурой FREQ, сопровождается списком переменных, для которых мы хотим посчитать количество возникновения определенных значений (например, как много мужчин и как много женщин имеется в случае переменной "ПОЛ" (GENDER)). Удостовертись в том, что Вы включили команду TABLES и перечислите только те переменные, которые имеют разумное количество уровней, которые Вы хотели бы использовать в процедуре FREQ, то есть не запрашивайте частоты для непрерывных переменных, таких например, как возраст, поскольку в этом случае Вы получите частотное распределение для каждого значения. Подобная распечатка может привести к тому, что производителям бумаги необходимо будет дополнительно уничтожить несколько деревьев.

Обратите внимание на то, что процедура FREQ не использует команду VAR для того, чтобы указать для каких переменных необходимо подсчитывать частоты (по сравнению с тем, что мы делали с процедурой MEANS или процедурой UNIVARIATE). Это может Вам показаться не совсем удобным. Вам необходимо выучить (или посмотреть) те команды, которые могут использоваться с каждой процедурой.

Обратите внимание на то, что две команды "ЗАГОЛОВОК" (TITLE) и "ТАБЛИЦЫ" (TABLES), по сравнению с другими программами, напечатаны с отступом. То, с какого места начинается любая команда SAS никаким образом не влияет на выполнение программы. Эти строки написаны с отступом для того, чтобы программисту было наглядно видно, что команды TITLE и TABLES являются частью процедуры FREQ.

В следующей таблице показаны результаты деятельности FREQ. Столбец названный "FREQUENCY" перечисляет количество людей, являющихся мужчинами и женщинами. Столбец, помеченный "PERSENT", та же самая информация, но выраженная как процент от количества людей. Столбцы "CUM FREQ" и "CUM PERСENT" позволяют нам увидеть суммарные значения (количество и проценты, соответственно) для каждой категории "ПОЛА".

Using PROC FREQ to Compute Frequencies                              
                               Cumulative  Cumulative
GENDER   Frequency   Percent   Frequency    Percent
---------------------------------------------------
F               3      42.9           3       42.9
M               4      57.1           7      100.0

Если у Вас нет необходимости, чтобы была подсчитана кумулятивная статитстка, которая автоматически подсчитывается при выполнении команды TABLES, Вы можете использовать ключевое слово NOCUM для того, чтобы подавить распечатку этих значений. Для того, чтобы воспользоваться этим словом, Вам необходимо будет вставить косую черту (/) после соответствующей команды. Таким образом для того, чтобы не печатать кумулятивные статистики Вы напишите следующее:

TABLES GENDER / NOCUM;

Для того, чтобы не печатать как кумулятивную статистику, так и проценты Вам необходимо будет еще добавить ключевое слово NOPERSENT в команду TABLES следующим образом:

TABLES GENDER / NOCUM NOPERCENT;

Последовательность, в которой Вы располагаете эти ключевые слова, не играет никакой роли. Результатом действия описанного выше запроса будет следующее:

GENDER   Frequency
--------------------------
F               3
M               4

Столбиковые диаграммы .

Мы видели какие статистики подсчитываются процедурой MEANS и процедурой FREQ. Они являются прекрасным способом просуммировать наши данные, но с другой стороны лучше один раз увидеть, чем тысячу раз услышать. Поэтому давайте теперь попробуем добавить графики к нашим данным. Программа SAS может сгенерировать частотную столбиковую диаграмму, показывающую ту же самую информацию, которую дает нам процедура FREQ, при помощи процедуры CHART (график). Команды следующие:

PROC CHART DATA=HTWT;
    VBAR GENDER;
RUN;

Используются для того, чтобы нарисовать график, показанный ниже:

Ключевое слово HBAR вместо ключевого слова VBAR позволит нам создать график, в котором будут иметься горизонтальные столбики, вместо вертикальных столбиков, которые генерируются за счет ключевого слова VBAR. Когда используется команда HBAR вместо команды VBAR, будет создаваться график с горизонтальными столбиками, вместо вертикальных столбиков, полученных при использовании команды VBAR. Когда используется команда HBAR, частотные значения и проценты также указываются рядом с графиком, как показано на рисунке ниже. Кроме того, команда HBAR позволяет нарисовать на одном графике значения для большего количества групп, поскольку сам график занимает меньше места.

Но теперь возникает вопрос, что же нам делать с распределением веса или роста? Если мы используем процедуру FREQ для того, чтобы подсчитать частоту встречаемости различных значений роста, она подсчитает нам количество объектов для каждого значения роста (как много людей имеют рост 60 дюймов, как много людей имеют рост 61 дюйм и так далее). Если мы вместо этого будем использовать процедуру CHART, она автоматически разобьет наши наблюдения на группы (если только мы не укажем какие-то команды для того, чтобы проинформировать как бы мы сами хотели, чтобы наши данные выглядели). Поскольку наша выборка является настолько маленькой, частотные распределения роста или веса выглядят достаточно глупо, но тем не менее мы его нарисуем. Команда SAS, которая описана чуть ниже, создаст нам вертикальную столбиковую диаграмму:

PROC CHART DATA=HTWT;
    TITLE 'Distribution of Heights';
    VBAR HEIGHT / LEVELS=6;
RUN;

Ключевое слово LEVELS = 6 - это инструкция для того, чтобы сгруппировать рост так, чтобы было шесть, расположенных на равном расстоянии друг от друга, интервалов для переменной HEIGHT (РОСТ). Если мы не укажем никакой опции, когда мы будем создавать график для непрерывной переменной, процедура CHART будет использовать свой собственный группирующий алгоритм для того, чтобы отобрать количество уровней и средних значений на графике. Результаты работы программы, описанной выше, показаны здесь:

 

Команды VBAR и HBAR процедуры CHART имеют большое количество опций. Общая форма команд VBAR и HBAR следующая:

VBAR переменная / список опций;

Альтернативой к опции LEVELS= является представление процедуре списка средних значений. Это делается при помощи ключевого слова MIDPOINTS. Ее формат следующий:

MIDPOINTS = нижняя граница TO верхняя граница BY интервал;

Примером может быть следующее:

VBAR HEIGHT / MIDPOINTS=50 TO 80 BY 10;

Имеются ситуации при которых Вы бы не хотели, чтобы процедура CHART разделяла бы наши цифровые значения на интервалы. Например, у нас есть переменная, которая называется "НЕДЕЛЯ" (WEEK), являющаяся количественной переменной и кодирующая дни недели (от 1 до 7). Команда:

VBAR WEEK;

по всей вероятности приведет к тому, что появится график, средние значения в котором не является целыми. Для того, чтобы этого избежать и попросить процедуру CHART использовать действительные значения этой переменной, к списку опций добавляется ключевое слово DISCRETE. Для того чтобы быть уверенным, что частотный график для переменной WEEK напечатался адекватно, необходимо использовать следующую команду:

VBAR WEEK / DISCRETE;

(Помните, что опции находятся между командой и точкой с запятой и разделяются косой чертой).

Прежде чем мы закончим рассмотрение процедуры CHART, мы бы хотели продемонстрировать некоторое количество других опций, которые можно использовать вместе с этой процедурой. Для этого мы создали другой набор данных, который содержит переменные DEPT (отдел), YEAR (год), QUARTER (квартал), SALES (продажи). Команда:

VBAR DEPT;

приведет к тому, что у нас появится простой частотный график аналогичный тому, что показан ниже:

Команда:

VBAR SALES;

приведет к появлению частотного распределения продаж по всем годам и по всем отделам.

Для того, чтобы посмотреть как продажи распределяются внутри каждого отдела, мы можем использовать опцию GROUP, которая доступна как в командах VBAR, так и команде HBAR. Команда:

VBAR SALES / GROUP =DEPT;

приведет к появлению графика похожего на тот, что показан ниже:

Еще один способ продемонстрировать эти данные - это организовать график таким образом, чтобы на оси-y находились суммарные данные по продажам, а не частоты. Этого можно добиться, используя опцию SUMVAR с командой VBAR или HBAR. За ключевым словом SUMVAR следует переменная чья сумма должна быть показана на оси-y. Мы также можем использовать опцию SUMVAR для того, чтобы показать на оси-y средние значения, добавив ключевое слово TYPE =MEAN (тип =среднее) к списку опций команды VBAR или HBAR. Мы сейчас покажем Вам график, который использует опции SUMVAR и TYPE. Поскольку мы показываем сумму продаж для каждого отдела, опция TYPE = является немножко излишней, но она включена для того, чтобы напомнить Вам, что она доступна для того, чтобы демонстрировать другие статистические показатели на оси-y. Команда:

VBAR DEPT / GROUP = YEAR SUMVAR= SALES TYPE=SUM;

приведет к появлению следующего графика:

Другие приемлемые значения для опции TYPE = следующие:

Опция

Результат

TYPE =FREQ

Частоты

TYPE =PCT

Проценты

TYPE =CFREQ

Кумулятивные частоты

TYPE =CPCT

Кумулятивный процент

TYPE =SUM

Суммы

TYPE =MEAN

Средние

Еще одна опция, которую можно использовать с командой VBAR или HBAR - это SUBGROUP (подгруппы). Первая буква переменной SUBGROUP используется в качестве символа графики на столбчатой диаграмме. Если мы напишем:

VBAR SALES / SUBGROUP =DEPT;

значения отделов (А и В) будут показывать какие отделы вносят наибольший вклад в соответствующие продажи. Для примера посмотрите на график, показанный ниже:

Прежде чем мы окончательно уйдем от процедуры CHART трудно удержаться от того, чтобы продемонстрировать Вам красивые трехмерные графики, которые можно произвести при помощи команды BLOCK. Переменная, указанная после команды BLOCK, определяет ось-x, опция GROUP определяет ось-y и переменные SUMVAR (с любой из опций TYPE ) ось-z, которая дает нам высоту столбиков. Столбиковая диаграмма, которая появляется в результате исполнения команды:

BLOCK YEAR / GROUP = DEPT SUMVAR= SALES TYPE=SUM DISCRETE;

показана ниже:

Другие графики.

Теперь мы бы хотели проанализировать взаимоотношения между ростом и весом. Наши интуиция подсказывает нам, что эти две переменные должны быть связаны друг с другом: чем выше человек, тем больше он весит (обычно). Наилучший способ продемонстрировать эти взаимоотношения - это нарисовать график зависимости роста от веса. Мы можем запросить, чтобы система SAS сгенерировала подобный график, используя процедуру PLOT (график). Команды:

PROC PLOT DATA=HTWT;
    PLOT WEIGHT*HEIGHT;
RUN;

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

 

Общая форма процедуры PLOT следущая:

PROC PLOT DATA=имя_файла_данных;
     PLOT переменная_Y * переменная_X;
         (вертикальная) (горизонтальная)
RUN;

Обратите внимание на то, что программа SAS автоматически выбирает адекватную шкалу как для оси-x,так и для оси-y. Если только Вы не запросите другого, процедура PLOT будет использовать буквы (А, B,C и так далее) в качестве символов, обозначающих каждое наблюдение. Поскольку простые компьтерные принтеры ограничены тем, что они могут печатать буквы только в заданных расположениях на странице, две точки, которые находятся очень близко друг к другу должны быть напечатаны в одном и том же месте. В том случае, если две точки совпадают, то в этой ситуации программа напечатает букву В, для трех точек программа напечатает букву С и так далее.

Можем ли мы нарисовать график зависимости роста от веса отдельно для мужчин и для женщин? Ответ, "да" и достаточно легко. Точно таким же образом как мы использовали команду BY с процедурой MEANS ранее, мы можем использовать ту же самую команду BY с процедурой PLOT для того, чтобы создать отдельные графики для мужчин и для женщин. Вначале нам будет необходимо попросить программу SAS отсортировать наши данные по переменной "ПОЛ" (GENDER). После того, как это будет сделано мы можем использовать процедуру PLOT для того, чтобы нарисовать желаемые графики. Наша программа будет выглядеть следующим образом:

DATA HTWT;
INPUT SUBJECT GENDER $ HEIGHT WEIGHT;
DATALINES;
1 M 68.5 155
2 F 61.2 99
3 F 63.0 115
4 M 70.0 205
5 M 68.6 170
6 F 65.1 125
7 M 72.4 220
;

PROC SORT DATA=HTWT;
    BY GENDER;
RUN;

PROC PLOT DATA=HTWT;
     BY GENDER;
    PLOT WEIGHT*HEIGHT;
RUN;

Результаты деятельности этой программы - это два отдельных графика для мужчин и для женщин. Если мы, при использовании процедуры PLOT, опустим команду BY, программа проигнорирует тот факт, что наш набор данных отсортирован по переменной "ПОЛ".

Мы можем создать другой график и вывести на него данные для мужчин и женщин на одном и том же графике, но вместо обычных символов для подобного графика А, В, С и так далее, мы будем использовать букву F и M для женщин и мужчин, соответственно. Команда:

PROC PLOT DATA=HTWT;
    PLOT WEIGHT*HEIGHT=GENDER;
RUN;

приводит к желаемому результату. Набор данных уже не обязательно должен быть отсортирован для того, чтобы использовать эту форму процедуры PLOT. "=GENDER" после запроса на создание графика указывает нам на то, что первая группа каждого из значений переменной GENDER ("ПОЛ") будет использоваться в качестве символа для обозначения точек. На самом деле это позволяет нам посмотреть на все три переменные (рост, вес и пол) одновременно. Результаты выполнения процедуры, описанной выше, показаны далее:

Поскольку мы не используем стандартные символы для создания графика (А, В, С и так далее) множественные наблюдения, которые встречаются в одной и той же точке, уже не будут показаны на графике, за исключением случая, когда у нас в одной точке встречаются один мужчина и одна женщина при этом F и M будут наложены друг на друга, если мы используем опцию OVP и наше устройство, на которое идет распечатка, например принтер, поддерживает систему печати одного значения поверх другого. Программа распечатает нам сообщение, указывая количество "скрытых" наблюдений внизу под графиком.

Если бы Вы захотели для обозначения точек выбрать какой-то собственный символ, а не используемые SAS по умолчанию буквы А, В, С и так далее, Вы можете за командой PLOT поставить знак равенства и указать на символ, который Вы хотели бы использовать в качестве обозначения Ваших точек, причем этот символ должен быть заключен в ординарные кавычки. Если бы Вы, например, хотели бы, чтобы символом для обозначения точек была бы звездочка, Ваш запрос выглядел бы следующим образом:

PLOT WEIGHT*HEIGHT='*';

Так же как в случае, когда за знаком равенства следует имя переменной, указание символа для обозначения точек не позволит каким-то образом продемонстрировать "скрытые" наблюдения и Вам будет распечатано сообщение, указывающее есть ли какие-то "скрытые" наблюдения.

Создание суммарных наборов данных при помощи процедур MEANS и UNIVARIATE.

Кроме создания печатной версии описательных статистик, разделенных при помощи одной или более переменной CLASS ( или BY), процедура MEANS и процедура UNIVARIATE могут быть использованы для создания нового набора данных системы SAS, содержащий любую из статистик, рассчитанную этими процедурами. Это может быть полезным, например, в педагогических исследованиях, где оригинальные данные собираются от индивидуальных студентов, но Вы в качестве единицы наблюдения хотели бы использовать средние для каждой группы при сравнении преподавателей или при сравнении показателей в бизнесе (для того, чтобы сравнивать продажи по различным кварталам, когда оригинальные данные собираются ежедневно). В медицине у Вас могут собираться клинические данные посвященные визиту каждого пациента, с различным количеством визитов для каждого пациента и Вы могли бы подсчитать средние значения для каждого пациента для будущего анализа.

Для того, чтобы продемонстрировать как мы все это можем сделать, предположим, что мы собрали данные по нескольким студентам. У нас есть номер студента, его пол, имя преподавателя, возраст преподавателя и две экзаменационные оценки (пре-тест и пост-тест). В нашем примере мы используем следующий набор данных:

СТУДЕНТ    ПОЛ    ПРЕПОДАВ.  ВОЗРАСТ ПРЕТЕСТ ПОСТЕСТ
   1        M      JONES      35      67        81
   2        F      JONES      35      98        86
   3        M      JONES      35      52        92
   4        M      BLACK      42      41        74
   5        F      BLACK      42      46        76
   6        M      SMITH      68      38        80
   7        M      SMITH      68      49        71
   8        F      SMITH      68      38        63
   9        M      HAYES      23      71        72
  10        F      HAYES      23      46        92
  11        M      HAYES      23      70        90
  12        F      WONG       47      49        64
  13        M      WONG       47      50        63

Примечание: (1) ВОЗРАСТ (далее T_AGE) - это возраст преподавателя. (2) В "реальном" исследовании мы скорее всего ввели бы имя преподавателя и его возраст один раз в отдельном наборе данных, а затем скомбинировали бы его со студенческими данными, что позволило бы нам печатать, или вводить немножко меньшее количество данных. Однако для данного примера проще было бы включить возраст преподавателя для каждого наблюдения.

В качестве первого шага давайте посмотрим как бы мы могли подсчитать средние значения для пре-теста и пост-теста и разницу этих значений, то есть сколько набрал студент для каждого преподавателя. Посмотрите на следующую программу:

DATA SCHOOL;
LENGTH GENDER $ 1 TEACHER $ 5;
INPUT SUBJECT GENDER $ TEACHER $ T_AGE PRETEST POSTTEST;
GAIN = POSTTEST - PRETEST;
DATALINES;
Здесь идут данные
;
PROC MEANS DATA=SCHOOL N MEAN STD MAXDEC=2;
    CLASS TEACHER;
    TITLE 'Means Scores for Each Teacher';
    VAR PRETEST POSTTEST GAIN;
RUN;

Программа достаточно проста. На этапе ввода данных (DATA) мы подсчитываем разность в оценках, а у процедуры MEANS (среднее) мы затребуем статистику для каждого преподавателя , включая в качестве классификационной (CLASS) переменной преподавателя (TEACHER). Ключевое слово LENGTH (длина) используется для того, чтобы указать какова должна быть длина цифровых значений, таких как пол (GENDER) и (TEACHER) преподаватель ( 1 и 5, соответственно). Мы включили это значение, поскольку используется формат данных с пробелами между значениями и соответственно для всех переменных используется по умолчанию значение равное восьми. Вот какой результат мы получаем:

Means Scores for Each Teacher

TEACHER  N Obs  Variable   N          Mean       Std Dev
--------------------------------------------------------
BLACK        2  PRETEST    2         43.50          3.54
                POSTTEST   2         75.00          1.41
                GAIN       2         31.50          2.12

HAYES        3  PRETEST    3         62.33         14.15
                POSTTEST   3         84.67         11.02
                GAIN       3         22.33         22.59

JONES        3  PRETEST    3         72.33         23.46
                POSTTEST   3         86.33          5.51
                GAIN       3         14.00         26.00

SMITH        3  PRETEST    3         41.67          6.35
                POSTTEST   3         71.33          8.50
                GAIN       3         29.67         10.79

WONG         2  PRETEST    2         49.50          0.71
                POSTTEST   2         63.50          0.71
                GAIN       2         14.00          1.41
--------------------------------------------------------

Вместо того, чтобы просто распечатать наши результаты, что бы мы хотели сделать - это создать новый набор данных в котором бы в качестве единицы наблюдения был бы преподаватель (TEACHER), а не каждый конкретный студент (SUBJECT). В нашем примере у нас имеется только пять преподавателей, но у нас их может быть и сто, они могут использовать различные методы преподавания, работать в разных учебных заведениях и так далее. Для того чтобы создать новый набор данных мы делаем следующее:

PROC MEANS DATA=SCHOOL NOPRINT NWAY; (1)
    CLASS TEACHER;
    VAR PRETEST POSTTEST GAIN;
    OUTPUT OUT=TEACHSUM (2)
    MEAN=M_PRE M_POST M_GAIN;
RUN;

* Для того, чтобы получить информацию о том, что содержится в наборе данных TEACHSUM, надо добавить :;
PROC PRINT DATA=TEACHSUM;
    TITLE 'Listing of Data Set TEACHSUM';
RUN;
* Эй! Это хороший пример того, чем хороши комментарии . ;

Опция NOPRINT в первой строке (1) сообщает программе, что нам не надо печатать результаты этой процедуры ( поскольку они уже у нас имеются от прошлого прогона данных, или распечатка была бы слишком большой, чтобы нам хотелось ее просматривать). Мы хотим, чтобы рассчитанные статистики (в данном случае средние) оказались в новом наборе данных. Для этого мы включаем ключевое слово OUTPUT (2) в процедуру MEANS. Ключевое слово OUTPUT создает новый набор данных. Мы должны дать ему то название, которое нам больше нравиться (указав ключевое слово, в данном случае OUT=TEASHSUM), затем сообщить какие бы мы хотели, чтобы в нем присутствовали статистики и какие имена должны быть даны этим статистикам.

Мы можем внести в этот новый набор данных любые статистики, которые рассчитываются процедурой MEANS. Для того, чтобы это сделать используем команду OUTPUT, которая создает новый набор данных. Эти статистики будут рассчитаны для всех перменных в списке VAR и будут поделены в соответствии с классифицирующей переменной (указанной при помощи команды CLASS). Поскольку мы хотим чтобы в новом наборе данных были только средние значения, мы пишем следующее "MEAN=M_PRE M_POST M_GAIN". Эти новые переменные представляют собой средние каждой из переменных, перечисленных в команде VAR в той же последовательности, в которой перечислены эти переменные. Таким образом M_PRE представляет собой среднее значение для переменной PRETEST. M_POST представляет собой среднее значение для переменной POSTEST и M_GAIN означает среднее значение для переменной GAIN. Мы могли бы назвать эти новые переменные MANNY, MOE и JACK. SAS на самом деле вообще все равно как Вы их назовете. Мы использовали название M_PRE M_POST и M_GAIN поскольку это позволяет нам запомнить, что эти переменные собой представляют: M - от слова Means - среднее, PRE - пре-тест, POST - посттест и GAIN-увеличение значений.

Кроме того нам требуется еще объяснить необходимость существования ключевого слова NWAY на первой строке (1). Это ключевое слово сообщает процедуре, что мы хотим, чтобы были внесены данные для каждого преподавателя (TEACHER) (классифицирующей переменной) и не включать общую среднюю в новый набор данных. Не забудьте это! Мы позднее объясним, что произойдет если Вы этого не сделаете. Ваш новый набор данных (распечатка, вызванная процедурой PRINT) будет выглядеть следующим образом:

Листинг набора данных TEACHSUM

OBS TEACHER _TYPE_  _FREQ_    M_PRE     M_POST     M_GAIN

1   BLACK     1       2      43.5000    75.0000    31.5000
2   HAYES     1       3      62.3333    84.6667    22.3333
3   JONES     1       3      72.3333    86.3333    14.0000
4   SMITH     1       3      41.6667    71.3333    29.6667
5   WONG      1       2      49.5000    63.5000    14.0000

Мы сейчас не будем объяснять значения переменной _TYPE_ пока мы не рассмотрим наш следующий пример. Переменная _FREQ_ дает нам количество наблюдений для каждого значения классифицирующей переменной. Если Вы вернетесь назад к оригинальному набору данных, Вы увидите, что у преподавателя по фамилии BLACK было два студента, по фамилии HAYES три студента и так далее.

Что произошло бы, если бы Вам захотелось в этот новый набор данных внести возраст преподавателя (чтобы Вы могли сравнить его возраст с тем, насколько улучшились оценки у студентов, например)? Этого можно легко добиться, включив команду ID как часть процедуры средней (MEANS). Таким образом для того, чтобы включить возраст преподавателя в этот новый набор данных, Вам необходимо использовать следующий код:

PROC MEANS DATA=SCHOOL NOPRINT NWAY; (1)
    CLASS TEACHER;
    ID T_AGE;
    VAR PRETEST POSTTEST GAIN;
    OUTPUT OUT=TEACHSUM (2)
    MEAN=M_PRE M_POST M_GAIN;
RUN;

Соответствующий этому набор данных (TEASHSUM) теперь содержит переменную T_AGE. В качестве альтернативы мы могли бы включить как переменную ПРЕПОДАВАТЕЛЬ (TEACHER), так и T_AGE в качестве классифицирующей переменной, что привело бы к тому же самому результату.

Теперь мы обратимся к более сложному примеру. Например когда мы хотим создать новый набор данных с использованием процедуры MEANS и команды CLASS с более чем одной классифицирующей переменной. Ну ребята, держитесь, теперь начинается достаточно сложное! Во-первых давайте посмотрим на исходные данные:

Пациент  Пол  Регион    Рост    Вес
01       M    North      70     200
02       M    North      72     220
03       M    South      68     155
04       M    South      74     210
05       F    North      68     130
06       F    North      63     110
07       F    South      65     140
08       F    South      64     108
09       F    South       .     220
10       F    South      67     130

Теперь мы создаем набор данных SAS следующим образом:

DATA DEMOG;
LENGTH GENDER $ 1 REGION $ 5;
INPUT SUBJ GENDER $ REGION $ HEIGHT WEIGHT;
DATALINES;
01 M North 70 200
02 M North 72 220
03 M South 68 155
04 M South 74 210
05 F North 68 130
06 F North 63 110
07 F South 65 140
08 F South 64 108
09 F South . 220
10 F South 67 130
;
RUN;

Для того, чтобы подсчитать количество людей, среднее и стандартное отклонение для каждой комбинации пола (GENDER) и региона (REGION) мы включаем классифицирующую переменную с процедурой MEANS, наподобие этого:

PROC MEANS DATA=DEMOG N MEAN STD MAXDEC=2;
    TITLE 'Output from PROC MEANS';
    CLASS GENDER REGION;
    VAR HEIGHT WEIGHT;
RUN;

Помните, что Вам нет необходимости сортировать Ваш набор данных, когда Вы используете команду CLASS с процедурой MEANS. В данном случае у нас за командой CLASS следуют две переменных, а не одна. Результат деятельности данной процедуры показан далее:

Output from PROC MEANS
                      
   GENDER  REGION  N Obs  Variable   N          Mean       Std Dev
   ---------------------------------------------------------------
   F       North       2  HEIGHT     2         65.50          3.54
                          WEIGHT     2        120.00         14.14

           South       4  HEIGHT     3         65.33          1.53
                          WEIGHT     4        149.50         48.86

   M       North       2  HEIGHT     2         71.00          1.41
                          WEIGHT     2        210.00         14.14

           South       2  HEIGHT     2         71.00          4.24
                          WEIGHT     2        182.50         38.89
   ---------------------------------------------------------------

Поскольку теперь у нас есть две классифицирующие переменные, запрошенные нами статистики подсчитываются для каждой комбинации пола и региона (GENDER и REGION).

Мы вначале продемонструем, что произойдет, если мы будем использовать процедуру MEANS для того, чтобы создать новый набор данных с полом и регионом (GENDER и REGION) в качестве классифицирующей переменной. Вот какой код используется для этого:

PROC MEANS DATA=DEMOG NOPRINT; (1)
    CLASS GENDER REGION;
    VAR HEIGHT WEIGHT;
    OUTPUT OUT=SUMMARY (2)
    MEAN=M_HEIGHT M_WEIGHT; (3)
RUN;

***Надо добавить PROC PRINT, чтобы просмотреть данные в файле SUMMARY;
PROC PRINT DATA=SUMMARY;
    TITLE 'Listing of Data Set SUMMARY';
RUN;

Не обращайте особого внимания на три звездочки в комментариях в приведенной выше команде. Помните, что первая звездочка начинает комментарий, а точка с запятой заканчивает комментарий. Мы добавили другие две звездочки для того, чтобы комментарий лучше выглядел.

Как и раньше опция NOPRINT на первой строке (1) сообщает процедуре, чтобы она не делала никаких распечаток. Вы вместо этого хотите, чтобы значения ушли в новый набор данных. Для этого Вы добавляете команду OUTPUT (2) к процедуре MEANS. Команда OUTPUT позволяет Вам создать новый набор данных, выбрать какие статистики будут помещены в этот новый набор данных и какое имя необходимо дать каждой из запрошенных статистик. Название этого нового набора данных размещается после ключевого слова OUT= . Запрос на средние указываются ключевым словом MEAN= (3). Два имени переменных , которые следуют за словом MEAN= - это имена которе Вы выбрали бы для того, чтобы представлять средние для роста и веса, соответственно ( HEIGHT и WEIGHT). Последовательность имен следом за ключевым словом MEAN= соответствует последовательности названия переменных в команде VAR. В данной случае переменная M_HEIGHT представляет средний рост и переменная M_WEIGHT представляет средний вес. Другие ключевые слова, выбранные из списка статистик, доступные в процедуре MEANS, которые были описаны ранее в этой главе и были использованы в данном случае - это стандартное отклонение (STD=), или сумма ( SUM=).

Используя процедуру PRINT для того, чтобы распечатать новый набор данных под названием SUMMARY, мы видим содержание этого нового набора данных:

Listing of Data Set SUMMARY                   

 OBS    GENDER    REGION    _TYPE_    _FREQ_    M_HEIGHT    M_WEIGHT

  1                            0        10       67.8889     162.300
  2               North        1         4       68.2500     165.000
  3               South        1         6       67.6000     160.500
  4       F                    2         6       65.4000     139.667
  5       M                    2         4       71.0000     196.250
  6       F       North        3         2       65.5000     120.000
  7       F       South        3         4       65.3333     149.500
  8       M       North        3         2       71.0000     210.000
  9       M       South        3         2       71.0000     182.500

Кроме каждой комбинации пола и региона (GENDER и REGION), мы видим пять дополнительных наблюдений и две дополнительных переменных _TYPE_ и _FREQ_. Теперь разберемся, что они все означают. Первое наблюдение со значением 0 для переменной _TYPE_ - это среднее всех не пропущенных значений ((9 для роста (HEIGHT) и 10 для веса WEIGHT)) и оно называется общим средним. Два наблюдения с типом _TYPE_ равным 1 - это среднее для роста и веса для каждого региона. Следующие два наблюдения с _TYPE_ равным 2 - это среднее роста и веса для каждого пола. И наконец последние 4 наблюдения с _TYPE_ равным 3 - это средние по полу и возрасту (иногда называемые ячеичными средними). Это уже становится сложным! Расслабтесь. На самом деле есть достаточно простой способ выяснить, какое значение соответствует какому типу данных. Посмотрите внимательно на команду CLASS. Она записана следующим образом:

CLASS GENDER REGION;

Во-первых давайте посчитаем в двоичных цифрах (помните, что двоичные цифры это 0, 1, 10, 11, 100, 101 и так далее) и поместим бинарные значения под переменные CLASS следующим образом:

CLASS GENDER REGION;

Бинарный

_TYPE_

Интерпретация

0 0

0

Средняя всех полов и регионов

0 1

1

Средняя для региона

1 0

2

Средняя для каждого значения пола

1 1

3

Средняя для каждой комбинации пола и региона

Теперь мы можем воспользоваться очень простым правилом. В том случае, если значение переменной _TYPE_ написанное как бинарное, дает Вам "1", при подсчете статистики для разделения групп использовалась эта переменная. Если мы смотрим на _TYPE_= 1, мы его пишем в качестве бинарного значения (это не очень сложно) как 01 и мы понимаем, что _TYPE_= 1 статистика представляет собой значения разбитые по значению регион (REGION) и так далее. Все еще запутаны? Ничего страшного, это действительно не так просто.

В большинстве случаев Вам не надо будет смотреть на значение переменной _TYPE_, поскольку большинство приложений требует, чтобы мы сосчитали ячичные средние (значения, которые разделены по каждой из классифицирующих переменных). Вы можете использовать только самые высокие значения переменной _TYPE_ . Если Вы включите опцию NWAY качестве ключевого слова в процедуру MEANS, в новый набор данных будут записаны только ячеичные средние. Поэтому, если вы хотите, чтобы у Вас были подсчитаны средние роста и веса только для каждой комбинации пола и региона, Вы запишете процедуру MEANS следующим образом:

PROC MEANS DATA=DEMOG NOPRINT NWAY;
    CLASS GENDER REGION;
    VAR HEIGHT WEIGHT;
    OUTPUT OUT=SUMMARY
    MEAN=M_HEIGHT M_WEIGHT;
RUN;

PROC PRINT DATA=SUMMARY;
    TITLE 'Listing of Data Set SUMMARY with NWAY Option';
RUN;

Результирующий набор данных, показанный ниже, содержит только значения _TYPE_ = 3.

Listing of Data Set SUMMARY with NWAY Option           

OBS  GENDER  REGION  _TYPE_  _FREQ_  M_HEIGHT  M_WEIGHT

1     F      North      3      2     65.5000     120.0
2     F      South      3      4     65.3333     149.5
3     M      North      3      2     71.0000     210.0
4     M      South      3      2     71.0000     182.5

Значения переменной _FREQ_ - это количество наблюдений в каждой подгруппе. Например, в нашем наборе находилось две женщины с севера, поэтому _FREQ_= 2 в первом наблюдении в суммарном наборе данных. Если Вам необходимо знать количество непропущенных значений, которые были использованы для подсчета требуемой статистики, включите запрос, обозначаемый N= . Давайте продемонстрируем это при помощи следующего кода:

PROC MEANS DATA=DEMOG NOPRINT NWAY;
    CLASS GENDER REGION;
    VAR HEIGHT WEIGHT;
    OUTPUT OUT=SUMMARY
    N=N_HEIGHT N_WEIGHT
    MEAN=M_HEIGHT M_WEIGHT;
RUN;

PROC PRINT DATA=SUMMARY;
    TITLE1 ' Листинг файла SUMMARY с опцией NWAY';
    TITLE2 ' и запросами N= и MEAN=';
RUN;

В данной программе мы выбрали для названия переменных имена N_HEIGHT и N_WEIGHT для того, чтобы представить количество непропущенных наблюдений. Результат, показанный ниже, указывает на различия межу значениями _FREQ_ и N= достаточно точно:

OBS GENDER REGION _TYPE_ _FREQ_ N_HEIGHT N_WEIGHT M_HEIGHT M_WEIGHT

  1    F    North     3      2       2        2     65.5000   120.0
  2    F    South     3      4       3        4     65.3333   149.5
  3    M    North     3      2       2        2     71.0000   210.0
  4    M    South     3      2       2        2     71.0000   182.5

Обратите внимание на то, что значения N_HEIGHT равняется 3 для женщин с юга, в то время как значение _FREQ_ равняется 4 (поскольку для одной женщины с юга у нас отсутствовало значение роста).

В конце концов, если Вы используете ключевое слово NWAY у Вас нет большой необходимости включать переменную _TYPE_ в результирующий набор данных. Вы можете использовать опцию DROP= для того, чтобы исключить данную переменную. Модифицированная программа будет выглядеть следующим образом:

PROC MEANS DATA=DEMOG NOPRINT NWAY;
    CLASS GENDER REGION;
    VAR HEIGHT WEIGHT;
    OUTPUT OUT=SUMMARY(DROP=_TYPE_)
    N=N_HEIGHT N_WEIGHT
    MEAN=M_HEIGHT M_WEIGHT;
RUN;

 

Некоторые ленивые программисты иногда опускают список переменных следом за запросом статистики, когда запрашивается только одна статистика. Например, если Вы хотите получить средние для каждой комбинации пола и региона (GENDER и REGION), мы могли бы написать так:

PROC MEANS DATA=DEMOG NOPRINT NWAY;
    CLASS GENDER REGION;
    VAR HEIGHT WEIGHT;
    OUTPUT OUT=SUMMARY(DROP=_TYPE_)
    MEAN=;
RUN;

При использовании этого метода имена переменных в новом суммарном наборе данных будут точно такими же, как и те, что перечислены в команде VAR. Иными словами, название переменной, которое представляет средний рост, будет HEIGHT и название переменной, представляющей средний вес будет WEIGHT. Это по всей вероятности достаточно плохая идея, поскольку Вы можете запутаться и забыть, что Вы имеете дело с суммарными статистиками, а не с оригинальными значениями ( на самом деле другой автор даже не будет указывать (DROP= _TYPE_) поскольку печать этих слов занимает достаточное количество времени, а его не очень сильно волнует, если в распечатке будет находиться дополнительная переменная).

Распечатка других статистических показателей

Мы уже видели, что процедура MEANS может быть использована для того, чтобы создать новый набор данных при помощи команды OUTPUT и этот новый набор данных будет содержать средние для каждой переменной, которая указана в списке команды VAR для каждого уровня переменных, определяемой командами CLASS или BY. Мы использовали ключевое слово MEAN= для того, чтобы указать на то, какие значения мы бы хотели включить в результирующий набор данных. Любая из опций, которая может быть использована с процедурой MEANS (смотри выше), может быть также использована для того, чтобы создать переменные в новом наборе данных. Например, если бы мы хотели, чтобы наш новый набор данных содержал среднее, стандартное отклонение и максимальное значение, мы бы написали следующее:

PROC MEANS DATA=DEMOG NOPRINT NWAY;
    CLASS GENDER REGION;
    VAR HEIGHT WEIGHT;
    OUTPUT OUT =STATS
    MEAN=M_HEIGHT M_WEIGHT
    STD =S_HEIGHT S_WEIGHT
    MAX =MAX_HT MAX_WT;
RUN;

Обратите внимание на то, что мы ДОЛЖНЫ включить в список имен переменных после ключевых слов MEAN= , STD=, МAX= поскольку нам необходимо иметь различные имена переменных для каждой из этих статистик. Результирующий набор данных (STATS) будет включать переменные пол и регион (GENDER и REGION), а также переменные, представляющие средние, стандартное отклонение, максимум и две переменные _TYPE_ и _FREQ_ , которые автоматически создаются данной процедурой.

Создание суммарного набора данных, содержащего медиану.

Поскольку процедура MEANS не рассчитывает медианы, Вам необходимо будет использовать процедуру UNIVARIATE, если Вы бы хотели создать суммарный набор данных, который бы содержал эту статистику. Команды, которые используются для того, чтобы создать новый набор данных с использованием процедуры UNIVARIATE, аналогичны тем, что используются для процедуры MEANS, за исключением того, что Вы должны использовать команду BY, а не CLASS, поскольку процедура UNIVARIATE не поддерживает команду CLASS (а это очень плохо).

Ключевые слова, используемые для того, чтобы рассчитать различные статистические показатели при использовании процедуры UNIVARIATE, аналогичны тем, что были перечислены ранее в данной главе. Для того, чтобы внести в новый набор данных как средние, так и медианы, мы должны написать следующее:

PROC SORT DATA=DEMOG;
    BY GENDER REGION;
RUN;

PROC UNIVARIATE DATA=DEMOG NOPRINT;
    BY GENDER REGION;
    VAR HEIGHT WEIGHT;
    OUTPUT OUT=SUM
    N = N_HT N_WT
    MEDIAN = MED_HT MED_WT
    MEAN = MEAN_HT MEAN_WT;
RUN;

PROC PRINT DATA=SUM;
    TITLE 'Listing of Data Set SUM';
RUN;

Результирующий новый набор данных показан ниже:

OBS    GENDER  REGION   N_HT  N_WT  MEAN_HT  MEAN_WT  MED_HT  MED_WT

   1     F     North     2     2   65.5000   120.0    65.5    120.0
   2     F     South     3     4   65.3333   149.5    65.0    135.0
   3     M     North     2     2   71.0000   210.0    71.0    210.0
   4     M     South     2     2   71.0000   182.5    71.0    182.5