Stata: сокращение наблюдений на основе годовых данных - PullRequest
1 голос
/ 24 апреля 2020

Я хочу создать переменную, равную единице или нулю, если компания (companyid ниже) является "многоцветной" в каждом году. Ниже приведены мои данные:

* Example generated by -dataex-. To install: ssc install dataex
clear
input str6 companyid int year float(red blue green)
"001045" 2015 0 1 0
"001045" 2015 0 1 0
"001045" 2015 0 1 0
"001045" 2015 0 1 0
"001045" 2017 1 0 0
"001045" 2017 1 0 0

"001049" 2019 0 1 0
"001049" 2019 0 0 1

"001055" 2018 1 0 0
"001055" 2018 0 1 0
"001055" 2018 0 0 1

Так, например, компания № 001055 имеет красный, синий и зеленый цвета для 2018 года, поэтому эта «многоцветная» переменная должна равняться единице.

Кроме того, я Также хочу создать переменные для разных комбинаций. Т.е. красно-синяя переменная = 1, если компания красная и синяя = 1 в каждом году.

Я пытался что-то сделать с bysort companyid year: gen multicolor = 1 if red == 1 & blue == 1 & green == 1, но я понимаю, что многое не хватает в том, чего я хочу достичь sh.

Общая цель состоит в том, чтобы сократить многолетние наблюдения, чтобы У меня по одному наблюдению в год на компанию.

Эта запись за один год / компанию будет содержать информацию, если эта компания была красного, зеленого, синего или точное сочетание этих цветов, если оно смешано. Ниже приведен пример данных, которые я хочу создать из данных выше.

input str6 companyid int year float(red blue green r-b-g red-blue blue-green ...more...)
"001045" 2015 0 1 0 0 0 0 ...
"001045" 2017 1 0 0 0 0 0 ...
"001049" 2019 0 0 0 0 0 1 ...
"001055" 2018 0 0 0 1 0 0 ...

1 Ответ

1 голос
/ 24 апреля 2020

Я думаю, что это намного проще, чем вы боитесь. Во-первых, collapse до максимальных значений по компании и году. Тогда у вас есть отдельные значения red blue green. Во-вторых, объедините значения, чтобы "110" было красным и синим, но не зеленым, и так далее.

tabulate будет генерировать все показатели, соответствующие комбинациям, найденным в данных.

Фактически, 3 цвета и 2 варианта допускают двоичное кодирование, и строка также является двоичным числом.

Соответствие для истинного 1 и ложного 0, которое максимально для 0 и 1 означает «любое», а минимальное для 0 и 1 означает «все», очевидно, как только понято, но стоит объяснить иначе. Для контекста Stata см. этот FAQ

clear
input str6 companyid int year float(red blue green)
"001045" 2015 0 1 0
"001045" 2015 0 1 0
"001045" 2015 0 1 0
"001045" 2015 0 1 0
"001045" 2017 1 0 0
"001045" 2017 1 0 0
"001049" 2019 0 1 0
"001049" 2019 0 0 1
"001055" 2018 1 0 0
"001055" 2018 0 1 0
"001055" 2018 0 0 1
end 

collapse (max) red blue green, by(companyid year) 

egen colors = concat(red blue green)

list

     +-----------------------------------------------+
     | compan~d   year   red   blue   green   colors |
     |-----------------------------------------------|
  1. |   001045   2015     0      1       0      010 |
  2. |   001045   2017     1      0       0      100 |
  3. |   001049   2019     0      1       1      011 |
  4. |   001055   2018     1      1       1      111 |
     +-----------------------------------------------+
...