STATA 小技巧 (2):local 變數、回傳列表與雜項功能

CW Wayne Yeh
5 min readSep 4, 2021

--

local 變數

local 變數
Fig 2–10 local 變數

我們常常在 STATA 的 do-file 中執行數個指令以完成某個步驟或程序,有時後會經常性地使用某個數值(也許是某變數的統計量)或是使用某個(組) 變數(例如:依變數或是某組控制變數)。當想要在 do-file 中修改時,逐行檢查並更改並非明智之舉,畢竟這很麻煩又容易會出錯。比較好的方法將這些經常被提到的數值、變數參數化,也就是設成 STATA 中的 local 變數,這樣往後只要更動 local 變數所指涉的數值、變數即可。Fig 2–10 提供了一些例子,以下說明:

  • local <loc_var> <obj> 可以將 <obj> 指定給 local 變數 <loc_var>,這邊的 <obj> 可以是數值、變數、或變數列表,像 Fig 2–10 中的 123price 以及 mpg weight length
  • 定義 local 變數後,可以透過`<loc_var>’ 呼叫。若要作為字串使用,需要再加上 ”” ,像是 Fig 2–10 中使用到的字串函數 strpos()
  • local <loc_var> 也可以接 =<exp> 。和前例不同,這樣的用法會把 17 指定給 local 變數 z 而不是 ”8+9” 喔,這點可以參考 Fig 2–10 (1)、(2) 儲存檔名的差異。
  • local <loc_var> 也可以接 :<extended_fnc><extended_fnc> 可以用來取得資料本身的資訊,像是變數 label、變數儲存類型等。各位可以透過 help file 查詢看看還有哪些可用的功能。

請注意,local 變數的呼叫僅對當次的 run/do 有效。如果希望在關閉 STATA 前都能重複利用,可以使用 global 變數。只要將指令中的 local 改為 global 即可,並外 global 變數可以使用 $<global_var> 呼叫。

回傳列表

STATA 的各項指令也像程式語言的函數:執行後會對資料進行某種操作、印出某些結果或回傳(return)某些訊息。通常我們可以透過 return list 來查看該指令回傳了哪些資訊。像是我們執行 sum <v1> 之後,可以透過 r(mean) 來取得 <v1> 的平均值。在之後的第四章,還有個針對估計型指令的 ereturn list ,這對於取得一些常見的統計量(SSE, R2, F-statistics)非常方便。

雜項功能

STATA 指令眾多,難免有些我難以歸類或來不及介紹的。我在此整理:

  • order <varlist> ,依照 <varlist> 的順序從頭排序變數,option , after(<var>), before(<var>) 可以選擇從何開始排序。通常我們會希望把關鍵變數 order (像是 id、時間等)到資料最前以方便閱讀。
  • recode <varlist> (<rule>) (<rule>) … ,依照 <rule> 重新指派變數值。查看 help file 可以發現所謂的 <rule> 可以有很多形式,像是 (0/60 = 0) 就是將 0 到 60 的值重新指派為 0。recode 可以省下寫很多行 replace 的空間,但有幾件事要稍微流意 (1) 請一口氣完成 recode,否則剛產生的值有可能會被新的 rule 取代掉 (2) 排序教較前的 rule 會被優先適用,比如說 recode score (60/100 1) (0/60 2) 會把 score 為 60 的人設為 1。
  • list <varlist> in 1/10,在 Result Window 上列出樣本點 1–10 的 <varlist>。另外,in 1/10 相當於 if _n<=10
  • int(<n>) 可以回傳實數 <n> 的整數部分;mod(<n1>,<n2>) 可以回傳 <n1> 除上 <n2> 的餘數; round(<n>) 可以回傳 <n> 四捨五入到第一個整數位的值。以上 3 個函數的 <n> 也可以是 <exp>,例如: year=int(ym/100) (想像變數 ym 是長得像 202001 的數值)。
  • preservereserve 概念上可以用來暫存現有資料(see 5–2)。
  • expand <n> 可以將現有的 obs 擴充為 <n> 倍。例如原本為 100 筆的資料, expand 2 後就會變成 200 筆。本指令可以再加上 if 條件。
  • fillin <varlist> 會完整地補上 <varlist> 未被觀察到的交乘項的樣本點(其未知變數值為 missing)。也可以參考 panel data 版的 tsfill(see 4-3)。¹

[1]: 也就是 Cross Join 的概念。

--

--

CW Wayne Yeh

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