STATA 的繪圖、字串與時間資料

CW Wayne Yeh
6 min readSep 4, 2021

--

這一節想要淺談 STATA 的繪圖以及字串與時間資料。繪圖或視覺化確實是一門學問,這邊只想展示一下 STATA 的繪圖功能。另外,我們處理資料時,不免會碰到字串與時間,因此有必要了解一下相關的操作。

淺談視覺化

STATA 繪圖範例
Fig 2–9 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> 的次數分佈繪製直方圖,option bin()width() 可以用來調整柱寬,option normal 則會附上常態分佈的機率密度(依 <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 時間的起始時間點也許會有不同。

--

--

CW Wayne Yeh

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