STATA 的繪圖、字串與時間資料
這一節想要淺談 STATA 的繪圖以及字串與時間資料。繪圖或視覺化確實是一門學問,這邊只想展示一下 STATA 的繪圖功能。另外,我們處理資料時,不免會碰到字串與時間,因此有必要了解一下相關的操作。
淺談視覺化
各位想必在統計課,甚至是國高中的數學課就接觸到許多將資料以圖表表達的方法(資料視覺化)。點擊 STATA 左上工具列的「graphics」就可以發現許多繪圖工具。我個人強烈建議繪圖時善用 STATA 的 GUI,也就是靠點擊圖形化介面來完成複雜的圖表設定,然再將 Result Window 上的 code 複製到 do-file 上。但對於簡單的圖表,也不妨稍微留意一下相關的指令。Fig 2–9 非常隨意地利用 auto.dta 來展示一些繪圖結果(意不在傳達資訊,而是展示功能),以下稍做說明:
scatter <varY> <varX>
,以,<varY>
為 y 軸、<varX>
為 x 軸繪製 scatter plot。line <varY> <varX>, sort
,以<var>
為 y 軸、<varX>
為 x 軸繪製 line plot,option, sort
會讓 line plot 以 varX 的排序繪製。- Option
title(<str>)
、xtitle(<str>)
、ytitle(<str>)
分別可以指定圖表的上標題、x 軸名稱、y 軸名稱。 - Option
xline(<value>)
,可以在 x 軸變數為<value>
的地方標上參考線。 - Option
by(<var>)
,依<var>
的值來繪製 subplot,<var>
應該會是類別變數。 graph bar (<stat>) <varY>, over(varX)
,依<varX>
的值分組繪製<varY>
統計量<stat>
的長條圖。這其實就是 2–2 提到的tabstat
的圖形化版本。hist <var>
可以對<var>
的次數分佈繪製直方圖,optionbin()
、width()
可以用來調整柱寬,optionnormal
則會附上常態分佈的機率密度(依<var>
的平均、標準差)。
STATA 的繪圖功能還有許多細節可以設定,以下條列一些功能,有興趣的人在自行查閱:
- 更改圖中的標記(marker)大小、符號、顏色等。
- 將多張圖疊在一起(而非以 subplots 的方式分開呈現)。例如:不同族群的 scatter、 scatter with fitted line plot。
- 客製化的圖例欄(legend)的位置與說明。
- 客製化 X 軸與 Y 軸刻度與範圍。
- 在圖的左右呈現不同的刻度。
- 將多張圖合併在一張大圖底下(see
combine graph
)
字串變數
字串變數其實相當常見,舉凡國家名稱、住址、身分證字號等都是。但字串變數無法直接用於數學運算,因此常常需要先從字串中取出資訊並將這些訊息以數值變數(類別)呈現,比如說:從住址中取出縣市、從身分證字號中取出第二碼(反映性別)。以下條列一 些字串處理上的概念以及實用函數:
- 字串變數的 missing 是
””
,然而在 data browser 中,肉眼所見的空白卻不一定是 missing,也不一定反映同樣值。我們所見的空白可能是「一堆 whitespace」、「tab」或是兩者的組合。 - 函式
trim(<str>)
可以去除字串前後的空白,例如將” Cool ”
變成”Cool”
。 substr(<str>,n1,n2)
可以從字串<str>
中截取第<n1>
個字元開始,長度為<n2>
的片段。倘若我們要擷取身分證中的第二碼,可以利用substr(”A123456789”,2,1)
。strpos(<s1>,<s2>)
會回傳字串<s2>
在<s1>
中首次出現的位置,例如strpos(”STATA”, T)
就 會是 2。若<s2>
不存在於<s1>
之中就會回傳 0,因此這也可以用來檢查特定字串是否存在於某字串之中。- 請注意,如果我們處理的是中文字,那麼「長度」、「第幾個」的概念就不能直接適用。這時可以改用 unicode 版本的函式,如
usubstr()
、ustrpos()
。 split <strvar>, gen(<prefix>) parse(<str>)
,將字串變數<strvar>
依<str>
切成片段, 並儲存成數個以<prefix>
開頭變數。例如字串變數(日期)的某個值「”2010–01–02”
」,以「”-”
」切成片段就會被存成三個變數:值分別為「”2010”」、「”01”」、「”02”」。- 這些字串函數基本上都可以套用在字串變數身上,只要將其中的字串 arguement
<str>
換成字串變數<strvar>
即可。
為了從文字中取得資訊,當然會有許多對應的字串函數可以使用,甚至也可以利用正規表達式(regular expression),像是 regexm()
。希望這些整理能快速地幫讀者找到適當的工具。
時間變數
我們也很常會見到時間相關的資料,其資料類型可能是字串或數值。也許你會想從字串中取得年、月的資訊或是生成以月為頻率的 time index,藉此控制時間趨勢,這時就會需利用 STATA 的時間函數操作:
date(<s1>,<s2>)
可以將<s1>
的時間字串,利用<s2>
的年月日排列方式¹,轉變為對應特定年月日的整數。這個整數以 1960/1/1 為 0,逐日遞增。例如:date(”1960/1/31”,”YMD”)
就會是 30。這種時間的表示法稱作 UNIX 時間,我這邊站且稱為 STATA UNIX date。²year()
、month()
、day()
可以將 STATA UNIX date,轉換為對應的西元年、月、日。ym(<yyyy>,<mm>)
可以將年、月轉換為對應特定年月日的整數(且稱為”STATA UNIX ym”,以 1960/1 為 0,逐月增加)。- 點開 Data-Browser,STATA UNIX date 的呈現方式是整數的數值變數,我們可以透過
format <var> %td
改變其呈現方式為可讀性較高的”31jan1960”
。若是 STATA UNIX ym 的話則改用%tm
。注意,儘管呈現方式改變,其本質上仍是個整數數值喔!
[1]: 請參考 help file 中,STATA 是如何解析時間字串。
[2]: 關於 UNIX 時間可以參考 wiki 說明。注意,UNIX 時間的起始時間點也許會有不同。