利用 STATA 合併資料

CW Wayne Yeh
6 min readSep 4, 2021

--

序言

第三章會討論到在 STATA 上做 Data Wrangling。根據 wiki 的定義,Data Wrangling 是指將 raw data 轉換成適合後續分析的形式,這可能涉及到將非結構化資料結構化、清理資料、合併資料等。¹也許有些人會認為這些步驟相 較於分析,不過是苦力與勞力密集的工作罷了。但我認為這個步驟比起分析更無跡可尋(學),也不容易摸索出個明確的工作流程。也就是說,這是一個相當吃經驗的步驟。Data Wrangling 不僅需要了解 raw data 以及分析需求,也需要有一個易懂、容易調整與反饋的工作流程。尤其對於處理巨量資料(行政資料、金融交易資料等),不恰當的步驟可能就會需要花上相當高的時間與運算成本。

這一小節會介紹如何合併不同資料。合併資料基本上可以分成垂直合併與水平合併,分別可以使用 STATA 的 appendmerge 完成。

合併資料:垂直合併

STATA 垂直合併
Fig 3–1 STATA 垂直合併

Fig 3.1利用兩年成績的人造資料展示如何在 STATA 上進行水平合併 append ,所謂垂直合併,即是將兩份資料依共同變數,垂直地接再一起,以下條列說明:

  • append using <path> ,將現有資料與 <path> 上的檔案垂直合併。
  • 兩筆 data 要進行垂直合併時,需要確認:變數名稱是否一致、變數類型是否一致。本例中顯然兩條件都不符合,也因此我們透過 renametostring 改名與轉換變數類型。
  • 在合併資料前,我先在各資料中創造了變數 year 來標注資料的年份。各位可以想想看不標年份就垂直合併可能造成的混淆。
  • 我們也可以在 append 後補上 option , gen(<var>) ,生成一個二元變數標記被新合併近來的樣本點(此例中的 year2)。
  • 合併後的資料經過 ordersort 整理,最後藉由 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 檢查,這在各種資料的操作上都很重要。

水平合併

STATA 水平合併
Fig 3–2 STATA 水平合併

Fig 3-2 接續先前垂直合併後的成績資料,接著要嘗試利用變數 id 和個人背景資料水平合併。所謂水平合併,即是將資料依特定變數值匹配,並水平地串接其餘欄位資料。下面條列說明:

  • merge <type> <varlist> using <path> ,將 STATA 目前讀在記憶體的資料(又稱 master)和 <path> 上的資料(又稱 using)合併。master 與 using 中具有相同 <varlist> 值的樣本點(本例中的 id)會被水平合併。當然,我們需要確認 <varlist> 的名稱和變數類型是否在 master 與 using 中一致。
  • <type> 分成四個種類:1:11:mm:1m: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 丟去不想要的樣本點,或是利用 option keep()
水平合併資料的範氏圖
Fig 3–3 水平合併資料的範氏圖
  • Option keepusing(<varlist>) 可以選擇只和部分 using data 的變數進行合併,這在 using data 龐大時尤其好用。若 merge 的 <varlist> 和 keepusing 的 <varlist> 一致時, 事實上我們就只是在檢查樣本點在 master 與 using 出現的情形。
  • 水平合併後,我把二元變數 GSAT、ASR、Others 重新彙整成一個類別變數,算是一個 genlabel value 的應用。

我們最後留意幾件事:

  1. 如果 master data 和 using data 有同名的變數而導致衝突時, STATA 預設不會更動 master 的變數(更改此設定可以參考 option update)。
  2. 丟去未能透過 <varlist> 合併的樣本點前,不妨也想想其在 master 或 using 中遺失的原因,以及這樣的遺失是否會影響後續的分析與推論。

[1]: 現在的資料有非常多種形式,如:影像、文字、聲音等,將這些資料轉換為像 excel 中的表格(或 dataframe)就是資料結構化;此外,清理資料顧名思義就是掃除資料中骯髒、妨礙分析的部分,包括異常值、 遺失值等。

--

--

CW Wayne Yeh

資料分析/閱讀筆記/生活雜感。我是葉政維,台大經研畢,目前是樹鋸分析師🪚,正在職場站穩腳步,也在探索什麼是好的生活。