Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Статистика в SPSS: за пределами кнопочного интерфейса. Выпуск 16


В рассылке используются материалы веб-сайта www.spsstools.ru

Содержание выпуска

Усреднение значений по нескольким переменным

Новое на сайте www.spsstools.ru


Здравствуйте, уважаемые подписчики!

Напомню, что продолжается приём заявок на "Справочник по синтаксису SPSS". С анонсом этого проекта можно ознакомиться в 14-м выпуске рассылки.

Усреднение значений по нескольким переменным

Сегодня мы разберём довольно специфичные ситуации расчёта средних величин (усреднения значения наблюдения) по нескольким переменным. Поможет нам в этом синтаксис из коллекции Рейналя "Вычислить среднее по m переменным, где m берётся из другой переменной.SPS". Данный пример ещё раз продемонстрирует нам гибкие возможности управления данными, заложенные в командном языке SPSS.

Определим данные примера. У нас будет вспомогательная переменная gmplans (её назначение станет ясно чуть позже), а также - 4 переменные fpr_iy1 - fpr_iy4, которые мы определяем в команде DATA LIST через ключевое слово "TO". Нас будет интересовать расчёт среднего (арифметического) значения по этим четырём переменным для каждого случая. Но данная задача каждый раз будет формулироваться с некоторыми вариациями.

Обратите внимание, что в команде DATA LIST тип переменных явно не задаётся, но по умолчанию они получают тип формата Numeric с форматом F8.2 - стандартный формат отображения числовых переменных. Команду NEW FILE можно опустить, но, с другой стороны, она бывает полезна, если от предыдущих неудачных экспериментов осталась серия "висящих" отложенных трансформаций, которые никак не удаётся отменить.

 

NEW FILE.

DATA LIST LIST /gmplans fpr_iy1 TO fpr_iy4.

BEGIN DATA
1 4 3 2 1
2 4 3 2 1
3 4 3 2 1
4 4 3 2 1
0 4 3 2 1
2 4 5 m 6
1 1 m m m

END DATA.

 

В последних двух наблюдениях, введённых через команду BEGIN DATA - END DATA присутствуют пропущенные значения. Они обозначены буквами "m". Наличие текстовых данных для переменных числового формата не смутит SPSS - на каждый случай он выдаст нам в окне результатов предупреждение, что есть попытка приписать текстовое значение числовой переменной. Результат каждой такой попытки будет пропущенное значение в соответствующей переменной. Собственно, именно этого мы и добивались.

Рассмотрим теперь разные варианты расчёта усреднения значений переменных fpr_iy1 - fpr_iy4.

 

1. "Просто" средние значения

Для подобных задач в SPSS существует функция MEAN, аргументами которой являются конкретные числовые значения, либо имена переменных, которые эти значения содержат. Имена могут задаваться через запятые, либо через ключевое слово "TO". Аргументы функции MEAN также сами могут являться другими функциями. Рассмотрим несколько примеров. Во-первых, важно понять: функция MEAN не вычисляет среднее значение какой-либо переменной "по столбцу". Она усредняет для каждого случая значения переменных и конкретных чисел, которые содержатся в аргументах MEAN. То же самое, кстати, верно и для множества других функций - SUM, MIN, MAX... Выражение

 

COMPUTE aver=MEAN(fpr_iy2).

EXE.


не подставит в переменную aver среднее значение переменной fpr_iy2 по всей базе данных, а просто ...скопирует значение этой переменной для каждого случая. Пропущенные значения при этом игнорируются. Ещё раз, функция MEAN усредняет индивидуальные значения своих аргументов для каждого объекта. В этом смысле команда, представленная выше, эквивалентна

 

COMPUTE aver=fpr_iy2.

EXE.

 

Пример более целевого использования MEAN:

 

COMPUTE aver=MEAN(fpr_iy1, fpr_iy2).

EXE.


В данном случае происходит усреднение для каждого объекта индивидуальных значений переменных fpr_iy1 и fpr_iy2. Обратите внимание, что переменная, содержащая пропущенное значение просто исключается из расчёта. Но это не приводит к автоматическому исключению из расчёта всего наблюдения. Для последнего наблюдения в нашем примере результат применения этой функции составит "1", то есть единственное непропущенное значение (из переменной fpr_iy1). Разумеется, знаменателем при расчёте среднего арифметического будет не общее число аргументов функции MEAN, а количество аргументов с непропущенными значениями. Подобное свойство многих функций безболезненно исключать пропущенные значения очень полезно, если наличие пропуска не означает ошибки. Заметьте, что результат предыдущей команды будет отличаться для последнего наблюдения от результата следующего выражения:

 

COMPUTE aver1=(fpr_iy1+fpr_iy2)/2.

EXE.

 

Если требуется рассчитать среднее значение по большому числу переменных, можно использовать ключевое слово "TO".

 

COMPUTE aver=MEAN(fpr_iy1 to fpr_iy4).

LIST aver.


Тут для применения отложенных вычислений мы использовали команду LIST. Она сразу же выводит результат расчётов в окно вывода результатов.

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

 

COMPUTE aver=MEAN(fpr_iy1,fpr_iy1 to fpr_iy4, 3).

LIST aver.


Тут мы дважды учли значение переменной fpr_iy1, да ещё добавили константу "3".

Если аргументы задаются через запятую, можно подставлять на их место другие функции. Следующий пример находит средний квадрат значений переменных fpr_iy1 и fpr_iy2:

 

COMPUTE aver=MEAN(fpr_iy1**2, fpr_iy2**2).

LIST aver.

 

Однако попытка использовать функции в сочетании с ключевым словом "TO" не пройдёт. Программа сообщит, что так делать нельзя и откажется считать:

 

COMPUTE aver=MEAN(fpr_iy1**2 to fpr_iy2**2).

EXE.

 

2. Средние значения с минимально необходимым числом аргументов

Если вы используете функцию MEAN, аргументами которой являются имена нескольких переменных, для многих из которых нередки пропущенные значения, вы можете указать, какое минимальное число валидных аргументов является допустимым:

 

COMPUTE aver=MEAN.2(fpr_iy1 to fpr_iy4).

LIST aver.

 

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

 

3. Среднее значение по переменному числу аргументов (собственно, пример синтаксиса из коллекции)

Синтаксис предлагает решение весьма интересной проблемы. Если у вас присутствуют, например, как в данном случае, 4 переменных, вам может потребоваться для каждого наблюдения рассчитать среднее значение только по m, m={0..4} первым из этих переменных. Причём m для каждого наблюдения своё (m=0 означает отказ от расчёта среднего значения).

На практике подобная ситуация может возникнуть, например, когда переменные fpr_iy1 - fpr_iy4 содержат некие показатели за 4 периода времени в порядке возрастания давности. Для каждого из наблюдений m периодов назад изменился режим формирования значений этих показателей (например, уже 3 месяца клиент пользуется специальной скидкой, что может отражаться на объёме его заказов). Нам требуется узнать среднее значение этих показателей для каждого наблюдения не за все 4 периода, а лишь за указанные m.

В данном примере m берётся из переменной gmplans. Например, для второго наблюдения (gmplans=2) нам нужно среднее значение по первым двум переменным, т.е. по переменным fpr_iy1 и fpr_iy2.

Автор этого синтаксиса: Raynald Levesque. Пример выложен в коллекцию www.spsstools.net в феврале 2004 года.

 

Созданные ранее переменные лучше убрать:

 

DELETE VARIABLES aver aver1.

 

При решении задачи функция MEAN не используется, так как она может принимать лишь фиксированное число аргументов. Используем изящную комбинацию векторной адресации и цикла LOOP.

Временно объявим исходные переменные вектором. Это даст нам возможность ссылок на них в виде v1(1) - это будет означать ссылку на первую переменную из вектора, fpr_iy1. Определение вектора будет существовать в памяти машины до первого прохода по данным (до команды на запуск отложенных вычислений).

 

VECTOR v1 = fpr_iy1 TO fpr_iy4.

 

Определим цикл LOOP. Поскольку данный цикл выполняется для каждого наблюдения по отдельности, мы можем выбрать индивидуальное количество повторений (от 1 до значения переменной gmplans). Далее используется условная конструкция DO IF - ELSE - END IF. Если индексная переменная #i равна 1, это означает, что для данного наблюдения у нас цикл исполняется в первый раз. Этот же первый раз может оказаться и последним, если в переменной gmplans стояло значение 1. В любом случае, мы копируем в переменную aver значение из первой переменной вектора (fpr_iy1).

Если же #i не равно 1, мы выполняем две команды. Первой мы суммируем значение #i-й переменной из вектора с тем значением, которое уже содержалось в переменной aver. В случае, если там ранее был пропуск, либо значение v1(#i) само является пропуском, результат SUM(aver, v1(#i)) будет равен значению аргумента без пропуска (либо будет равен пропуску, если оба аргумента - пропуски). Второй командой мы завершаем вычисление среднего значения в том случае, если #i дошёл до верхней границы своего изменения (gmplans). Таким образом, деление всегда происходит на значение переменной gmplans. Делаем для себя вывод, что данное решение нужно применять с осторожностью: программа будет возвращать некорректные средние значения, если хотя бы один из аргументов fpr_iy1 - fpr_iy4 будет являться пропуском! А точнее, пропуски будут интерпретироваться как нулевые значения, если только все переменные fpr_iy1 - fpr_iy4 не содержат пропущенные значения. В последнем случае aver также будет пропуском.

 

LOOP #i = 1 TO gmplans.

- DO IF #i=1.

- COMPUTE aver = v1(#i) .

- ELSE.

- COMPUTE aver=SUM(aver, v1(#i)).

- IF #i=gmplans aver=aver/#i.

- END IF.

END LOOP.

 

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

 

DESCRIPTIVES
VARIABLES=aver
/STATISTICS=MEAN STDDEV MIN MAX .

 

Заметьте, что, поскольку в цикле LOOP в качестве индексной переменной использовалась #i (с решёткой), она не появится в файле данных. Если же значок # во всех случаях убрать, мы увидим, на каком значении i остановился цикл для каждого из наблюдений. Поскольку счётчик увеличивается по выполнении последней команды цикла, это значение всегда будет равно gmplans+1.

Ещё одно замечание. Для пятого наблюдения значение переменной gmplans = 0. Это вызывает запуск цикла с параметрами LOOP #i = 1 TO 0. Такой цикл, по правилам, выполнен не будет. Переменная aver будет содержать пропущенное значение.

 

Вот таким образом. Всего доброго.

 

Ведущий рассылки,

Балабанов Антон

Новое на сайте www.spsstools.ru

Переведены и добавлены примеры синтаксиса:

Доверительный интвервал Ходжеса-Лимана (Hodges-Lehmann) разности медиан.SPS

Точный доверительный интервал для параметра биномиального распределения.sps

 

© См. www.spsstools.ru, 2005-2006

 


В избранное