#stata
#stata
Вопрос:
У меня есть большой набор данных Stata, который содержит следующие переменные: year
, state
, household_id
, individual_id
, partner_id
, и race
. Вот пример моих данных:
year state household_id individual_id partner_id race
1980 CA 23 2 1 3
1980 CA 23 1 2 1
1990 NY 43 4 2 1
1990 NY 43 2 4 1
Обратите внимание, что в приведенной выше таблице столбцы 1 и 2 связаны друг с другом.
Я хочу создать переменную, которая равна единице, если человек состоит в межрасовом браке.
В качестве первого шага я использовал следующий код
by household_id year: gen inter=0 if race==race[partner_id]
replace inter=1 if inter==.
Этот код работал хорошо, но в нескольких случаях давал неверный результат. В качестве альтернативы я создал строковую переменную, идентифицирующую каждого пользователя и его партнера, используя
gen id_user=string(household_id) "." string(individual_id) string(year)
gen id_partner=string(household_id) "." string(partner_id) string(year)
Что я хочу сделать сейчас, так это создать что-то вроде того, что vlookup
делается в Excel: для каждого столбца сохраните локально id_partner, найдите его в id_user и найдите их расу и сравните ее с расой исходного пользователя.
Я думаю, это должно быть что-то вроде этого?
gen inter2==1 if (find race[idpartner]) == (race[iduser])
Ожидаемый результат должен быть таким
year state household_id individual_id partner_id race inter2
1980 CA 23 2 1 3 1
1980 CA 23 1 2 1 1
1990 NY 43 4 2 1 0
1990 NY 43 2 4 1 0
Комментарии:
1. Спасибо за пример данных, но
dataex
идет на один шаг дальше, чем вы, чтобы дать всем, кто читает код потока, воспроизводить данные примера в их собственной Stata.
Ответ №1:
Я не думаю, что вам нужно что-то настолько общее. Как вы понимаете, информации об идентификаторах достаточно для поиска пар, а это, в свою очередь, позволяет сравнивать race
людей в каждой паре.
В приведенном ниже коде _N == 2
предназначено для обнаружения ошибок в данных, таких как один партнер, но не другой, являющийся наблюдением в наборе данных или повторениями одного партнера или обоих.
clear
input year str2 state household_id individual_id partner_id race
1980 CA 23 2 1 3
1980 CA 23 1 2 1
1990 NY 43 4 2 1
1990 NY 43 2 4 1
end
generate couple_id = cond(individual_id < partner_id, string(individual_id) ///
" " string(partner_id), string(partner_id) ///
" " string(individual_id))
bysort state year household_id couple_id : generate mixed = race[1] != race[2] if _N == 2
list, sepby(household_id) abbreviate(15)
-------------------------------------------------------------------------------------
| year state household_id individual_id partner_id race couple_id mixed |
|-------------------------------------------------------------------------------------|
1. | 1980 CA 23 2 1 3 1 2 1 |
2. | 1980 CA 23 1 2 1 1 2 1 |
|-------------------------------------------------------------------------------------|
3. | 1990 NY 43 4 2 1 2 4 0 |
4. | 1990 NY 43 2 4 1 2 4 0 |
-------------------------------------------------------------------------------------
Эта идея описана в этой статье. Ссылка предоставляет бесплатный доступ к pdf
файлу.