作者:黃河泉 | 連玉君 (知乎 | 簡書 | 碼雲)

連享會

最新專題

直播

Stata:runby - 一切皆可分組計算!

背景:

在 Stata 提供了一個高效實用的副指令 ——

byable

,可以讓我快捷地計算分組統計量,如各行業的均值、標準差等。例如,

by industry: egen invest_mean = mean(invest)

,可以快速計算出每個行業的平均投資支出。然而,並不是所有的

generate

egen

命令提供的函式都支援

byable

副指令。此時,我們如何計算分組統計量呢?一個粗暴的方法就是使用

forvalues

foreach

等迴圈語句。其實,還有更為簡潔的方法 —— 使用外部命令

runby

1。 runby 的執行原理

其本質仍然是使用

forvalues

foreach

等迴圈語句執行分組計算。但便利之處在於我們無需自行書寫完整的迴圈語句,只需提供核心計算公式即可。因此,我們只需使用

program define

語句定義一個簡單的小程式,然後內嵌到

runby

語句之中即可。

2。 使用過程釋義

目的:

對每家公司的投資支出進行標準化。公式為

std_x = [x - mean(x)]/sd(x)

難點:

雖然可以使用

egen

命令提供的

std()

函式實現標準化轉換,但卻不支援

byable

解決方法:

Step 1:

定義一個小程式,用於執行標準化轉換:

program define one_std

egen invest_std = std(invest)

end

程式的呼叫方法:

(1) 如果這個程式只是偶爾用一下,可以在 dofile 中撰寫上述程式,選中後按快捷鍵

Ctrl+R

,將該程式讀入 Stata 記憶體,隨後就可以像使用一般的 Stata 命令那樣使用

one_std

命令了。(2) 如果這個程式在日後會經常使用,則可以將其單獨存放在一個 dofile 中,儲存為 “

one_std.ado

” (注意:字尾是

.ado

,檔案的與程式名稱同名),將其儲存到

D:\stata15\ado\personal\myado

資料夾下(如果沒有,可以執行建立),進而執行

adopath + D:\stata15\ado\personal\myado

,告知 Stata:我在這裡還存放了一些可執行的自程式設計序!設定完後,我們自行定義的

one_std

程式就是一個能夠被 Stata 識別的合法程式了。

Step 2:

執行

runby

命令,執行分組計算:

runby

是外部命令,可以執行如下命令安裝之:

ssc install runby, replace

然後,就可以愉快滴進行分組計算了:

runby one_std, by(company)

連享會

最新專題

直播

3。 完整Stata 範例

*-定義程式

capture program drop one_std

program define one_std

egen invest_std = std(invest)

end

*-Note:選中上述程式,按快捷鍵 Ctrl+R 將其讀入記憶體

*-調入資料

。 webuse “grunfeld。dta”, clear

*-分組計算

。 runby one_std, by(company)

*-列示結果

。 list company year invest* if year<1938, sepby(company)

+————————————————————+

| company year invest invest_std |

|————————————————————|

| 1 1935 317。6 -。93812598 |

| 1 1936 391。8 -。69844231 |

| 1 1937 410。6 -。63771376 |

|————————————————————|

| 2 1935 209。9 -1。599489 |

| 2 1936 355。3 -。43999411 |

| 2 1937 469。9 。47388569 |

|————————————————————|

| 3 1935 33。1 -1。4241168 |

| 3 1936 45 -1。1791827 |

| 3 1937 77。2 -。5164199 |

|————————————————————|

| 4 1935 40。29 -1。0727421 |

| 4 1936 72。76 -。31277531 |

| 4 1937 66。26 -。46490908 |

|————————————————————|

| 5 1935 39。68 -1。4586008 |

| 5 1936 50。73 -。73004219 |

| 5 1937 74。24 。82004045 |

|————————————————————|

| 6 1935 20。36 -1。0029697 |

| 6 1936 25。98 -。84215578 |

| 6 1937 25。94 -。84330034 |

|————————————————————|

| 7 1935 24。43 -1。2647902 |

| 7 1936 23。21 -1。3313998 |

| 7 1937 32。78 -。80889688 |

|————————————————————|

| 8 1935 12。93 -1。5678286 |

| 8 1936 25。9 -。88913306 |

| 8 1937 35。05 -。4103309 |

|————————————————————|

| 9 1935 26。63 -1。0253897 |

| 9 1936 23。39 -1。2431145 |

| 9 1937 30。65 -。75524966 |

|————————————————————|

| 10 1935 2。54 -。31681649 |

| 10 1936 2 -。63101462 |

| 10 1937 2。19 -。52046338 |

+————————————————————+

驗證程式

webuse grunfeld, clear

// default/manual

bys company: egen invest_mean0 = mean(invest)

bys company: egen invest_sd0 = sd(invest)

gen invest_std0 = (invest-invest_mean0)/invest_sd0

// runby

capture program drop one_std

program define one_std

egen invest_mean1 = mean(invest)

egen invest_sd1 = sd(invest)

gen invest_std1 = (invest-invest_mean1)/invest_sd1

egen invest_std2 = std(invest)

exit

end

runby one_std, by(company)

關於我們

Stata連享會

由中山大學連玉君老師團隊創辦,定期分享實證分析經驗。

歡迎賜稿:

歡迎賜稿至StataChina@163。com。錄用稿件達

三篇

以上,即可

免費

獲得一期 Stata 現場培訓資格。

往期精彩推文:

Stata繪圖

|

時間序列+面板資料

|

Stata資源

|

資料處理+程式

|

迴歸分析-交乘項-內生性

連享會

最新專題

直播