У меня есть идентификатор панели, который является именем фирмы, сохраненным в виде буквенно-цифрового кода, и я хотел бы отслеживать изменения имен по всей панели. Например, фирма 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)