找到观察之间链接数量的有效方法

时间:2017-02-22 02:50:08

标签: loops stata

有一个以下结构的数据集:

firm_ID    partner_ID    start_date    end_date
1          2             01jan2001     15mar2001
1          3             15feb2001     30apr2001
2          4             20mar2001     14may2001     

数据集显示 firm_ID partner_ID 的合作持续时间。这里, firm_ID partner_ID (两个整数)都是指公司的唯一标识符。

使用Stata,我想创建一个摘要表,按月和年显示每个唯一 firm_ID 的合作伙伴数量。如果合伙企业在某个月内至少存在一天,则应计算在内。如果公司1报告与公司2的合伙关系,但公司2没有报告与公司1的合伙关系,那么它应该只计入公司1而不是公司2.

对于上面的示例,摘要表是:

firm_ID    01/2001    02/2001    03/2001    04/2001    05/2001
1          1          2          2          1          0
2          0          0          1          1          1

变量 firm_ID 有8,000个独特的观察值,时间跨度为01/2001 - 12/2013。因此,生成的汇总表的行数应等于8,000,列数等于12 * 13 = 156(01/2001 - 12/2013期间的月数)。

从概念上讲,使用Stata解决此任务的算法是什么?谢谢。

1 个答案:

答案 0 :(得分:1)

您需要使用每月日期。请注意,您提供的每日日期需要进行逆向工程才能成为计算的一部分。键入ssc inst dataex以获取命令,以便为公共论坛生成可重现的Stata数据示例。

tabulate适用于您的玩具示例;对于您的真实示例,您将需要一个不同的列表来处理更多行和列:例如,请参阅SSC中的groups

clear 
input firm_ID    partner_ID   str9 (s_start_date   s_end_date) 
1          2             01jan2001     15mar2001
1          3             15feb2001     30apr2001
2          4             20mar2001     14may2001   
end 

foreach v in start end { 
    gen `v'_date = daily(s_`v'_date, "DMY") 
    gen `v'_month = mofd(`v'_date) 
    format `v'_date %td 
    format `v'_month %tm 
} 

gen duration = end_month - start_month + 1 
expand duration 
bysort firm_ID partner_ID : gen month = start_month + _n - 1 
format month %tm 
tab firm_ID month 

           |                         month
   firm_ID |    2001m1     2001m2     2001m3     2001m4     2001m5 |     Total
-----------+-------------------------------------------------------+----------
         1 |         1          2          2          1          0 |         6 
         2 |         0          0          1          1          1 |         3 
-----------+-------------------------------------------------------+----------
     Total |         1          2          3          2          1 |         9 


groups firm_ID month, fillin show(f) sepby(firm_ID)

  +--------------------------+
  | firm_ID    month   Freq. |
  |--------------------------|
  |       1   2001m1       1 |
  |       1   2001m2       2 |
  |       1   2001m3       2 |
  |       1   2001m4       1 |
  |       1   2001m5       0 |
  |--------------------------|
  |       2   2001m1       0 |
  |       2   2001m2       0 |
  |       2   2001m3       1 |
  |       2   2001m4       1 |
  |       2   2001m5       1 |
  +--------------------------+