Синтаксис вычисления частоты объектов разных категорий
при повторяемости объектов в файле данных
Вопрос, повлекший создание разбираемого сегодня синтаксиса,
возник при обработке больничной базы данных переломов у детей.
Вот как он звучал:
"Вопрос. Имеется медицинская база данных с информацией о
переломах у детей. В ней есть сведения о 194 детях, однако, поскольку у некоторых
из них имелись множественные переломы, фактически имеется 630 наблюдений.
Например, ребёнок с 3 сломанными рёбрами будет введён в базу
3 раза. Ребёнок с одним сломанным ребром и повреждением черепа будет введён
в базу 2 раза:
<Номер> <Перелом> <Категория перелома>
211 ребро1 ребро
211 ребро4 ребро
211 ребро7 ребро
003 череп череп
003 ребро2 ребро
...
Мне всего лишь нужно подсчитать процент детей, имевших переломы
рёбер (т.е., % = [число детей, имевших, по крайней мере, 1 перелом рёбер] /
194 * 100), процент детей, имевших черепные травмы и т.д. Я полагаю, мне нужна
обычная кросстабуляция, но как избавиться от того, чтобы система не считала
несколько раз переломы рёбер в том случае, если у ребёнка их было несколько?"
Ясно, что данная задача будет актуальна не только в случае медицинских
исследований, а во всех ситуациях, где встретится похожая организация данных.
Проблема заключается в том, что если просто построить частотное
распределение по переменной <Категория перелома>, то полученные частоты
будут характеризовать число случаев перелома той или иной категории,
а не число детей, имеющих перелом той или иной категории. И,
поскольку один и тот же ребёнок может иметь более одного случая перелома одной
и той же категории, ни частоты, ни проценты, полученные с помощью простого частотного
распределения не будут ответом на поставленный вопрос.
Нужный нам алгоритм будет выглядеть так. Сначала мы отсеиваем
повторные случаи перелома одной и той же категории у каждого из пациентов. Это
позволит нам подсчитать, сколько детей имели хотя бы один перелом из определённой
категории. Далее мы считаем общее число пациентов с переломами и вычисляем процент
встречаемости каждой категории переломов. После проведения основных вычислений
синтаксис завершается форматированием полученных переменных и выводом их в таблицу
в окно результатов.
Для начала смоделируем файл данных. Мы заведём три переменных:
ID - трёхзначная числовая переменная, которая будет содержать уникальный код
пациента, FRACTURE (Перелом) - 8-символьная текстовая переменная, указывающая
на конкретный характер перелома и FRACTURECAT (Категория перелома) - 8-символьная
переменная, описывающая общую категорию перелома.
!NB. Ранние версии пакета SPSS не примут имя последней переменной
из-за того, что та содержит более 8 символов в своём названии. В этом случае
нужно просто заменить имя переменной и все соответствующие обращения к ней дальше
по тексту программы.
DATA LIST LIST /ID(F3) FRACTURE(A8) FRACTURECAT(A8).
Следующей командой мы сохраняем данные во внешний файл для последующего
использования (в данном синтаксисе мы нигде не загружаем этот файл снова, просто
сохраним - на всякий случай).
SAVE OUTFILE='c:\temp\original data.sav'.
Следующей командой все наблюдения в файле данных сортируются сначала
по номеру пациента (по возрастанию), а затем, для каждого пациента, по категории
перелома (в алфавитном порядке). Здесь задан возрастающий режим сортировки (по
умолчанию), но, естественно, что числовая переменная id будет сортироваться
по возрастанию чисел, а текстовая переменная fracturecat будет сортироваться
"по возрастанию" символов алфавита.
SORT CASES BY id fracturecat.
На следующем этапе мы для каждого пациента и каждой категории
перелома ставим в переменную fract1 "1", если это первый случай перелома
такой категории у данного пациента, и "0", если перелом такой категории
уже встречался у данного пациента выше. Таким образом, все уникальные категории
переломов у всех пациентов будут отмечены единицами в редакторе данных. Следующая
за этим команда делает очень похожую вещь - проставляет единички уникальным
пациентам. Если пациент с данным номером встречался ранее, ему будет проставлен
нолик. Ясно, что первый подсчёт нужен нам для вычисления числа случаев переломов
различных категорий без повторов у одного и того же пациента, а второй - для
вычисления числа уникальных пациентов в базе данных. При этом мы используем
функциональность команды ADD FILES, которая предназначена для "подшивания"
наблюдений из внешних файлов. Однако, используем её не по прямому назначению:
из всей этой команды нам нужно лишь ключевое слово FIRST - индикация первого
значения из группы значений, задаваемой комбинацией переменных id и fracturecat
в первом случае, и группы, задаваемой переменной id, во втором. Полезно посмотреть,
как работают эти команды, выполняя синтаксис в пошаговом режиме. (После запуска
команд ADD FILES в пошаговом режиме вам потребуется ввести команду EXECUTE,
которая выполнит вычисления и покажет результаты)
Далее отсеиваем повторные случаи переломов одной и той же категории
у каждого пациента. Внимание! В данном виде команда SELECT удаляет неотобранные
наблюдения из файла данных. Отбор производится по условию IF, состоящему из
имени одной переменной - fract1. Вспомним, что данная переменная содержит единицы
для первых случаев перелома из категории и нули для повторных случаев. Будут
отобраны наблюдения с единицами в переменной fract1, поскольку традиционно единица
в логических выражениях ассоциируется со значением "Истина".
SELECT IF fract1.
Следуют две команды агрегирования - вычисления статистики по файлу
данных и помещения её снова в файл данных. Первая команда создаст новый файл
(визуально - заменит открытый в данный момент в редакторе, на это указывает
символ "*"). В новом файле данных будут содержаться два наблюдения
- по количеству категорий переломов (эта переменная была выбрана в качестве
группирующей в подкоманде BREAK). Для каждой категории переломов в переменной
n будет подсчитано количество наблюдений (функция N), т.е. количество людей,
имевших, по крайней мере, один перелом такой категории. Переменная nbid, в которой
мы подсчитали сумму единичек (уникальных пациентов) из переменной nbid неагрегированного
файла нужна нам просто для того, чтобы не потерять количество уникальных пациентов.
После первого агрегирования количество уникальных пациентов в
переменной nbid у нас оказалось "раскидано" по разным категориям переломов.
Понятно, что нас интересует в данный момент сумма по всей этой переменной, без
разделения на категории. Для этого мы проведём повторное агрегирование. Вычислим
переменную nobreak, единственная функция которой - иметь постоянное значение
для всех наблюдений, чтобы команда агрегирования не создавала новые группы.
Затем снова прибегнем к AGGREGATE, однако оставим открытый файл нетронутым,
а запишем результат во внешний файл данных - totalid.sav. И тут же "подклеим"
интересующую нас переменную totalid к открытому файлу данных с помощью команды
MATCH FILES.
MATCH FILES FILE=*
/TABLE='c:\temp\totalid.sav'
/BY=nobreak.
Теперь у нас есть переменная, содержащая количество пациентов,
имеющих по крайней мере один перелом определённой категории (n) и общее количество
пациентов (totalid). Вычислить процент в данной ситуации не представляет труда:
используем COMPUTE.
COMPUTE pc=n/totalid*100.
На вопрос мы ответили - процент подсчитан и даже помещён в отдельную
переменную. Естественно, что сумма процентов может превышать 100, так как один
пациент может иметь переломы разных категорий. Теперь можно "навести лоск".
Отформатируем результирующую переменную в процентном формате (обратите внимание,
такой формат можно задать лишь через синтаксис!)...
FORMATS pc(PCT5.2).
...подпишем (расшифруем) имена переменных...
VARIABLE LABEL pc '% с переломом' /totalid 'общее число пациентов'
/n 'число пациентов с данной категорией перелома'.
...и выведем содержимое файла данных в отдельную табличку с
помощью команды SUMMARIZE.
SUMMARIZE
/TABLES=fracturecat n totalid pc
/FORMAT=VALIDLIST NOCASENUM TOTAL
/TITLE='Сводка'
/MISSING=VARIABLE
/CELLS=NONE .
Дело сделано.
Творческих успехов и крепкого вам здоровья!
Ведущий рассылки,
Балабанов Антон
Новое на сайте www.spsstools.ru
Переведены и добавлены следующие примеры синтаксиса: