有一个以下结构的数据集:
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解决此任务的算法是什么?谢谢。
答案 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 |
+--------------------------+