2015-11-23 2 views
0

У меня есть идентификатор панели, который является именем фирмы, сохраненным в виде буквенно-цифрового кода, и я хотел бы отслеживать изменения имен по всей панели. Например, фирма A переименована в B 25 мая 2001 года. Затем фирма B переименована в C 25 мая 2003 года. Затем фирма C переименована в D 25 мая 2005 года. В этом примере фирмы D, E, и G не переименованы.Идентификатор имени панели отслеживания изменяется со временем

Я хочу «матрицу перехода», чтобы я мог видеть, участвует ли фирма A в какой-либо транзакции позднее, под новым именем. Например, в первой строке тестовых данных фирмы A и G участвуют в транзакции, объявленной 12 августа 2001 года. Переменная AA определена долго в прошлом, поэтому к моменту, когда 12 августа 2001 года будет проведено обход AA ' новое название фирмы B (изменение произошло 25 мая 2001 года). Во втором ряду тестовых данных B и H участвуют в транзакции, также объявленной 12 августа 2001 года. Но AA еще не успел изменить, так что название фирмы еще не указано B.

Код ниже отслеживает эти но я подозрюю, что этот подход слишком механичен и не устойчив к сценариям, которые я еще не рассмотрел.

Существует ли более логичный подход, которым я должен следовать, или команда, которая обрабатывает это повторное кодирование?

* data on re-coding 
clear 
input str1 OldCode str1 NewCode str8 Date 
A B 20010525 
B C 20030525 
C D 20050525 
D 
E 
F G 20010525 
G 
end 

generate temp = date(Date, "YMD") 
drop Date 
rename temp Date 
format Date %td 

* save to temp file 
preserve 
tempfile Codes 
save "`Codes'" 
restore 

* merge back (recursively) to generate wide data that track re-coding 
local i = 0 
local j = 1 

while (`j' != 0) { 
    local ++i 
    rename OldCode OldCode`i' 
    rename NewCode NewCode`i' 
    rename Date Date`i' 

    cross using "`Codes'" 
    count if (NewCode`i' == OldCode) 
    local j = `r(N)' // zero when all re-codings accounted for 
    keep if (NewCode`i' == OldCode) | missing(NewCode`i') 
    replace OldCode = "" if missing(NewCode`i') 
    replace NewCode = "" if missing(NewCode`i') 
    replace Date = . if missing(NewCode`i') 

    duplicates drop 
} 

* last addition is unnecessary 
drop OldCode NewCode Date 

* rename and sort, only need first code 
rename OldCode1 temp 
drop OldCode* 
rename temp OldCode 
sort OldCode 

* reshape to long 
reshape long NewCode Date, i(OldCode) 
drop _j 
duplicates drop 
compress 
save "Codes", replace 

* test data 
clear 
input str1 AA str1 TA str8 Date 
A G 20010812 
B H 20010812 
C D 20050812 
end 
generate DealNumber = _n 

generate temp = date(Date, "YMD") 
drop Date 
rename temp DateAnnounced 
format DateAnnounced %td 

clonevar OldCode = AA 
joinby OldCode using "Codes.dta", unmatched(master) 
drop _merge 

sort DealNumber Date 
keep if (DateAnnounced >= Date) | missing(Date) 
bysort DealNumber (Date) : keep if (_n == 1) 

ответ

1

Вы можете создать фирменный идентификатор, который группирует все наблюдения одной и той же фирмы под разными именами. Это довольно простое отношение к group_id (от SSC). Что-то вроде:

* data on re-coding 
clear 
input str1 OldCode str1 NewCode str8 Date 
A B 20010525 
B C 20030525 
C D 20050525 
D 
E 
F G 20010525 
G 
J C 20011525 
end 

* convert dyads to long form 
gen dyad_id = _n 
expand 2 if !mi(NewCode) 
bysort dyad_id: gen code = cond(_n == 1, OldCode, NewCode) 

* use -group_id- (from SSC) to further group dyad_id when code is the same 
clonevar jointcode = dyad_id 
group_id jointcode, match(code) 

* revert to the original wide form 
drop code 
bysort jointcode dyad_id: keep if _n == 1 
list, sepby(jointcode)