利用 STATA 合併資料
序言
第三章會討論到在 STATA 上做 Data Wrangling。根據 wiki 的定義,Data Wrangling 是指將 raw data 轉換成適合後續分析的形式,這可能涉及到將非結構化資料結構化、清理資料、合併資料等。¹也許有些人會認為這些步驟相 較於分析,不過是苦力與勞力密集的工作罷了。但我認為這個步驟比起分析更無跡可尋(學),也不容易摸索出個明確的工作流程。也就是說,這是一個相當吃經驗的步驟。Data Wrangling 不僅需要了解 raw data 以及分析需求,也需要有一個易懂、容易調整與反饋的工作流程。尤其對於處理巨量資料(行政資料、金融交易資料等),不恰當的步驟可能就會需要花上相當高的時間與運算成本。
這一小節會介紹如何合併不同資料。合併資料基本上可以分成垂直合併與水平合併,分別可以使用 STATA 的 append
、 merge
完成。
合併資料:垂直合併
Fig 3.1利用兩年成績的人造資料展示如何在 STATA 上進行水平合併 append
,所謂垂直合併,即是將兩份資料依共同變數,垂直地接再一起,以下條列說明:
append using <path>
,將現有資料與<path>
上的檔案垂直合併。- 兩筆 data 要進行垂直合併時,需要確認:變數名稱是否一致、變數類型是否一致。本例中顯然兩條件都不符合,也因此我們透過
rename
、tostring
改名與轉換變數類型。 - 在合併資料前,我先在各資料中創造了變數
year
來標注資料的年份。各位可以想想看不標年份就垂直合併可能造成的混淆。 - 我們也可以在
append
後補上 option, gen(<var>)
,生成一個二元變數標記被新合併近來的樣本點(此例中的 year2)。 - 合併後的資料經過
order
、sort
整理,最後藉由isid
確認id-year
是否可以「identify」 這個垂直合併後的資料。
最後提到的 identify 資料是個重要的概念,也就是某個(組)變數的值在資料中是否唯一,例如 Fig 3-1中 year1.dta 以及 year2.dta 的 id
或是 GPA.dta 中的 id year
。這組變數又稱 identifier 或(用 SQL 的 term)primary keys,有時也會說這資料的 level(或是資料粒度)在這組變數上。這件事在 STATA 中可以透過 isid <varlist>
確認。作為 identifier 的變數幾乎都有重要意義:說明樣本點的身份、串連其他資料等。處理不同資料時,我們需要時時銘記哪一組變數是 identifier,並善用 isid
檢查,這在各種資料的操作上都很重要。
水平合併
Fig 3-2 接續先前垂直合併後的成績資料,接著要嘗試利用變數 id 和個人背景資料水平合併。所謂水平合併,即是將資料依特定變數值匹配,並水平地串接其餘欄位資料。下面條列說明:
merge <type> <varlist> using <path>
,將 STATA 目前讀在記憶體的資料(又稱 master)和<path>
上的資料(又稱 using)合併。master 與 using 中具有相同<varlist>
值的樣本點(本例中的 id)會被水平合併。當然,我們需要確認 <varlist> 的名稱和變數類型是否在 master 與 using 中一致。<type>
分成四個種類:1:1
、1:m
、m:1
、m:m
,用來說明<varlist>
的值在 master 與 using 中是否唯一 (可否作為 identifier),唯一時標示為1
若非唯一則標示為m
。本例中的 id 在 using(source.dta)是唯一的,但在 master(gpa.dta)中並不是,因此<type>
標示為 m:1。- 一旦樣本點的
<varlist>
的值沒有同時出現在 master 與 using 中,就無法藉由<varlist>
進行對應的水平合併,像本例的 master 中缺乏 id=6,而 using 中缺乏 id=5,因此這些樣本點就會在 master 或 using 的變數上呈現 missing。水平合併後自動生成的類別變數_merge
正是用來記錄這些情形(master only、using only、matched)。由此可知,merge
預設包含出現在 using 或 master 的樣本點,也就是如 Fig 3-3 范氏圖右下角所呈現的 OUTER JOIN。倘若需要別種合併方法,我們其實可以很方便地利用變數_merge
丟去不想要的樣本點,或是利用 optionkeep()
。
- Option
keepusing(<varlist>)
可以選擇只和部分 using data 的變數進行合併,這在 using data 龐大時尤其好用。若 merge 的 <varlist> 和 keepusing 的 <varlist> 一致時, 事實上我們就只是在檢查樣本點在 master 與 using 出現的情形。 - 水平合併後,我把二元變數 GSAT、ASR、Others 重新彙整成一個類別變數,算是一個
gen
、label value
的應用。
我們最後留意幾件事:
- 如果 master data 和 using data 有同名的變數而導致衝突時, STATA 預設不會更動 master 的變數(更改此設定可以參考 option
update
)。 - 丟去未能透過
<varlist>
合併的樣本點前,不妨也想想其在 master 或 using 中遺失的原因,以及這樣的遺失是否會影響後續的分析與推論。
[1]: 現在的資料有非常多種形式,如:影像、文字、聲音等,將這些資料轉換為像 excel 中的表格(或 dataframe)就是資料結構化;此外,清理資料顧名思義就是掃除資料中骯髒、妨礙分析的部分,包括異常值、 遺失值等。