STATA 的線性迴歸分析

CW Wayne Yeh
6 min readSep 4, 2021

--

利用 STATA 做量化實證研究很簡單,你只要會 reg y x1 x2 就夠了(開玩笑的)。這一章節會談到在 STATA 上執行計量方法(如:線性迴歸、Panel Data Model 等)、相關的檢定以及輸出結果。然而,我重點還是會放在 STATA 的操作與研究時的應用場景,統計或計量的概念只會稍微提到。最 後強調一下:對量化研究而言,STATA 上的操作終究只是工具而已,有意識地了解自己在估計什麼,有邏輯地選擇計量方法與詮釋結果,比起跑了幾百幾千條迴歸更重要。

線性迴歸分析

淺談迴歸

學過統計的人想必對線性迴歸(Linear Regression)不陌生,在開始談 STATA 上線性迴歸的操作時,不妨先想想看線性迴歸是什麼?

  • 線性迴歸是一種以極小化 Mean Square Error(MSE)的方式來 fit data。
  • 在某些假設之下,線性迴歸的估計值可以「一致地」估計出我們所想像的 X 與 Y 的關係(迴歸參數)。
  • 從幾何與線性代數上看來,迴歸不過是把向量 y(長度為 n),投影到樣本資料矩陣 X_{n,k} 的 k 維欄空間上。
  • 最後,在 STATA 跑迴歸只要 reg <y> <x_list>, <options> 即可。其中的 <y> 是依變數,<x_list> 則是自變數。

線性迴歸指令:估計選項、類別變數、交乘項

一般來說, reg 指令基本上沒什麼困難,但我們仍有一些推論 (inference)或檢定(hypothese test)上的設定可以調整,像是使用 robust standard error 來處理變異數不齊一的問題。以下條列一些說明:

  • 在計算估計值 b 的標準誤時,option robustr 考慮到了誤差項 (error term)變異數不齊一的情形,而 option cluster(<var>) 則考慮了同 <var> 的樣本點內(比如說同個班級或是 Panel Data 中的同個人),誤差項相關的情形。
  • Option , noconstant 可以忽略掉迴歸中的常數項。請注意,在沒有常數項的情形下,R² 的定義會和平常不太一樣。
  • reg 基本上會自動處理共線性(collinearity),也就是會自動 omit 掉多餘的變數。

另外,有時候我們的 <x_list> 需要包含類別變數,一般來說我們要對每個類別生成一個二元變數(dummy),並丟掉一個類別作為 base group 以避免共線性(dummy trap)。不過在 STATA 中,其實可以很方便地利用 「factor variable」的方式放入 reg 中,而不需要花時間生成變數。下列說明:

  • i.<var> 又稱 factor variable。在 <x_list> 之中放入 i.<var> 等同於將 <var> 類別化成 dummies 後放入迴歸式。當然,STATA 會自動幫我們挑個類別作為 base group 以避免 dummy trap。¹
  • 作為 factor variable 的變數不能是 string,因此需要先 destringencode

最後,我們的 <x_list> 也可能包含變數間的交乘項,我們可以這樣做:

  • i.<v1>##i.<v2> 可以生成類別 <v1> 與類別 <v2> 的主效果(各自的 dummies)以及交互作用(交乘項)。
  • 若其中一個交乘的變數是連續的話,可以使用 c.<v2> 。例如: i.gender##c.age 就會放入連續變數 age 和類別化後的 gender 以及兩者的交乘項。
  • 如果是用 i.<v1>#i.<v2> 的話,僅會納入交互作用(交乘項)。
  • 某些情形下,你也許會希望跑個 no-constant 的 regression(這樣就可以放入所有類別的 dummies,而不落入 dummy trap)。這時可以用 ibn.<var> ,避免丟去 base group。

假設檢定

STATA Regession 迴歸結果
Fig 4–1 STATA 迴歸結果

跑完迴歸後,我們通常會接著作假設檢定。如果只是要看某個係數、參數是否顯著的話,回傳的報表就已經有了(Fig 4-1)。對於更一般的假設檢定,我們可以利用 test 或是 lincom 來檢定一些線性的限制條件,例如 H0 : β3 + β2 = 0;β3 = 1。此外,我們還可以根據剛跑出來,熱騰騰的迴歸模型去做預測,除了用在迴歸 fit 的資料上,也可以用在尚未見過的資料。以下條列說明:

  • test <varlsit> ,可以同時檢定 <varlist> 中的每個 <var> 是否為零。
  • test (<res>) (<res>),可以同時檢定數個線性的限制式 <res><res> 可以是某種 <exp>,例如 v1 + v2 = 0v3 = 1
  • lincom <res> ,可以檢定某「個」線性的限制式,但這邊的 <res> 要表示為:限制式等號右邊為 0 時,等號左半邊的部分,例如:<var3> — 1
  • predict <var>, <pred> ,使用現有的模型來 fit 樣本點。<var> 是用來存 fitted value 的新變數,而 <pred> 則是要 fit 的目標,比如說 xb 就是回歸預測值 x’b,而 resid 則是殘差項 y — x’b
  • 其他檢定方法可參考:likelihood ratio test lrtest、non-linear test testnl 等等。
  • 請注意,上述這些指令都需要在估計指令(如 reg)之後使用。如果重新跑了新的迴歸,舊的結果就會被覆蓋掉。²

取出迴歸結果

線性迴歸差不多就如此了,最後要提到取出迴歸資訊的方法:

  • 2–6 有提到多數指令執行之後,會有一個 return list 來記錄一些訊息。對「估計指令」來說,則有一個 ereturn list 來紀錄模型的資訊,例如參數的估計值與變異 數矩陣、Sum Square Error 等。使用 ereturn list 即可查看這些資訊。
  • 除了 ereturn list 之外。我們還可以藉由 _b[<var>]_se[<var>] ,來取得某自變數 <var> 的估計係數與標準誤。
  • 要出取得 factor variable 估計係數則是要透過 _b[<value>.<var>] ,比如說我想取出教育類別為 3(也許代表高中職)的估計係數時,可以使用 _b[3.edu]
  • 如果想知道 _b[] 內的變數該怎麼稱呼,也可以參考 mat list e(b) 所列出的估計係數的向量(矩陣)。這個 e(b) 正是來自ereturn list 的資訊。

[1]: 我們可以手動挑選 base group。 b<val>.<var> 可以更改 base group 為 <val>。例如:b3.edu 就是以 3 所代表的教育程度為 base group。

[2]: 有興趣想看看怎麼暫存或叫回先前估計結果的人,可以參考 estimates 系列的指令

--

--

CW Wayne Yeh

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