0

英数字コードとして保存されている会社名であるパネル識別子があり、パネル全体で名前の変更を追跡したいと考えています。たとえば、2001 年 5 月 25 日に会社 A は B に名前が変更され、2003 年 5 月 25 日に会社 B は C に名前が変更されます。次に、2005 年 5 月 25 日に会社 C は D に名前が変更されます。この例では、会社 D、E、および G の名前は変更されません。

会社 A が後日、新しい名前で何らかの取引に関与しているかどうかを確認できるように、「遷移マトリックス」が必要です。たとえば、テスト データの最初の行では、企業 A と G は 2001 年 8 月 12 日に発表された取引に関与していますAAAA社名はB(2001年5月25日変更)。テスト データの 2 行目では、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)
4

1 に答える 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)
于 2015-11-24T15:37:37.820 に答える