Stata:减少基于年度数据的观察
Stata: Reducing observations based on yearly data
如果公司(下面的 companyid
)每年 "multicolor",我想创建一个变量,该变量为 1 或 0。以下是我的数据:
* 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 年是红色、蓝色和绿色,所以这个 'multicolor' 变量应该等于 1。
此外,我还想为不同的组合创建变量。 IE。 a red-blue var = 1 如果一家公司每年都是红色和蓝色 = 1。
我试图用 bysort companyid year: gen multicolor = 1 if red == 1 & blue == 1 & green == 1
做点什么,但我意识到我想要完成的事情还有很多缺失。
总体目标是减少多年观察,因此我每年对每个公司进行一次观察。
这条 year/company 记录将包含该公司是否为红色、绿色、蓝色或这些颜色的确切混合(如果混合)的信息。下面是我想从上面的数据创建的数据示例。
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 ...
我认为这比您担心的要容易得多。首先,collapse
到公司和年份的最大值。然后你有 red blue green
的个人价值。其次,连接值,以便 "110"
是红色和蓝色而不是绿色,依此类推。
tabulate
将生成与数据中找到的组合对应的所有指标。
实际上,3种颜色和2种可能性允许二进制编码,字符串也是二进制数。
true 1 和 false 0 的对应关系,最大超过 0s 和 1s 意味着 "any",最小超过 0s 和 1s 意味着 "all" 一旦理解就很明显,但值得解释。对于 Stata 上下文,请参阅 this 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 |
+-----------------------------------------------+
如果公司(下面的 companyid
)每年 "multicolor",我想创建一个变量,该变量为 1 或 0。以下是我的数据:
* 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 年是红色、蓝色和绿色,所以这个 'multicolor' 变量应该等于 1。
此外,我还想为不同的组合创建变量。 IE。 a red-blue var = 1 如果一家公司每年都是红色和蓝色 = 1。
我试图用 bysort companyid year: gen multicolor = 1 if red == 1 & blue == 1 & green == 1
做点什么,但我意识到我想要完成的事情还有很多缺失。
总体目标是减少多年观察,因此我每年对每个公司进行一次观察。
这条 year/company 记录将包含该公司是否为红色、绿色、蓝色或这些颜色的确切混合(如果混合)的信息。下面是我想从上面的数据创建的数据示例。
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 ...
我认为这比您担心的要容易得多。首先,collapse
到公司和年份的最大值。然后你有 red blue green
的个人价值。其次,连接值,以便 "110"
是红色和蓝色而不是绿色,依此类推。
tabulate
将生成与数据中找到的组合对应的所有指标。
实际上,3种颜色和2种可能性允许二进制编码,字符串也是二进制数。
true 1 和 false 0 的对应关系,最大超过 0s 和 1s 意味着 "any",最小超过 0s 和 1s 意味着 "all" 一旦理解就很明显,但值得解释。对于 Stata 上下文,请参阅 this 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 |
+-----------------------------------------------+