#stata
#stata
Вопрос:
У меня есть два набора данных. Один набор данных здесь содержит информацию об ассортименте продуктов на уровне продуктового магазина / дня. Эти данные отражают все товары, которые были доступны в магазине в данный день.
Другой набор данных содержит данные о лицах, которые посетили эти магазины в определенный день.
Как вы можете видеть на скриншоте 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
.