滾動計算:rangerun和rangestat命令簡介

2021-02-23 Stata連享會

🍎 連享會主頁: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

相關焦點

  • Stata:滾動回歸的五個命令-rolling
    滾動窗口回歸此前,連享會分享了推文「滾動吧統計量!Stata數據處理」(微信版),重點介紹了如果獲取滾動窗口統計量,如均值、標準差等。在實證中分析中,我們也經常要以某個長度的窗口進行滾動回歸。例如,在計算企業風險承擔水平時,我們就需要計算連續三年的經行業調整的 ROA 標準差。
  • 雲計算核心技術Docker教程:run 命令詳解
    來源:TechWeb.com.cn在docker客戶端命令行中,我們可以直接輸入 docker 命令來查看到 Docker 客戶端的所有命令選項。可以通過命令 docker command help 更深入的了解指定的 Docker 命令使用方法。
  • USEARCH11命令大全,200+命令中文簡介,快速查找需要功能
    算法小內存模式聚類,適合低配電腦cluster_tree基於距離閾值和樹構建簇距離矩陣Distance matrices命令功能簡介calc_distmx計算稀疏的距離矩陣calc_lcr_probs基於距離矩陣和物種計算最低共同級別(最近共同祖先)的概率distmx_split_identity拆分距離矩陣為測試和訓練集用於CVItree2distmx
  • 雲計算核心技術Docker教程:Docker Compose run命令詳解
    Docker-Compose run命令可以針對服務運行一次性命令,使用run命令可以從具有由服務定義的配置的新容器中啟動,包括卷,連結和其他詳細信息。語法格式Usage:run [options] [-v VOLUME...] [-p PORT...]
  • Python range()的解釋和可視化
    在Python中用示例解釋和可視化range()函數我們將繼續深入研究各種Python函數、模塊和庫的內部工作方式。range和list的使用過程假設參數為5時,我們可能想要展示序列中實際使用了哪些數字。
  • file_put_contents+php-fpm如何命令執行
    實驗php-fpm命令執行docker起一個php-fpm的環境docker pull wyveo/nginx-php-fpmdocker run -d wyveo/nginx-php-fpm利用pyfcgiclient來發送fastcgi數據包from pyfcgiclient.fpm import FPM
  • 谷歌Walt:幫助用戶計算設備對觸摸和語音命令延遲時間
    打開APP 谷歌Walt:幫助用戶計算設備對觸摸和語音命令延遲時間 發表於 2016-11-05 08:37:11 谷歌首次推出開源軟體工具 Walt,一款可以幫助用戶計算設備對觸摸和語音命令延遲時間的設備。
  • .run域名簡介 - 西部數碼資訊門戶
    .run域名簡介.run是是新通用頂級域名(New Generic Top-level Domain 簡稱 New gTLD)。run域名優勢分析.run域名作為國際通用頂級域名,一、擁有寬鬆的申請政策,寬鬆的準入制度對於把握瞬息變化的網際網路市場而言至關重要;二、國際接軌,全球高知名性標識。.run擁有「頂級」英語語系釋義,.run基本釋義已經蘊含其品牌定位。已有的人氣基礎及辨識廣度,對於.run的全球推廣將是強大的助力;三、完整的資源拼盤,滿足用戶的各種需求。
  • Python的range和xrange
    range函數說明:range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長
  • 雲計算核心技術Docker教程:docker-compose命令up,run以及start...
    該docker-compose up命令匯總每個容器的輸出(本質上是docker-compose logs -f)。當命令退出時,所有容器都將停止。運行docker-compose up -d將在後臺啟動容器並使它們繼續運行。
  • 安利十二個常用的IPython魔法命令
    而進行數據分析、機器學習時就會用到後者,因為Jupyter編譯器利用的IPython是一種交互式計算和開發環境,對數據的可視化十分友好,這類單元格的形式每一步都有運行結果,便於整理自己思路,並且很大程度上節約了運行時間,在調試的時候只需要運行出錯的部分代碼,而不是全部。
  • Linux系統和Shell命令行簡介,走上數據分析之路
    Shell命令行簡介,走上數據分析之路本節作者:劉永鑫 中國科學院遺傳與發育生物學研究所版本1.0.2,更新日期:2020年8月31日本項目永久地址:https://github.com/YongxinLiu/MicrobiomeStatPlot ,本節目錄 122Linux,包含R markdown(*.Rmd)、Word(*.docx)文檔、測試數據和結果圖表
  • Linux常用命令:Linux more命令使用方法
    more功能類似 cat ,cat命令是整個文件的內容從上到下顯示在屏幕上。 more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,而且還有搜尋字串的功能 。more命令從前向後讀取文件,因此在啟動時就加載整個文件。
  • 如何用 Python 執行單行命令
    例如:python -c "print('Hello World')"-c 之後,要用雙引號將命令包起來,import 以;結尾,命令用[]括起來,多行命令用多個[]。python -c "import os,time;[print(i) for i in os.listdir()];[print(time.time())]"一些比較複雜的命令複雜的命令必須要用[]括起來,否則會報錯。
  • cad繪圖命令操作圖文教程:計算面積的方法和命令看這篇就夠了
    在日常的繪圖過程中,設計師經常需要查詢和計算圖形的面積,如果能掌握更多的方法和技巧的話,工作效率也能得到更大的提升。今天小編為大家將計算面積的方法和相關命令通通整理了一遍。想看看你還有哪些方法之前是沒學習過的嗎,往下看。
  • Python的Range()函數(指南)
    range()函數的歷史雖然Python 2的range()和Python3中的range()共享了一個名字,但它們是完全不同的傢伙。事實上,Python 3中的range()只是Python 2中被稱為xrange的函數的重命名版本。
  • stata的egen命令和excel每行添加表頭
    微信公眾號:學點啥玩點啥學而不玩則累,玩而不學則廢;期待與你一起學習一起玩耍一起成長egen命令的一些基本用法計算統計量 egen命令可以搭配諸多函數,從而計算出數據的多種統計量,如均值。如果我們想計算不同人種的平均工資,egen命令也是可以辦到的。
  • 微信小程序picker滾動選擇器使用詳解
    今天修改小程序做章節內容篩選使用到了picker滾動選擇器,看了官方文檔和一些網上的文章後,終於算是弄明白了這個組件的使用,這裡把我對這picker滾動選擇器的使用記錄下:picker基礎使用picker滾動選擇器(下簡稱picker)是微信小程序自帶的組件,無需引入任何文件,只要在適當的位置放入
  • 零基礎入門Python:基本命令、函數、數據結構
    讀者可以打開Python,試著輸入代碼清單1所示的命令。代碼清單1所示的命令是Python幾個基本運算,第一個命令是賦值運算,第二個命令是乘法運算,最後一個命令是冪運算(即a2),這些基本上是所有程式語言通用的。不過Python支持多重賦值,方法如下:Python支持對字符串的靈活操作,如代碼清單2所示。
  • CAD計算面積的方法、命令匯總
    在繪圖的過程中經常需要查詢和計算圖形的面積,網上有不少人問這方面的問題。之前比較懶,只是在博客裡轉了一篇別人的文章,那篇文章雖然寫得很全面,但條理不是太清晰。今天又有人問起面積的問題,我想還是花點時間將計算面積的方法和相關命令整理一下,希望對初學者有幫助。一、查詢面積(AREA)命令CAD提供了查詢面積的命令:AREA,快捷鍵是AA。