2015-11-23 59 views
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) 

回答

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)