0
我有一個面板標識符,該面板標識符是以字母數字代碼形式存儲的公司名稱,我想跟蹤整個面板中的名稱更改。例如,A公司於2001年5月25日更名爲B,然後公司B於2003年5月25日更名爲C.然後C公司在2005年5月25日更名爲D.在這個例子中,公司D,E,和G不重命名。跟蹤面板標識符名稱隨時間發生變化
我想要一個「轉換矩陣」,以便我可以看到A公司是否在以後的某個交易中以新名稱參與交易。例如,在第一行測試數據中,公司A和G參與了2001年8月12日公佈的交易.變量在過去很長時間確定,所以到2001年8月12日時左右AA
'新的公司名稱是B(變更發生在2001年5月25日)。在第二行測試數據B和H參與了也於2001年8月12日公佈的交易。但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)