Stata: добавить по идентификатору и отметке времени

#stata

#stata

Вопрос:

У меня есть два набора данных. Один набор данных здесь снимок экрана dataset 1содержит информацию об ассортименте продуктов на уровне продуктового магазина / дня. Эти данные отражают все товары, которые были доступны в магазине в данный день.

Другой набор данных снимок экрана dataset 2содержит данные о лицах, которые посетили эти магазины в определенный день.

Как вы можете видеть на скриншоте 2, один и тот же человек (выделено, panid=1101758 ) купил только 2 продукта: Michelob и Sam Adams в неделю 1677 2 в магазине 234140 , тогда как мы знаем, что в тот же день этому человеку в этом магазине было доступно 4 варианта, т.Е. 2 дополнительных Budweisers (скриншот 1, выделенный obs.)

Мне нужно объединить / добавить эти два набора данных в магазине / день для каждого человека таким образом, чтобы окончательный набор данных показывал, что человек совершил эти две покупки, и, кроме того, было еще два, которые были доступны этому человеку в этом магазине / день. Таким образом, у этого конкретного человека будет 4 наблюдения — 2 приобретенных и еще 2 доступных варианта. У меня есть разные магазины, дни и отдельные лица.

 input store day brand
1 1 "Bud"
1 1 "Bud"
1 1 "Michelob"
1 1 "Sam Adams"
1 1 "Coors"
end


input hh store day brand
1 1 1 "Michelob"
1 1 1 "Sam Adams"
2 1 1 "Bud"
2 1 1 "Bud"
3 1 1 "Coors"
end
  

В приведенном выше коде Stata вы можете видеть, что 2 Budweisers купил другой человек. Для этого человека также должно быть выполнено аналогичное действие, где можно показать, что у человека было 4 варианта на выбор (Michelob, Sam Adams, Budweiser, Budweiser), но в итоге они выбрали только 2 Budweisers.

Вот пример конечного результата, который я хотел бы получить:

 input hh store day brand choice
1 1 1 "Michelob" 1
1 1 1 "Sam Adams" 1
1 1 1 "Bud" 0
1 1 1 "Bud" 0
1 1 1 "Coors" 0

2 1 1 "Bud" 1
2 1 1 "Bud" 1
2 1 1 "Michelob" 0
2 1 1 "Sam Adams" 0
2 1 1 "Coors" 0

3 1 1 "Coors" 1
3 1 1 "Michelob" 0
3 1 1 "Sam Adams" 0
3 1 1 "Bud" 0
3 1 1 "Bud" 0
  

Комментарии:

1. Спасибо за пример данных. Не могли бы вы также показать пример желаемого результата?

2. Вам нужно создать choice переменную в каждом наборе данных, а затем append .

3. Спасибо, я понимаю, что вы имеете в виду — эта команда может не сработать, потому что добавление не создаст полный набор вариантов для каждого человека. Я обновляю свой пример, чтобы проиллюстрировать это.

4. fillin может помочь.

5. Заполнение — для этого примера заполнение будет для уровня hh / store / day?

Ответ №1:

Вот один из способов сделать это. Это включает в себя создание индикатора для повторяющихся продуктов в магазине и дне, использование joinby для создания всех возможных комбинаций между hh и продуктами по магазинам и дням и, наконец, слияние для получения переменной выбора.

 // Import hh data
clear
input hh store day str9 brand
1 1 1 "Michelob"
1 1 1 "Sam Adams"
2 1 1 "Bud"
2 1 1 "Bud"
3 1 1 "Coors"
end

// Create number of duplicate products for merging
bysort store day brand: gen n_brand = _n
gen choice = 1

tempfile hh hh_join
save `hh'

// Create dataset for use with joinby to create all possible combinations
// of hh and products per day/store
drop brand n_brand choice
duplicates drop
save `hh_join'

// Import store data
clear
input store day str9 brand
1 1 "Bud"
1 1 "Bud"
1 1 "Michelob"
1 1 "Sam Adams"
1 1 "Coors"
end

// Create number of duplicate products for merging
bysort store day brand: gen n_brand = _n

// Create all possible combinations of hh and products per day/store
joinby store day using `hh_join'
order hh store day brand n_brand
sort hh store day brand n_brand

// Merge with hh data to get choice variable
merge 1:1 hh store day brand n_brand using `hh'
drop _merge

// Replace choice with 0 if missing
replace choice = 0 if missing(choice)

list, noobs sepby(hh)
  

И результат:

 . list, noobs sepby(hh)

   ------------------------------------------------- 
  | hh   store   day       brand   n_brand   choice |
  |-------------------------------------------------|
  |  1       1     1         Bud         1        0 |
  |  1       1     1         Bud         2        0 |
  |  1       1     1       Coors         1        0 |
  |  1       1     1    Michelob         1        1 |
  |  1       1     1   Sam Adams         1        1 |
  |-------------------------------------------------|
  |  2       1     1         Bud         1        1 |
  |  2       1     1         Bud         2        1 |
  |  2       1     1       Coors         1        0 |
  |  2       1     1    Michelob         1        0 |
  |  2       1     1   Sam Adams         1        0 |
  |-------------------------------------------------|
  |  3       1     1         Bud         1        0 |
  |  3       1     1         Bud         2        0 |
  |  3       1     1       Coors         1        1 |
  |  3       1     1    Michelob         1        0 |
  |  3       1     1   Sam Adams         1        0 |
   ------------------------------------------------- 
  

Комментарии:

1. Привет, Ваутер! Большое вам спасибо за ваш вклад.

2. Уважаемый пользователь — к сожалению, этот код не работает с реальными данными. Последний шаг слияния не работает. Я отслеживал каждый отдельный шаг кода и обнаружил, что шаг joinby в «Создать все возможные комбинации hh и продуктов в день / магазин» приводит к созданию множества дубликатов в реальном наборе данных. Таким образом, слияние 1:1 приводит к ошибке. Это странно, потому что набор игрушечных данных, похоже, является точным представлением реальных данных.

3. Похоже, проблема заключается в joinby . Ваш using набор данных для joinby должен содержать только три переменные: store, day и panid, так ли это? В противном случае трудно определить, что не так, не видя данных. Было бы проще, если бы вы могли опубликовать пример использования ваших реальных данных dataex .