STATA 的分組彙整統計、樞紐分析與長寬表

CW Wayne Yeh
6 min readSep 4, 2021

--

依組別彙整統計

STATA 彙整資料至組別
Fig 3–4 STATA 彙整資料至組別

有些時候我們需要依組別彙整統計量或特定資訊,如:每個 id 的跨年平均成績、調查資料中各縣市的平均薪資。和之前 2–4 提到的,利用 by: egen() 在原資料中生成組別統計變數不同,這次我們會直接將資料轉變成以組別為單位,也就是以組別為 identifier。¹ 這個時候可以透過 STATA 的 collapse 加以實現。Fig 3-4 利用人造的成績資料(資料單位為 name subject),說明如何彙整資料至個人(資料單位為 name ):

  • collapse (<stat>) <new_v1> = <v1> <new_v2> = <v2> …, by(<v_i>) ,將變數 <v1><v2> 等依統計量 (<stat>) ,依組別 <v_i> 彙整成新變數 <new_v1><new_v2>。如圖所示,這個指令可以同時彙整「許多變數」與「許多統計量」。
  • 如果不用 <new_v1> = <v1> 的方式指派新舊變數名稱,也可以只在統計量 (<stat>) 後面輸入變數名,如本例中的 (sum) absence,這樣彙整後的變數還會是原本的名字,但請小心彙整不同統計量時新變數名稱衝突的情形。
  • 這個指令可能會很長,請善用「///」以及縮排。 這邊縮排的目的是為了表示一段指令還沒結束。
  • 最後利用了 isid 確認 name 確實是彙整後資料中的 identifier。

關於 collapse,各位不妨想想幾件事:²

  1. 可否利用 bys:egen 做到一樣的事?
  2. 彙整後的資料似乎遺失了學科的資訊(比如說考最高的是哪一科),如果我希望彙整後保有這些資訊該怎麼做呢?

樞紐分析、長表寬表切換

Reshape 長寬表切換
3–5 Reshape 長寬表切換

正確地處理資料很重要,而將資料轉換成好呈現、好懂的樣子也同樣重要,其中樞紐分析就是一項很有幫助的工具。在 STATA 中,樞紐分析可以透過群組別彙整統計 collapsereshape 實踐。我在上段提到了 collapse 的用法,這邊會繼續說明 reshapereshape 可以幫助我們切換長表與寬表。reshape 基本上不會改變資料內容,而是像七巧板般地重新組合資料中的元素。

這邊說明何謂長表(long form)、寬表(wide form):以 Fig 3–5 為例,長表會以 name subject 為 identifier,逐樣本點呈現 name subjectgrade ;相對地,寬表則是以 name 為 identifier,逐欄呈現各 subject 的 grade。

為方便後續說明,我暫且先為 Fig 3–5 的變數名稱作些定義:寬表中的 identifier name 稱為「高層變數」;從長表到寬表中,看起來被「旋轉」至欄位的變數 subject 稱為「低層變數」;我們實際關心數值的 grade 稱為「分析變數」。各位不妨留意資料中的元素(高層變數、低層變數、分析變數的名稱與值,以同色框標示)在長寬表切換時如何被擺放。下面我以 Fig 3-5 為例,說明 reshape 的用法:

  • reshape wide <prefix_var>, i(<v1>) j(<v2>) ,將資料從長表轉換為寬表。其中的 <v1><v2> 分別是高層變數 name 與低層變數 subject,而 <prefix_var> 是欲分析的變數 grade。注意,寬表中新產生的變數名稱是<prefix_var><value of v2>,也就是本例的 gradeEnglish、gradeMath、gradeScience
  • reshape long <prefix>, i(<v1>) j(<new_var>) ,將資料從寬表轉換為長表。<new_var> 是一個新生成的變數,代表新生成的低層變數名稱。<prefix> 則是用來標註分析變數們共有的 prefix,這個 prefix 也將做為 長表中分析變數的變數名稱。最後, prefix 之後的部分則會作為低層變數的值。
  • 分析變數 <prefix_var><prefix> 也可以是一個 <varlist>,但請留意,在 reshape long 時, 同一組分析變數需要有清楚對應的 prefix。
  • 當低層變數是字串時,需要加上 option string
  • 長表切換成寬表時,其他和高層變數 id 同一層的變數(同 id內沒有變化)會被很自然地被帶到寬表中;但其他和低層變數 subject 同一層的變數(同 id內有變化), 若沒有放到 <prefix_var> 中的話,就會產生 error。
  • 寬表切換成長表時,其他變數必定是高層變數(畢竟寬表中的 identifier 正是高層變數),因此也會很自然地被帶到長表之中。
  • 長表中,有時候高層變數底下不一定包括所有低層變數的的資訊(想像某 name 缺少了某考科 subject 的成績),這時若轉換成寬表, 仍會產生 gradeMath gradeScience gradeEnglish 變數,但那些本來就遺漏的資訊就會呈現 missing。

觀察 reshape 的指令,可以看到 STATA 巧妙地利用變數名稱以及 prefix 作為切換依據。 reshape 的規則看似複雜,但實際操作過後會發現這並不難理解。最後有個小建議:reshape 前盡可能地簡化資料,丟去沒必要的變數,尤其 reshape 其實是很花時間的指令。³

[1]: 我在 3–1 有說明 identifier 的概念。

[2]: collapse 是可以用 by 取代的。只要生成變數後,捨去重複或不必要的變數與樣本點即可,像是藉由:bys …: keep if_n==1 只保留組別中的第一筆樣本。

[3] 補充一下,python pandas 其實也有個功能近似的 wide_to_long,習慣 python 的人可以參考看看。

--

--

CW Wayne Yeh

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