2017-02-22 27 views
0

Существует множество данных из следующей структуры:Эффективный способ нахождения числа связей между наблюдениями

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 имеет 8000 уникальных наблюдений и промежуток времени 01/2001 - 12/2013. Таким образом, итоговая итоговая таблица должна иметь количество строк, равное 8000, а число столбцов равно 12 * 13 = 156 (количество месяцев в период с 01/2001 по 12/2013).

Концептуально, каков алгоритм решения этой задачи с использованием Stata? Спасибо.

ответ

1

Вам необходимо работать с месячными датами. Обратите внимание на то, что ежедневные даты, представленные в том виде, в котором вы им дали, нуждаются в обратном проектировании, чтобы быть частью расчетов. Введите ssc inst dataex для команды генерации воспроизводимых примеров данных Stata для общедоступных форумов.

tabulate работает на примере вашей игрушки; для вашего реального примера вам понадобится другая таблица, чтобы справиться со многими другими строками и столбцами: см., например, groups от SSC.

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 | 
    +--------------------------+ 
+0

Огромное спасибо, Ник! Это такое элегантное решение !!!! – Pavel