2015-11-23 1 views
0

J'ai un identificateur de panneau qui est le nom d'une entreprise stocké sous forme de code alphanumérique et j'aimerais suivre les changements de nom dans le panneau. Par exemple, l'entreprise A est renommée B le 25 mai 2001. L'entreprise B est renommée C le 25 mai 2003. L'entreprise C est renommée D le 25 mai 2005. Dans cet exemple, les sociétés D, E, et G ne sont pas renommés.Le nom de l'identificateur du panneau de suivi change au fil du temps

Je veux une "matrice de transition" afin que je puisse voir si l'entreprise A est impliquée dans une transaction à une date ultérieure sous un nouveau nom. Par exemple, dans la première rangée des données de test, les entreprises A et G sont impliquées dans une transaction annoncée le 12 août 2001. La variable AA est déterminée longtemps dans le passé, donc au 12 août 2001, environ AA ' s la nouvelle raison sociale est B (changement survenu le 25 mai 2001). Dans la deuxième rangée des données de test B et H sont impliqués dans une transaction également annoncée le 12 août 2001. Mais AA n'a pas eu le temps de changer encore de sorte que le nom de l'entreprise est toujours B.

Le code ci-dessous suit ces changements de nom, mais je me méfie que cette approche soit trop mécanique et pas robuste aux scénarios que je n'ai pas encore considérés.

Y a-t-il une approche plus logique que je devrais suivre ou une commande qui gère ce recodage?

* 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) 

Répondre

1

Vous pouvez créer un identifiant d'entreprise qui regroupe toutes les observations de la même société sous différents noms. C'est assez simple à faire avec group_id (de SSC). Quelque chose comme:

* 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)