Генерация переменной, представляющей собой отношение двух значений другой переменной

#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. Спасибо за разъяснение!