首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解公司是否随着时间的推移进入或离开行业

了解公司是否随着时间的推移进入或离开行业
EN

Stack Overflow用户
提问于 2019-11-26 06:02:55
回答 2查看 59关注 0票数 0

我有一个包含公司信息的数据集:

代码语言:javascript
复制
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_idindustry组合。但是我的数据集很大,所以效率非常低。

我还考虑了使用reshape wide的解决方案,但也找不到解决问题的方案(当然,这会创建非常多的变量,而且效率也不高)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-26 08:04:16

如果您尝试使用公司每年进入和退出的行业数量为每家公司生成单个观察值,我相信以下代码应该可以工作。变量enterleave (分别)表明在给定的观察中,公司是否进入或存在该行业。在数据中使用多年来的foreach循环,然后可以生成每个变量,指示公司每年是进入还是退出。

代码语言:javascript
复制
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   |
     +----------------------------------------------------------------------------------------------+
票数 1
EN

Stack Overflow用户

发布于 2019-11-26 16:48:32

我看不出这里需要任何循环。但我们需要的是精确而明确的规则。在这里,每当有记录的第一年在数据集中的第一年之后,公司就进入一个行业,而当公司在记录的最后一年在数据集中的最后一年之前时,公司就离开了。此外,如果记录的下一年晚于一年,则公司退出该行业,如果记录的前一年早于一年,则公司进入该行业。这允许离开和重新进入,尽管这样的变化可能是不太可能的。

代码语言:javascript
复制
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)  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59040753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档