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
,各位不妨想想幾件事:²
- 可否利用
bys:
、egen
做到一樣的事? - 彙整後的資料似乎遺失了學科的資訊(比如說考最高的是哪一科),如果我希望彙整後保有這些資訊該怎麼做呢?
樞紐分析、長表寬表切換
正確地處理資料很重要,而將資料轉換成好呈現、好懂的樣子也同樣重要,其中樞紐分析就是一項很有幫助的工具。在 STATA 中,樞紐分析可以透過群組別彙整統計 collapse
和 reshape
實踐。我在上段提到了 collapse
的用法,這邊會繼續說明 reshape
:reshape
可以幫助我們切換長表與寬表。reshape
基本上不會改變資料內容,而是像七巧板般地重新組合資料中的元素。
這邊說明何謂長表(long form)、寬表(wide form):以 Fig 3–5 為例,長表會以 name subject
為 identifier,逐樣本點呈現 name subject
的 grade
;相對地,寬表則是以 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 的人可以參考看看。