🍎 連享會主頁:lianxh.cn
New! lianxh 命令發布了: GIF 動圖介紹
隨時搜索 Stata 推文、教程、手冊、論壇,安裝命令如下:
. ssc install lianxh
⏩ 連享會 · 文本分析-爬蟲-機器學習
⌚ 2021 年 3 月 27 日 - 4 月 11 日 (三個周末)
⭐ 主講:遊萬海 (福州大學)
司繼春 (上海對外經貿大學)
⛪ 課程主頁:https://gitee.com/lianxh/text
作者: 李勝勝 (安徽大學)
郵箱: lishengsheng2016@126.com
目錄
⏩ 連享會 · 文本分析-爬蟲-機器學習
1. 簡介
2. rangerun 命令
2.1 語法格式
2.2 與 `rangestat` 對比
2.3 與 `rolling` 對比
2.4 與 `statsby` 對比
2.5 與循環觀察值對比
2.6 滾動窗口上的加權回歸
3. rangestat 命令
3.1 語法格式
3.2 設置間隔
3.3 控制樣本
3.4 使用內置函數
3.5 與 `tsegen` 對比
4. 參考文獻
5. 相關推文
1. 簡介
rangeruan 和 rangestat 都可以進行滾動計算。
其中,rangestat 可以基於退化窗口、滾動窗口、遞歸窗口、反向遞歸窗口或特定窗口進行計算,可以完美使用 Stata 中的內置函數。為了提升運行速度,還可以直接使用自定義的 Mata 函數。在大型數據面前,比 tsegen具有更高的執行效率。
rangerun 命令可以完成與 rangestat 相同的功能,但 rangestat 只能使用內置函數,或者編寫的 Mata 函數。rangerun 執行速度比 rangestat 稍慢,但它更靈活,因為 rangerun 可以使用自定義函數。對於大型數據,rangerun 比 rolling、statsby和循環,具有明顯的效率優勢。
接下來,本文將具體介紹上述命令的應用。
2. rangerun 命令2.1 語法格式
*命令安裝
ssc install rangerun, replace*語法格式
rangerun program_name [if] [in], interval(keyvar low high) [ options ]
interval(keyvar low high):根據關鍵變量取值範圍,限定觀察樣本,例如 interval(yearmonth -11 0),則為過去 12 個月;use(varlist):程序 program_name 處理變量集合;sprefix(string):變量名前綴,用於創建保存當前觀測值的標量;verbose:運行 program_name 程序的過程結果輸出到屏幕。2.2 與 rangestat 對比rangerun 與 rangestat 非常相似,不過在使用 rangestat 時,只能使用內置函數,或者創建的 Mata 函數。
以公司數為 100,期限為 360 個月,且存在缺失值的樣本數據為例,計算滾動窗口為 12 個月的 invest 變量統計數據。具體代碼如下:
*create data for 100 companies over 360 months
clear all
set seed 31231
set obs 100
gen long company = _n
expand 360
bysort company: gen mdate = ym(1987,1) + _n
format %tm mdate
gen invest = runiform() if runiform() < .95
drop if runiform() < .05
*rangestat
timer on 1
rangestat (count) invest (mean) invest (sd) invest, ///
interval(mdate -11 0) by(company)
timer off 1
*rangerun
program myprog
sum invest
gen rrun_n = r(N)
gen double rrun_mean = r(mean)
gen double rrun_sd = r(sd)
end
timer on 2 // timer 用以程序計時,詳見 help timer
rangerun myprog, interval(mdate -11 0) use(invest) by(company)
timer off 2
timer list
* confirm that results are the same using both methods
assert rrun_n == invest_count
assert rrun_mean == invest_mean
assert rrun_sd == invest_sd. timer list
1: 0.58 / 1 = 0.5770
2: 2.33 / 1 = 2.3290
. * confirm that results are the same using both methods
. assert rrun_n == invest_count
. assert rrun_mean == invest_mean
. assert rrun_sd == invest_sd可以看出,rangerun 執行速度比 rangestat 慢一點,但它由於允許用戶自定義程序,因而也更加靈活。
2.3 與 rolling 對比*rolling
clear all
webuse lutkepohl2, clear //數據地址:https://gitee.com/arlionn/data/blob/master/data01/lutkepohl2.dta
tsset qtr
timer on 1
rolling ratio1=(r(mean)/r(p50)), window(10): summarize inc, detail
timer off 1
*rangerun
program myprog
if _N < 10 exit
summarize inc, detail
gen ratio2 = r(mean)/r(p50)
end
webuse lutkepohl2, clear
timer on 2
rangerun myprog, interval(qtr -9 0) use(inc)
timer off 2
timer list. timer list
1: 0.15 / 1 = 0.1480
2: 0.02 / 1 = 0.0230可以看出,rangerun 執行速度比 rolling 快,且隨著數據量的增加,rolling 的執行速度呈指數增長。
2.4 與 statsby 對比*statsby
clear all
sysuse auto.dta, clear
timer on 1
statsby mean=r(mean) sd=r(sd) size=r(N), by(rep78): summarize mpg
timer off 1
list size mean sd if rep78 == 2
*rangerun
program myprog
if mi(rep78) exit
sum mpg
gen size = r(N)
gen mean = r(mean)
gen sd = r(sd)
end
sysuse auto.dta, clear
timer on 2
rangerun myprog, interval(rep78 0 0) by(rep78)
timer off 2
timer list. timer list
1: 0.05 / 1 = 0.0520
2: 0.03 / 1 = 0.0250需要注意的是,要複製 statsby 功能,需要指定一個 by(rep78) 選項和一個時間間隔,且該間隔必須包含組別中的所有觀察值,例如 interval(rep78 0 0),當然也可以是其他形式。同時可以看出,rangerun 比 statsby 速度快。
2.5 與循環觀察值對比對每個公司進行滾動窗口為 7 年,且至少需要 4 年數據的回歸,並保存常數項。
*循環
clear all
webuse grunfeld.dta, clear //數據地址:https://gitee.com/arlionn/data/blob/master/data01/grunfeld.dta
local nobs = _N
gen alpha = .
timer on 1
quietly forvalues i = 1/`nobs' {
capture regress invest kstock if company == company[`i'] & ///
inrange(year, year[`i']-6, year[`i'])
if _rc == 0 & e(N) >= 4 replace alpha = _b[_cons] in `i'
}
timer off 1
*rangerun
program myprog
if _N < 4 exit
regress invest kstock
gen alpha_rr = _b[_cons]
end
timer on 2
rangerun myprog, interval(year -6 0) by(company)
timer off 2
timer list
assert alpha == alpha_rr. timer list
1: 2.07 / 1 = 2.0730
2: 1.43 / 1 = 1.4330
. assert alpha == alpha_rr
2.6 滾動窗口上的加權回歸進行滾動窗口為 5 年的滾動回歸,且觀測權重從 1 增加至 5。具體代碼如下:
clear all
webuse grunfeld.dta, clear //數據地址:https://gitee.com/arlionn/data/blob/master/data01/grunfeld.dta
* define the program and include all desired commands
program my_rw_reg
if _N < 5 exit
gen long myweight = _n
regress invest mvalue [aw=myweight]
gen b_mvalue = _b[mvalue]
gen b_cons = _b[_cons]
drop myweight
end
rangerun my_rw_reg, interval(year -4 0) by(company) use(invest mvalue)3. rangestat 命令3.1 語法格式
*命令安裝
ssc install rangestat, replace*語法格式
rangestat slist [if] [in] , interval(keyvar low high) [ options ]
interval(keyvar low high):根據關鍵變量取值範圍,限定觀察樣本;local(name):定義一個包含創建變量名稱的宏。在大多數情況下,可以使用 keyvar 變量的當前觀測值定義區間界限。也可以通過使用 #(Stata 術語中的數字)指定每個邊界來實現。# 被添加到 keyvar 中設置界限時,與rangerun 設定一樣。rangestat 使用封閉的間隔,這意味著將包含與邊界匹配的值。
3.2 設置間隔退化間隔。最簡單的情況是使用具有相同 keyvar 值的觀測值來計算統計數據。在這裡,我們將 low 和 high 的值同時設為 0。
sysuse auto, clear
rangestat (min) price mpg (mean) price mpg, interval(rep78 0 0)
* redo using egen functions
sort rep78 make
by rep78: egen min_price = min(price)
by rep78: egen min_mpg = min(mpg)
by rep78: egen mean_price = mean(price)
by rep78: egen mean_mpg = mean(mpg)
list rep78 *price* in 1/4, sepby(rep78)滾動窗口間隔。使用 rangestat,可以輕鬆地在滾動窗口上執行計算。下面的示例使用 5 年的窗口,並包含當前的觀察結果。
webuse grunfeld.dta, clear
* include some missing values and omit some random observations
set seed 1234
replace invest = . if uniform() < .1
drop if uniform() < .1
rangestat (mean) invest (sd) invest (count) invest, ///
interval(year -4 0) by(company)遞歸窗口間隔。類似於依次累加。下面的示例使用系統缺失值指定 low,使用 0 指定 high。當系統缺失值用於下限時,rangestat假定所有觀察值都使用最大的負數。
webuse grunfeld.dta, clear
rangestat (sum) invest mvalue kstock, interval(year . 0) by(company)
* the above is the same as performing a running sum
by company (year): gen double rs_invest = sum(invest)
by company (year): gen double rs_mvalue = sum(mvalue)
by company (year): gen double rs_kstock = sum(kstock)反向遞歸窗口。類似於依次遞減。以下示例使用 0 指定 low,使用系統缺失值指定 high。在 Stata 中,系統缺失值大於任何非缺失值。
webuse grunfeld.dta, clear
rangestat (sum) invest, interval(year 0 .) by(company)
* this above is the same as removing a running sum from the overall total
by company (year): egen double invest_total = total(invest)
by company (year): gen double rsum = sum(invest)
by company (year): gen double match = invest_total - rsum + invest特定觀察間隔。low 和 high 還可以根據變量設定。以下示例查找 price 相近汽車的平均維修記錄。
sysuse auto.dta, clear
gen low = .9 * price
gen high = 1.1 * price
rangestat (mean) rep78, interval(price low high)
* spot check results for observation 15
list make price rep78 low high rep78_mean in 15
*類似於以下功能
sum rep78 if inrange(price, low[15], high[15])
3.3 控制樣本rangestat 支持 if 和 in 限定符。
sysuse auto, clear
rangestat (mean) price (count) price if foreign, interval(rep78 0 0)僅使用某些數據的計算結果代替所有觀測結果。例如,用外國車平均價格替代外國車和國產車的平均價格。
sysuse auto.dta, clear
clonevar price_foreign = price if foreign
rangestat (mean) price_foreign (count) price_foreign, interval(rep78 0 0)
*類似於
bys rep78: egen price_foreign_mean1 = mean(price_foreign) if rep != .再比如,以 rep78 每組第一行價格代替該組平均價格。
sysuse auto, clear
* tag the first observation per level of rep78
bysort rep78 (make): gen first = _n == 1
* create bounds for the first observation, use [1,0] for the rest
by rep78: gen low = cond(first, rep78, 1)
by rep78: gen high = cond(first, rep78, 0)
rangestat (mean) price (count) price, interval(rep78 low high)
3.4 使用內置函數相似年齡人群的平均工資。計算年齡相差 1 歲,且同種族、同行業,但不包括自身的的人群平均工資。
sysuse nlsw88.dta, clear
* calculate expected results for observation 10,用以校對結果
sum wage if inrange(age, age[10]-1, age[10]+1) & race == race[10] & industry == industry[10] & _n != 10
* calculate over the whole sample and list results for test observations
rangestat mwage = wage (count) wage, interval(age -1 1) excludeself by(race industry)
list age *wage* in 10特定年份其他公司的平均投資額。
webuse grunfeld, clear
rangestat (median) invest, interval(year 0 0) excludeself值得注意的是,將 low 和 high 都設置為 0 將為當前觀察值選擇所有具有相同年份的觀測值。當指定 excludeself 選項時,將忽略每個當前觀測值變量 invest 的值。
在滾動的時間範圍內進行回歸。可以使用內置函數 (reg) 在滾動的時間窗口內執行基本的普通最小二乘線性回歸 (帶有常數項)。
webuse grunfeld.dta, clear
rangestat (reg) invest mvalue kstock, interval(year -6 0) by(company)
* check results for observation 15,用以校對結果
list in 15
regress invest mvalue kstock if inrange(year, year[15]-6, year[15]) ///
& company == company[15]根據每日數據,計算月度協方差。可以使用內置函數 (cov) 來獲取兩個變量的協方差。
* fake data on 100 firms for 50 months with 21 daily returns per month
clear
set seed 123123
set obs 100
gen long firm = _n
expand 50
bysort firm: gen month = _n
expand 21
bysort firm month: gen ret_day = _n
gen return = runiform() if runiform() < .99
gen weight = runiform()
egen firm_month = group(firm month)
rangestat (cov) return weight, interval(firm_month 0 0) describe
list cov_x in 1
* compare with results using -correlate- for first and last observation,用以校對
corr return weight if firm_month == firm_month[1], covariance
dis r(cov_12)
3.5 與 tsegen 對比tsegen 和 rangestat 之間在功能上存在一些重疊。兩者都可以計算滾動時間範圍內的統計信息。
webuse grunfeld.dta, clear
tsegen double inv_m5b = rowmean(L(0/4).invest)
rangestat (mean) invest, interval(year -4 0) by(company)
assert inv_m5b == invest_mean通常,tsegen 能更有效地處理時間序列數據,並且 egen 函數可同時處理所有觀測值。但是,隨著時間窗口的增加,tsegen 將生成更多的臨時變量,tsegen 的效率會降低。此外,rangestat 的語法更加靈活,並且 rangestat 可以同時計算多個變量的多個統計信息。
webuse grunfeld, clear
rangestat (sd) sd_inv=invest kstock (count) invest kstock, interval(year -4 0) by(company)4. 參考文獻
溫馨提示: 文中連結在微信中無法生效。請點擊底部「閱讀原文」。
Jann B. MOREMATA: Stata module (Mata) to provide various functions[J]. 2005. -Link-Cox N J. Stata tip 51: Events in intervals[J]. The Stata Journal, 2007, 7(3): 440-443. -PDF-Cox N J. Speaking Stata: Rowwise[J]. The Stata Journal, 2009, 9(1): 137-157. -PDF-Cox N J. Speaking Stata: The limits of sample skewness and kurtosis[J]. The Stata Journal, 2010, 10(3): 482-495. -PDF-Cox N J. Speaking Stata: Compared with…[J]. The Stata Journal, 2011, 11(2): 305-314. -PDF-Cox N J. Speaking Stata: Self and others[J]. The Stata Journal, 2014, 14(2): 432-444. -PDF-5. 相關推文
Note:產生如下推文列表的命令為:
lianxh 滾動 循環 求和 多久能跑完 runby sumup, m
安裝最新版 lianxh 命令:
ssc install lianxh, replace溫馨提示: 文中連結在微信中無法生效。請點擊底部「閱讀原文」。
⏩ 連享會 · 文本分析-爬蟲-機器學習
⌚ 2021 年 3 月 27 日 - 4 月 11 日 (三個周末)
⭐ 主講:遊萬海 (福州大學)
司繼春 (上海對外經貿大學)
⛪ 課程主頁:https://gitee.com/lianxh/text
關於我們🍎 連享會 ( 主頁:lianxh.cn ) 由中山大學連玉君老師團隊創辦,定期分享實證分析經驗。👉 直達連享會:【百度一下:連享會】即可直達連享會主頁。亦可進一步添加 主頁,知乎,面板數據,研究設計 等關鍵詞細化搜索。連享會主頁 lianxh.cn
New! lianxh 命令發布了: GIF 動圖介紹
隨時搜索連享會推文、Stata 資源,安裝命令如下:
. ssc install lianxh
使用詳情參見幫助文件 (有驚喜):
. help lianxh