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)