#sorting #stata
#сортировка #stata
Вопрос:
У меня есть набор данных поперечного сечения индивидуального уровня. В наблюдениях участвуют отдельные лица, принадлежащие к семье, которая, в свою очередь, является частью домашнего хозяйства. В домашнем хозяйстве может быть одна или несколько семей.
Моя цель — получить соотношение между полами в еженедельных часах работы по дому, разделив часы работы мужчины по дому на часы партнера.
Переменная v31
равна 1, когда человек является основным членом семьи (женщина), и 2, когда человек является мужем.
Переменная v4
— это идентификатор домохозяйства.
Переменная v32
— это прогрессивное число семей в домохозяйстве, 1, если первая семья домохозяйства, 2, если вторая, и так далее.
Пример кода:
clear
input obs v4 v32 v31 v850
1 1 1 1 27
2 1 1 2 12
3 2 1 2 8
4 2 1 1 41
5 3 1 2 0
6 4 1 1 29
7 4 1 2 11
8 4 2 1 37
9 4 2 2 1
end
list
Глядя на приведенный выше пример данных, моей целью было бы создать новую переменную с именем domwork_ratio
, которая, например, для строк 1 и 2 имела бы соотношение часов работы по дому партнера-мужчины и партнерши-женщины, которое было бы 12/27. Она будет иметь одинаковое значение для обоих наблюдений, поскольку они принадлежат к одной семье v32
и одному домохозяйству v4
.
Я не знаю, как сказать Stata, чтобы она сделала соотношение таким образом, чтобы часы работы по дому каждого мужа были разделены на часы работы его партнера.
Я пытался использовать команду:
bysort v4 v32 v16: gen domwork_ratio = cond(v4 != v4[_n-1],999999,v850_tot[_n-1]/v850_tot)
Но по какой-то причине созданная переменная имеет 999999 в качестве единственного значения.
Ответ №1:
Спасибо за пример данных.
clear
input obs v4 v32 v31 v850
1 1 1 1 27
2 1 1 2 12
3 2 1 2 8
4 2 1 1 41
5 3 1 2 0
6 4 1 1 29
7 4 1 2 11
8 4 2 1 37
9 4 2 2 1
end
bysort v32 v4 (v31) : gen ratio = v850[2] / v850[1] if v31[1] == 1 amp; v31[2] == 2
list, sepby(v32 v4)
----------------------------------------
| obs v4 v32 v31 v850 ratio |
|----------------------------------------|
1. | 1 1 1 1 27 .4444444 |
2. | 2 1 1 2 12 .4444444 |
|----------------------------------------|
3. | 4 2 1 1 41 .1951219 |
4. | 3 2 1 2 8 .1951219 |
|----------------------------------------|
5. | 5 3 1 2 0 . |
|----------------------------------------|
6. | 6 4 1 1 29 .3793103 |
7. | 7 4 1 2 11 .3793103 |
|----------------------------------------|
8. | 8 4 2 1 37 .027027 |
9. | 9 4 2 2 1 .027027 |
----------------------------------------
Код, который не удался, ссылается на переменную v16
, которую вы не объяснили в вопросе. Но ее сбой можно объяснить. Структура включает в себя by v4 v16:
определенные таким образом группы v4
и v16
внутри них являются постоянными. Тогда такие группы состоят из отдельных наблюдений. Для первого и единственного наблюдения в каждой группе верно, что v4
не равно v4[_n-1]
, поскольку v4[0]
возвращается как отсутствующее. Следовательно, 999999, как сообщалось, всегда возвращается. (С точки зрения стиля программирования Stata, лучшей идеей было бы вернуть пропущенную систему.)
Комментарии:
1. Спасибо за ваш ответ! v16 — это фиктивный пол, поэтому в основном он выполняет ту же работу, что и v31, моя ошибка заключалась в том, что я не поместил v31 (или v16) в круглые скобки. В любом случае, ваш ответ работает, еще раз спасибо.
2. Спасибо за полное объяснение. Однако есть одна часть, которую я не понимаю. Если, как вы сказали, неверно, что
v4[2]
отличается отv4[1]
, не должно ли условие пропускать часть 999999 и возвращатьv850_tot[_n-1]/v850_tot)
соотношение?3. Вы правы. Я думаю, проблема заключается в другом: ваш
by:
префикс означает, что вы просматриваете только одно наблюдение в каждой группе, поскольку группы должны иметь одинаковый пол. Следовательно, ваше упоминание о круглых скобках имело правильный оттенок.
Ответ №2:
В качестве другого потенциального решения мне было предложено использовать следующий код:
by v4 v32 (v31), sort: assert _N <= 2
by v4 v32 (v31): gen domworkratio = v850_tot[2]/v850_tot[1]
Результат должен быть таким же, как у кода, предложенного Ником, я публикую его здесь, просто чтобы предоставить другую возможность.
Комментарии:
1. Первая команда не имеет отношения ко второй, если только она не показывает, что количество наблюдений в каждой группе всегда равно 3 или более, если это так, то вторая команда может выдавать неправильные результаты.
2. Спасибо за разъяснение!