Альтернативы Stata для поиска

#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 файлу.