STATA 小技巧 (2):local 變數、回傳列表與雜項功能
local 變數
我們常常在 STATA 的 do-file 中執行數個指令以完成某個步驟或程序,有時後會經常性地使用某個數值(也許是某變數的統計量)或是使用某個(組) 變數(例如:依變數或是某組控制變數)。當想要在 do-file 中修改時,逐行檢查並更改並非明智之舉,畢竟這很麻煩又容易會出錯。比較好的方法將這些經常被提到的數值、變數參數化,也就是設成 STATA 中的 local 變數,這樣往後只要更動 local 變數所指涉的數值、變數即可。Fig 2–10 提供了一些例子,以下說明:
local <loc_var> <obj>
可以將<obj>
指定給 local 變數<loc_var>
,這邊的<obj>
可以是數值、變數、或變數列表,像 Fig 2–10 中的123
、price
以及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
的數值)。preserve
、reserve
概念上可以用來暫存現有資料(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 的概念。