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

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


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

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

Коррекция выборки (взвешивание) по нескольким переменным

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


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

С мая 2006 года сервис Subscribe.Ru предоставляет получателям HTML-версий рассылок возможность голосования за очередной выпуск (через сайт, либо письмом). В нижнем и верхнем колонтитулах каждого выпуска вы найдёте шкалу для голосования по 5-балльной шкале (где 5 означает наивысший балл). Я просил бы вас по возможности выражать своё мнение относительно содержания, оформления, стиля, полезности полученного вами выпуска в виде этой комплексной оценки. Развёрнутые комментарии вы всегда можете направить мне на a-balabanov( at) yandex.ru.

 

Коррекция выборки (взвешивание) по нескольким переменным

Вопросы взвешивания выборочных данных с целью "подтянуть" выборочные статистики к параметрам генеральной совокупности (ГС) всегда актуальны в исследованиях, претендующих на репрезентативность. Из наиболее недавних публикаций по этому вопросу - перепечатки давних, но не потерявших своей значимости статей А.О. Крыштановского по ремонту и перевзвешиванию выборки в приложении к учебнику [1].

В количественных социологических исследованиях объектами наблюдения часто являются отдельные индивиды, либо, скажем, домохозяйства. Иногда в таких случаях контрольные цифры соответствия выборки генеральной совокупности может дать государственная статистика. Такие параметры как численность и соотношение мужчин и женщин, людей с разным образованием, показатели расселения людей и проч. время от времени фиксируются в рамках переписей населения и периодически корректируются посредством специальных прогнозных моделей и микропереписей. Допустим, нас интересует процент людей, собирающихся голосовать за определённую партию. Опыт подсказывает, что заметное влияние на политические предпочтения оказывает уровень образования индивидов. Поэтому, чтобы получить обоснованные прогнозы голосования, надо постараться обеспечить соответствие распределения образования в выборке распределению в генеральной совокупности. Иначе в выборке, скажем, может оказаться избыточное по сравнению с генеральной совокупностью количество людей с низким уровнем образования, что может негативно повлиять на качество прогноза (прогноз процента голосов за партию, ориентированную на малообразованную часть населения будет необоснованно завышен). Если распределение образования в генеральной совокупности на изучаемой территории известно (для этого можно заглянуть в статистический сборник), данные можно перевзвесить весьма просто. Достаточно приписать голосу каждого респондента в выборке вес wi, где i - код определённого уровня образования, рассчитываемый как

wi = Pi / pi, где

Pi - доля людей с i-м уровнем образования в ГС (данные Росстата), а

pi - доля людей с i-м уровнем образования в имеющейся выборке.

Если есть потребность в приведении объема выборки к объёму ГС (т.е. о построении модели ГС масштаба 1:1), веса могут быть рассчитаны ещё более просто:

Wi = Ni / ni, где

Ni - численность i-й группы в ГС, а

ni - численность i-й группы в выборке*.

 

* Заметим, что при такой "инфляции" объёма выборки нельзя проводить статистические проверки, т.к. объём выборки оказывается завышенным и, следовательно, заниженными оказываются все стандартные ошибки. Например, незначимые различия приобретут большую значимость, т.к. будут "расцениваться" как проявившиеся на выборке большого объёма (объёма, равного объёму ГС). Тем не менее, масштабирующими весами иногда бывает удобно пользоваться. Далее будем полагать, что работаем именно с ними: это избавит нас от необходимости подсчёта долей и процентов.

 

Мы рассмотрели классический пример. Жизнь, однако же, устроена сложнее. Так, политические предпочтения могут определяться не только образованием, но и полом, возрастом, статусом занятости... Выходит, желательно контролировать пропорции в выборке не только по одной переменной, но по некоторому их набору. При этом взвешивание по одному параметру может привести к ещё большим несоответствиям выборки и ГС по другим параметрам. Чтобы избежать таких искажений, желательно использовать информацию о совместных распределениях переменных в ГС. Это значит, требуется знать, сколько, например, мужчин с высшим образованием возраста 25-30 лет, занятых полный рабочий день проживает на исследуемой территории. Зная численность такой сложной составной категории можно соответствующим образом взвесить ответы таких респондентов в выборке. Обычно в статистических сборниках приводятся разбиения по наиболее важным показателям, но такой детализации может и не найтись. Зато почти наверняка имеются данные распределения отдельно по мужчинам и женщинам, людям с разным образованием и т.д. Иными словами, имеются итоговые ячейки (маргиналы) многомерной таблицы сопряжённости между переменными в ГС, а наполнение таблицы неизвестно.

Можно ли, зная такие маргиналы, попробовать восстановить содержимое многомерной таблицы, а значит - рассчитать веса для каких угодно составных категорий? Как правило, аналитически (точно) это сделать нельзя - слишком много вариантов решений. Но давно предложены методы, позволяющие получить некоторое приблизительное наполнение многомерной таблицы, соответствующее заданным маргиналам. А.О. Крыштановский в упомянутой работе [1] рассказывает об одном таком оптимизационном алгоритме, основанном на методе штрафных функций. Мы расскажем о программной реализации "метода итеративной подгонки пропорций" (Iterative Proportional Fitting, IPF)* на синтаксисе SPSS . За основу взят синтаксис Взвешивание по 2 и более переменным.SPS из коллекции Рейналя. Автор: Joao Duarte (jd@proade.com), 19.10.2004.

 

*Возможно, в отечественной науке имеется более подходящий, традиционный термин для обозначения этого метода. Буду признателен, если кто-то из подписчиков просветит меня в этом. Есть сведения, что в английской терминологии такой метод взвешивания иногда называют также "rim weighting". Термин Iterative Proportional Fitting взят из [2]. Внимание! В уравнениях (1, 2) записи метода в этой работе у меня в Adobe Acrobat не отображаются операторы суммирования. Не исключено, что эта проблема может проявиться и на других машинах.

 

Алгоритм IPF. Взвешивание проводится по k переменным, каждая из которых имеет конечное число категорий. Численность объектов каждой категории для каждой переменной в ГС задана. В начале все наблюдения имеют вес, равный 1. Веса корректируются по очереди для каждой переменной. Каждая итерация включает в себя k обновлений весов. Рассматривается первая переменная. Считается сумма весов в выборке по каждой её категории. Затем вес каждого наблюдения (имеющего, например, категорию s) умножается на отношение численности категории s первой переменной в ГС к сумме весов всех наблюдений категории s в выборке. Переходят ко второй переменной. Считают сумму весов (с учётом их изменений для первой переменной) для каждой категории второй переменной. Обновлённые при разборе первой переменной веса для каждого наблюдения умножаются на отношение численности соответствующей категории второй переменной в ГС к сумме весов всех наблюдений этой категории в выборке. И так далее, до последней, k-й, переменной. После завершения очередной итерации можно проверить, не сошёлся ли алгоритм, т.е. не оказалась ли приведена выборка в соответствие заданным маргиналам в ГС. Я говорю "можно" проверить, потому что в разбираемом синтаксисе такая проверка не реализована. Считается, что алгоритм должен сойтись за относительно небольшое число итераций. В синтаксисе реализована лишь одна итерация и пользователю предлагается самостоятельно инициировать запуск следующей итерации, если результаты подгонки пропорций после предыдущей его не устраивают.

Данные примера. Перед тем как продолжить, сгенерируем пример данных с двумя переменными и разберём, как бы мы производили взвешивание, точно зная совместное распределение этих переменных в ГС, а затем - применим к данным процедуру итеративного взвешивания. Инструкция SET SEED обеспечивает сброс генератора случайных чисел к исходному значению 20072006, чтобы у вас был точно такой же пример. Мы генерируем 3000 наблюдений вектора (var1, var2), и это символизирует генеральную совокупность. По условию генерации, переменная var1 имеет 2 категории и принимает их равновероятно. Используется функция генерации значений из равномерного распределения на заданном участке - RV.UNIFORM() и функция округления RND. Переменная var2 некоторым образом зависит от первой переменной и имеет 4 разных категории.
Вторая пара переменных (svar1, svar2) имеет только 100 значений (они генерируются, если системная переменная $casenum - номер наблюдения - имеет значение, не превосходящее 100) и символизирует выборку. Обратите внимание, генерирующие уравнения несколько отличаются от тех, что были использованы для генеральной совокупности. Это обеспечит нам искомые "искажения", несоответствие выборки исследуемой ГС.

INPUT PROGRAM.

SET SEED 20072006.

LOOP id=1 to 3000.

- COMPUTE var1 = 1+RND(rv.uniform(0,1)).

- COMPUTE var2 = var1 + 1+ RND (rv.uniform(-1,1)).

- IF ($casenum<=100) svar1=1+RND(rv.uniform(0.1,1.1)).

- IF ($casenum<=100) svar2 = svar1 + 1 + RND(rv.UNIFORM(-0.9,1.2)).

END CASE.

END LOOP.

END FILE.

END INPUT PROGRAM.

Убедимся, что маргиналы таблиц сопряжённости, соответствующих ГС (var1 * var2) и выборке (svar1 * svar2), существенно различаются. Так, например, к первой категории переменной var2 относятся лишь 6% наблюдений в выборке, но 12% наблюдений в ГС. Требуется корректировка.

CROSSTABS TABLES=var1 BY var2 /CELL COUNT ROW.

CROSSTABS TABLES=svar1 BY svar2 /CELL COUNT ROW.

Взвешивание с известными совместными распределениями. Предположим, мы знаем совместное распределение этих переменных в ГС. Действительно, в данный момент у нас перед глазами таблица сопряжённости var1 * var2. Воспользуемся этим случаем для того, чтобы взвесить выборку наиболее точно. Для каждой комбинации значений svar1 и svar2 зададим свой вес как показано выше: Ni/ni.

IF ($casenum<=100 AND svar1 = 1 AND svar2 = 1) W= 359 / 6.

IF ($casenum<=100 AND svar1 = 1 AND svar2 = 2) W= 756 / 20.

IF ($casenum<=100 AND svar1 = 1 AND svar2 = 3) W= 405 / 16.

IF ($casenum<=100 AND svar1 = 2 AND svar2 = 2) W= 373 / 11.

IF ($casenum<=100 AND svar1 = 2 AND svar2 = 3) W= 758 / 28.

IF ($casenum<=100 AND svar1 = 2 AND svar2 = 4) W= 349 / 19.

Взвесим:

WEIGHT BY W.

Построим частотное распределение:

CROSSTABS TABLES=svar1 BY svar2 /CELL COUNT ROW.

Отключим взвешивание:

WEIGHT OFF.

Теперь наша выборка - модель ГС в масштабе 1:1. Остаётся надеяться, что статистика по тем переменным, которые не участвовали во взвешивании, также будет близка к параметрам ГС. Теоретически, эти статистики должны теперь больше соответствовать действительности, чем до взвешивания.

 

Взвешивание с использованием IPF. Теперь представим, что совместное распределение переменных (var1, var2) в ГС нам неизвестно. Известны лишь их маргиналы - итоговые частоты по каждой категории. Запишем эти итоговые частоты для каждого значения переменных svar1 и svar2 в переменные univ1 и univ2, соответственно.

IF svar1=1 univ1=1520.

IF svar1=2 univ1=1480.

 

IF svar2=1 univ2=359.

IF svar2=2 univ2=1129.

IF svar2=3 univ2=1163.

IF svar2=4 univ2=349.

Все 3000 значений "генеральной совокупности" нам больше не нужны. Оставим лишь 100 выборочных значений:

N OF CASES 100.

Пусть начальное значение веса для каждого наблюдения будет равно единице.

COMPUTE W = 1.

Теперь настало время разобрать макрос, производящий итерацию взвешивания.

В качестве параметров ему передаются пары имён переменных. Первая переменная - та, чьи пропорции корректируются, вторая - переменная со значением маргинальных частот категорий первой переменной. Пар может передаваться много. В данном случае будет 2 пары, так как взвешивание проводим по 2 переменным. В данном случае автор макроса посчитал удобным заключить параметры макроса в квадратные скобки (ключевое слово !ENCLOSE).

Надо понять, что сама операция взвешивания, повторяющаяся в одной итерации k = 2 раза (по числу переменных взвешивания) очень проста. Это лишь одна инструкция "COMPUTE W = W * (!valp / Wt)". Всё остальное содержимое макроса - подготовка к ней.

Переданные переменные "перебираются" макросом в цикле !DO ... !IN ... !DOEND. Имя каждой переменной последовательно передаётся макропеременной !var. Некоторая сложность связана с тем, что нам нужно отличать переменную с категориями (svar) от переменной с частотой генеральной совокупности (univ). Первая - всегда на первом месте в каждой паре, вторая - на втором. Поэтому удобно определить пару дополнительных макропеременных !nnn и !nnn2. Если присмотреться, мы оперируем с ними как с триггерами, перекидывая их из состояния 1 в 2 и обратно, в зависимости от того, какая переменная из пары (svar, univ) рассматривается в цикле сейчас. Если рассматривается первая переменная (svar), то мы просто запоминаем её имя в дополнительной макропеременной !varp. Нам это пригодится когда мы перейдём к следующей переменной с частотой ГС. Если !nnn = 2 (т.е. рассматривается одна из переменных univ), нам, согласно алгоритму итеративного взвешивания, следует сначала подсчитать сумму весов по каждой категории текущей переменной !varp (помните, это одна из переменных svar?). Для этого мы, во-первых, сортируем файл по этой переменной и записываем во временную переменную Wt текущий вес каждого наблюдения. Во-вторых, считаем (с помощью функции LAG) накопленный итог - сумму весов, затем сортируем файл так, чтобы по каждой категории переменной !varp накопленный итог был первым значением наблюдением в группе (сортировка в порядке убывания по Wt). И аналогичным манёвром (с использованием функции LAG) делаем так, чтобы для каждого наблюдения группы переменная Wt содержала суммарный вес наблюдений данной группы. Теперь осталось только провести очередную итерацию (см. инструкцию COMPUTE). В данном случае !valp = !var = значение одной из переменных univ.

DEFINE !pondx (!POSITIONAL !ENCLOSE('[',']'))

WEIGHT OFF.

!LET !nnn = 1

!DO !var !IN (!1)

- !LET !nnn2 = !nnn.

- !IF (!nnn=1) !then !LET !varp=!var !IFEND.

- !IF (!nnn=2) !THEN

- !LET !valp=!var.

- SORT CASES BY !varp.

- COMPUTE Wt = W.

- IF !varp=LAG(!varp) Wt = Wt + LAG(Wt).

- SORT CASES BY !varp (A) Wt (D).

- IF !varp=LAG(!varp) Wt=LAG(Wt).

- COMPUTE W = W * (!valp / Wt).

- !IFEND.

- !IF (!nnn2=1) !THEN !LET !nnn=2 !IFEND.

- !IF (!nnn2=2) !THEN !LET !nnn=1 !IFEND.

!DOEND

EXECUTE.

!ENDDEFINE.

Запустим макрос первый раз (проведём первую итерацию). После её завершения в файле останутся все ранее определённые переменные плюс переменная Wt, которую можно удалить или оставить - без разницы. Если будете выполнять ещё итерации, она всё равно добавится.

!pondx [svar1 univ1 svar2 univ2].

После итерации можно попробовать применить получившийся итоговый вес и построить таблицу сопряжённости. Если маргиналы этой таблицы не совпадают со значениями ГС, итерации можно повторить какое-то число раз. При желании вы можете расширить предложенный синтаксис так, чтобы он автоматически определял, достигнут ли требуемый результат взвешивания (а также - позволял вводить ограничения на минимальные и максимальные веса, удалял лишние переменные и т.д.).
Для данного примера (с принятой отправной точкой генератора случайных чисел) выборка "сходится" с генеральной совокупностью, кажется, за 6 итераций:

!pondx [svar1 univ1 svar2 univ2].

!pondx [svar1 univ1 svar2 univ2].

!pondx [svar1 univ1 svar2 univ2].

!pondx [svar1 univ1 svar2 univ2].

!pondx [svar1 univ1 svar2 univ2].

WEIGHT BY W.

CROSSTABS TABLES=svar1 BY svar2 /CELL COUNT ROW.

Теперь можно начинать работать с выборкой - что там требовалось оценить? Сравните, кстати, кросстабуляции, полученные ранее для ГС и выборочную кросстабуляцию после взвешивания. Приятно отметить, что расхождения очень незначительны.

Сформулируем несколько заключительных замечаний.

1. Если не требуется задание "реальных" весов (расширяющих выборку до размеров ГС), можно задавать веса пропорциональные. Тогда веса univ должны задаваться в долях от размера ГС, умноженных на размер выборки. Размер выборки после взвешивания останется постоянным.

2. Алгоритм взвешивания сойдётся не всегда. За более подробными инструкциями следует обратиться к математическим работам, в которых изучаются его свойства. В упомянутой работе [2] даётся исчерпывающая библиография.

3. Макрос позволяет задать весьма большое число пар переменных, то есть, зная маргиналы нужных вам переменных в ГС, можно взвесить выборку по этим переменным достаточно легко.

4. После окончания взвешивания все переменные univ, а также Wt могут быть удалены.

 

Литература

1. Крыштановский А.О. Анализ социологических данных с помощью пакета SPSS. - М.: Изд. дом ГУ ВШЭ, 2006

2. Norman P. Putting Iterative Proportional Fitting at Researcher's Desk, Working paper 99/03, University of Leeds, School of Geography, October 1999, http://www.geog.leeds.ac.uk/wpapers/99-3.pdf

 

Всего доброго!

 

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

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

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

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

Прочесть имена и метки переменных и значений из ASCII-формата.SPS

Продублировать переменные так, что имя var1 становится varx и т.д.SPS

Удаление символа подчёркивания из имён переменных.SPS

Переименование векторных переменных.SPS

 

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


В избранное