Привіт, шановні передплатники!
Нагадаю, що триває прийом заявок на "Довідник по синтаксису SPSS". З анонсом цього проекту можна ознайомитися в 14-му випуску розсилки.
Усереднення значень по декільком змінним
Сьогодні ми розберемо досить специфічні ситуації розрахунку середніх величин (усереднення значення спостереження) по декільком змінним. Допоможе нам у цьому синтаксис з колекції Рейналя "Обчислити середнє по m змінним, де m береться з іншої переменной.SPS". Даний приклад ще раз продемонструє нам гнучкі можливості управління даними, закладені в командному мовою SPSS.
Визначимо дані прикладу. У нас буде допоміжна змінна gmplans (її призначення стане ясно трохи пізніше), а також - 4 змінні fpr_iy1 - fpr_iy4, які ми визначаємо в команді DATA LIST через ключове слово "TO". Нас буде цікавити розрахунок середнього (арифметичного) значення по цим чотирьом змінним для кожного випадку. Але дана задача кожного разу буде формулюватися з деякими варіаціями.
Зверніть увагу, що в команді DATA LIST тип змінних явно не задається, але за замовчуванням вони отримують тип формату Numeric з форматом F8.2 - стандартний формат відображення числових змінних. Команду 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
В останніх двох спостереженнях, введених через команду BEGIN DATA - END DATA присутні пропущені значення. Вони позначені буквами "m". Наявність текстових даних для змінних числового формату не збентежить SPSS - на кожен випадок він видасть нам у вікні результатів попередження, що є спроба приписати текстове значення числової змінної. Результат кожної такої спроби буде пропущене значення у відповідній змінної. Власне, саме цього ми і добивалися.
Розглянемо тепер різні варіанти розрахунку усереднення значень змінних fpr_iy1 - fpr_iy4.
1. "Просто" середні значення
Для подібних завдань в SPSS існує функція MEAN, аргументами якої є конкретні числові значення, або імена змінних, які ці значення містять. Імена можуть задаватися через коми, або через ключове слово "TO". Аргументи функції MEAN також самі можуть бути іншими функціями. Розглянемо кілька прикладів. По-перше, важливо зрозуміти: функція MEAN не вирахував середнє значення будь-якої змінної "по стовпчику". Вона усредняет для кожного випадку значення змінних і конкретних чисел, які містяться в аргументах MEAN. Те ж саме, до речі, вірно і для безлічі інших функцій - SUM, MIN, MAX. вираз
НЕ підставить в змінну aver середнє значення змінної fpr_iy2 по всій базі даних, а просто. скопіює значення цієї змінної для кожного випадку. Пропущені значення при цьому ігноруються. Ще раз, функція MEAN усредняет індивідуальні значення своїх аргументів для кожного об'єкта. У цьому сенсі команда, представлена вище, еквівалентна
Приклад більш цільового використання MEAN:
COMPUTE aver = MEAN (fpr_iy1, fpr_iy2).
В даному випадку відбувається усереднення для кожного об'єкта індивідуальних значень змінних fpr_iy1 і fpr_iy2. Зверніть увагу, що змінна, що містить пропущене значення просто виключається з розрахунку. Але це не призводить до автоматичного виключення з розрахунку всього спостереження. Для останнього спостереження в нашому прикладі результат застосування цієї функції складе "1", тобто єдине непропущених значення (з змінної fpr_iy1). Зрозуміло, знаменником при розрахунку середнього арифметичного буде не загальне число аргументів функції MEAN, а кількість аргументів з непропущених значеннями. Подібна властивість багатьох функцій безболісно виключати пропущені значення дуже корисно, якщо наявність пропуску не означає помилки. Зауважте, що результат попередньої команди буде відрізнятися для останнього спостереження від результату наступного виразу:
Якщо потрібно розрахувати середнє значення по великому числу змінних, можна використовувати ключове слово "TO".
COMPUTE aver = MEAN (fpr_iy1 to fpr_iy4).
Тут для застосування відкладених обчислень ми використовували команду LIST. Вона відразу ж виводить результат розрахунків у вікно виведення результатів.
Використання "TO" і введення аргументів через кому можна запросто комбінувати. Ось, в деякому сенсі, беззмістовний з практичної точки зору приклад такого розрахунку:
COMPUTE aver = MEAN (fpr_iy1, fpr_iy1 to fpr_iy4, 3).
Тут ми двічі врахували значення змінної fpr_iy1, та ще додали константу "3".
Якщо аргументи задаються через кому, можна підставляти на їх місце інші функції. Наступний приклад знаходить середній квадрат значень змінних fpr_iy1 і fpr_iy2:
COMPUTE aver = MEAN (fpr_iy1 ** 2, fpr_iy2 ** 2).
Однак спроба використовувати функції в поєднанні з ключовим словом "TO" не пройде. Програма повідомить, що так робити не можна і відмовиться вважати:
COMPUTE aver = MEAN (fpr_iy1 ** 2 to fpr_iy2 ** 2).
2. Середні значення з мінімально необхідною кількістю аргументів
Якщо ви використовуєте функцію MEAN, аргументами якої є імена кількох змінних, для багатьох з яких нерідкі пропущені значення, ви можете вказати, яку мінімальну кількість валідних аргументів є допустимим:
COMPUTE aver = MEAN.2 (fpr_iy1 to fpr_iy4).
В даному випадку ми запросили, щоб середнє значення вважалося лише в тому випадку, якщо присутні, принаймні, 2 непропущених значення. Для останнього спостереження програма середнє значення не стане вважати.
3. Середнє значення по змінному числу аргументів (власне, приклад синтаксису з колекції)
Синтаксис пропонує рішення вельми цікавою проблеми. Якщо у вас присутні, наприклад, як в даному випадку, 4 змінних, вам може знадобитися для кожного спостереження розрахувати середнє значення тільки по m, m = першим з цих змінних. Причому m для кожного спостереження своє (m = 0 означає відмову від розрахунку середнього значення).
На практиці подібна ситуація може виникнути, наприклад, коли змінні fpr_iy1 - fpr_iy4 містять якісь показники за 4 періоди часу в порядку зростання давності. Для кожного з спостережень m періодів назад змінився режим формування значень цих показників (наприклад, вже 3 місяці клієнт користується спеціальною знижкою, що може відображатися на обсязі його замовлень). Нам потрібно дізнатися середнє значення цих показників для кожного спостереження не за всі 4 періоду, а лише за зазначені m.
В даному прикладі m береться з змінної gmplans. Наприклад, для другого спостереження (gmplans = 2) нам потрібно середнє значення по перших двох змінним, тобто по змінним fpr_iy1 і fpr_iy2.
Створені раніше змінні краще прибрати:
DELETE VARIABLES aver aver1.
Тимчасово оголосимо вихідні змінні вектором. Це дасть нам можливість посилань на них у вигляді 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.
- COMPUTE aver = v1 (#i).
- COMPUTE aver = SUM (aver, v1 (#i)).
- IF # i = gmplans aver = aver / # i.
Наступною командою ми запускаємо відкладені обчислення, отримуючи описову статистику для новостворюваної змінної 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
Переведені і додані приклади синтаксису: