作者:黃河泉 | 連玉君 (知乎 | 簡書 | 碼雲)
連享會
最新專題
直播
背景:
在 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資源
|
資料處理+程式
|
迴歸分析-交乘項-內生性
連享會
最新專題
直播