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

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


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

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

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

Синтаксис вычисления частоты объектов разных категорий при повторяемости объектов в файле данных

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


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

Синтаксис вычисления частоты объектов разных категорий при повторяемости объектов в файле данных

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

Вот как он звучал:

"Вопрос. Имеется медицинская база данных с информацией о переломах у детей. В ней есть сведения о 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).

BEGIN DATA
211 ребро1 ребро
211 ребро4 ребро
211 ребро7 ребро
123 ребро2 ребро
123 ребро5 ребро
003 череп череп
003 ребро1 ребро
111 ребро2 ребро
128 череп череп

END DATA.

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

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, которая выполнит вычисления и покажет результаты)

ADD FILES FILE=* /BY=id fracturecat /FIRST=fract1.

ADD FILES FILE=* /BY=id /FIRST=nbid.

Далее отсеиваем повторные случаи переломов одной и той же категории у каждого пациента. Внимание! В данном виде команда SELECT удаляет неотобранные наблюдения из файла данных. Отбор производится по условию IF, состоящему из имени одной переменной - fract1. Вспомним, что данная переменная содержит единицы для первых случаев перелома из категории и нули для повторных случаев. Будут отобраны наблюдения с единицами в переменной fract1, поскольку традиционно единица в логических выражениях ассоциируется со значением "Истина".

SELECT IF fract1.

Следуют две команды агрегирования - вычисления статистики по файлу данных и помещения её снова в файл данных. Первая команда создаст новый файл (визуально - заменит открытый в данный момент в редакторе, на это указывает символ "*"). В новом файле данных будут содержаться два наблюдения - по количеству категорий переломов (эта переменная была выбрана в качестве группирующей в подкоманде BREAK). Для каждой категории переломов в переменной n будет подсчитано количество наблюдений (функция N), т.е. количество людей, имевших, по крайней мере, один перелом такой категории. Переменная nbid, в которой мы подсчитали сумму единичек (уникальных пациентов) из переменной nbid неагрегированного файла нужна нам просто для того, чтобы не потерять количество уникальных пациентов.

AGGREGATE OUTFILE=*
/BREAK=fracturecat
/n=N /nbid=SUM(nbid).

После первого агрегирования количество уникальных пациентов в переменной nbid у нас оказалось "раскидано" по разным категориям переломов. Понятно, что нас интересует в данный момент сумма по всей этой переменной, без разделения на категории. Для этого мы проведём повторное агрегирование. Вычислим переменную nobreak, единственная функция которой - иметь постоянное значение для всех наблюдений, чтобы команда агрегирования не создавала новые группы. Затем снова прибегнем к AGGREGATE, однако оставим открытый файл нетронутым, а запишем результат во внешний файл данных - totalid.sav. И тут же "подклеим" интересующую нас переменную totalid к открытому файлу данных с помощью команды MATCH FILES.

COMPUTE nobreak=1.

AGGREGATE OUTFILE='c:\temp\totalid.sav'
/BREAK=nobreak
/totalid=SUM(nbid).

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

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

Вычислить среднее по m переменным, где m берётся из другой переменной.SPS

Подсчёт расстояний между 2 точками на земной поверхности.SPS

Вычислить процент пациентов с переломом определённой категории.SPS

 

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

Операции с макропеременными.SPS

 

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

Графики распределений.sbs

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

 


В избранное