我有一个包含公司信息的数据集:
clear
input firm_id str6 industry int fyear int
1084 7372 2010
1084 7375 2010
1084 7372 2011
1084 7375 2011
1084 7372 2012
1084 7375 2012
1084 7372 2013
1084 7375 2013
1084 7372 2014
1084 7375 2014
1094 2865 2002
1094 2879 2002
1094 5122 2002
1094 5169 2002
1094 2865 2003
1094 2879 2003
1094 5122 2003
1094 5169 2003
1094 2865 2004
1094 2879 2004
1094 5122 2004
1094 5169 2004
1094 2865 2005
1094 2879 2005
1094 5122 2005
1094 5169 2005
1094 2865 2006
1094 2879 2006
1094 5122 2006
1094 5169 2006
1094 2865 2007
1094 2879 2007
1094 5169 2007
1094 2865 2008
1094 2879 2008
end除了firm_id之外,它还包括关于公司在给定年份活跃的行业的信息。
我如何才能知道一家公司在给定的一年里离开和进入了多少个行业?
我知道我可以通过编写一个“循环中的循环”来做到这一点,它查看每个单独的观察值,并检查对于year+1是否存在相同的firm_id和industry组合。但是我的数据集很大,所以效率非常低。
我还考虑了使用reshape wide的解决方案,但也找不到解决问题的方案(当然,这会创建非常多的变量,而且效率也不高)。
发布于 2019-11-26 08:04:16
如果您尝试使用公司每年进入和退出的行业数量为每家公司生成单个观察值,我相信以下代码应该可以工作。变量enter和leave (分别)表明在给定的观察中,公司是否进入或存在该行业。在数据中使用多年来的foreach循环,然后可以生成每个变量,指示公司每年是进入还是退出。
bys firm_id industry (fyear): gen prevyear = fyear[_n-1]
gen yrdifpast = fyear - prevyear
gen enter = yrdifpast > 1
bys firm_id industry (fyear): gen nextyear = fyear[_n+1]
gen yrdiffuture = nextyear - fyear
gen leave = yrdiffuture > 1
levelsof fyear, local(years)
foreach yr of local years {
gen in_`yr' = fyear==`yr'&enter==1
gen out_`yr' = fyear==`yr'&leave==1
}
collapse (sum) in_* out_*, by(firm_id)
list
+----------------------------------------------------------------------------------------------+
1. | firm_id | in_2002 | in_2003 | in_2004 | in_2005 | in_2006 | in_2007 | in_2008 | in_2010 |
| 1084 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
|---------+---------+---------+---------+----------+----------+----------+----------+----------|
| in_2011 | in_2012 | in_2013 | in_2014 | out_2002 | out_2003 | out_2004 | out_2005 | out_2006 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|----------------------------------------------------------------------------------------------|
| out_2007 | out_2008 | out_2010 | out_2011 | out_2012 | out_2013 | out_2014 |
| 0 | 0 | 0 | 0 | 0 | 0 | 2 |
+----------------------------------------------------------------------------------------------+
+----------------------------------------------------------------------------------------------+
2. | firm_id | in_2002 | in_2003 | in_2004 | in_2005 | in_2006 | in_2007 | in_2008 | in_2010 |
| 1094 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|---------+---------+---------+---------+----------+----------+----------+----------+----------|
| in_2011 | in_2012 | in_2013 | in_2014 | out_2002 | out_2003 | out_2004 | out_2005 | out_2006 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
|----------------------------------------------------------------------------------------------|
| out_2007 | out_2008 | out_2010 | out_2011 | out_2012 | out_2013 | out_2014 |
| 1 | 2 | 0 | 0 | 0 | 0 | 0 |
+----------------------------------------------------------------------------------------------+发布于 2019-11-26 16:48:32
我看不出这里需要任何循环。但我们需要的是精确而明确的规则。在这里,每当有记录的第一年在数据集中的第一年之后,公司就进入一个行业,而当公司在记录的最后一年在数据集中的最后一年之前时,公司就离开了。此外,如果记录的下一年晚于一年,则公司退出该行业,如果记录的前一年早于一年,则公司进入该行业。这允许离开和重新进入,尽管这样的变化可能是不太可能的。
summarize fyear, meanonly
local first = r(min)
local last = r(max)
bysort firm_id industry (fyear) : generate enter = (fyear > `first') if _n == 1
by firm_id industry : replace enter = (fyear - fyear[_n-1]) > 1 if _n > 1
by firm_id industry : generate leave = fyear < `last' if _n == _N
by firm_id industry : replace leave = (fyear[_n+1] - fyear) > 1 if _n < _N
table fyear firm_id, c(sum enter sum leave) https://stackoverflow.com/questions/59040753
复制相似问题