拓端tecdat|R語言分解商業週期時間序列資料:線性濾波器、HP濾波器、Baxter King濾波器、Beveridge Nelson分解等去趨勢方法
原文連結:http://tecdat.cn/?p=23000
原文出處:拓端資料部落公眾號
分解南非GDP資料
本文包含各種過濾器,可用於分解南非GDP的方法。我們做的第一件事是清除當前環境中的所有變數。這可以通過以下命令進行。
- rm(list = ls())
- graphics.off()
載入資料
如前所述,南非的GDP資料將其作為時間序列儲存在gdp中,我們執行以下命令。
- gdp <- ts(dat.tmp, start = c(1960, 2), frequency = 4)
為了確保這些計算和提取的結果是正確的,我們檢查一下資料的圖表。
plot(gdp)
線性濾波器去除資料線性趨勢
為了估計一個線性趨勢,我們可以利用一個包括時間趨勢和常數的線性迴歸模型。為了估計這樣一個模型,我們使用lm命令,如下。
- lin.mod$fitted.values # 擬合值與時間趨勢有關
- ts(lin.trend, start = c(1960, 1)) # 為趨勢建立一個時間序列變數
- gdp - linear # 週期是資料和線性趨勢之間的差異
迴歸的擬合值包含與線性趨勢有關的資訊。這些資訊需要從模型物件lin.mod中提取,在上面的塊中,我們將這些值分配給時間序列物件linear。然後從資料中剔除趨勢,就得到了週期。
然後我們可以藉助下面的命令來繪製這個結果,其中趨勢和週期被繪製在不同的數字上。
- plot.ts(gdp, ylab = "")
- lines(linear, col = "red")
- legend("topleft", legend = c("data", "trend")
霍德里克 - 普雷斯科特(Hodrick-Prescott,HP)濾波器對資料進行去趨勢處理
要用流行的HP濾波法分解這個資料。在這種情況下,我們將lambda的值設定為1600,這也是對季度資料的建議。
- hp(gdp, freq = 1600)
- plot.ts(gdp, ylab = "") # 繪製時間序列
- plot.ts(hp.decom$cycle, ylab = "") # 繪製週期圖
這似乎更準確地反映了我們對南非經濟表現的理解。
用Baxter-King濾波器去趨勢資料
為了利用Baxter-King濾波器。在這種情況下,我們需要指定週期的頻帶,其上限被設定為32,下限被設定為6。
- bk(gdp, pl = 6, pu = 32)
- plot.ts(gdp, ylab = "")
- plot.ts(cycle, ylab = "")
這似乎再次為南非經濟活動的週期性提供了一個相當準確的表述。還要注意的是,週期的表示比以前提供的要平滑得多,因為噪音不包括在週期中。
Christiano-Fitzgerald濾波器去趨勢資料
這個濾波器的性質與上面提供的非常相似。此外,產生與Baxter-King濾波器高度相似的結果。
- plot.ts(gdp, ylab = "")
- plot.ts(cfcycle, ylab = "")
用Beveridge-Nelson分解法 "去趨勢 "資料
為了將資料分解為隨機趨勢和平穩週期,我們可以採用Beveridge-Nelson分解法。當採用這種技術時,我們需要指定與平穩部分有關的滯後期的數量。在我下面的例子中,我假設有八個滯後期。
- plot.ts(gdp, ylab = "")
- lines(bn.trend, col = "red")
- plot.ts(bn.cycle, ylab = "")
比較週期的不同衡量標準
然後,我們可以將所有這些結果結合在一張圖上,考慮各自的相似性和差異。在這個例子中,我建立了一個時間序列ts.union,但是我也可以先繪製一個單一的序列,然後再使用lines命令在上面繪製連續的圖。
- ts.union(lin.cycle, hp.decom, bp.decom,
- cf.decom, bn.cycle)
- plot.ts(comb, ylab = "")
譜分解
在我們考慮使用譜技術之前,最好先清除當前環境中的所有變數,並關閉所有的圖。下一步是確保你可以通過使用library命令來訪問這些包中的程式。
- library(tsm)
- library(TSA)
- library(mFilter)
使用譜技術進行分解。我們可以為三個時間序列變數生成數值,然後將它們組合成一個單一的變數。
- 2 * cos(2 * pi * t * w[1]) + 3 * sin(2 * pi * t *
- w[1]) # no.obs點上的6個週期的頻率
- 4 * cos(2 * pi * t * w[2]) + 5 * sin(2 * pi * t *
- w[2]) #頻率為10個週期的觀察點
- 6 * cos(2 * pi * t * w[3]) + 7 * sin(2 * pi * t *
- w[3]) # 在沒有觀測點的情況下,頻率為40個週期
- y <- x1 + x2 + x3
為了觀察這些變數,我們可以把它們繪製在一個單獨的軸上。
- par(mfrow = c(2, 2), mar = c(2.2, 2.2, 2, 1), cex = 0.8)
- plot(x1, type = "l", main = "x1")
- plot(x2, type = "l", main = "x2")
- plot(x3, type = "l", main = "x3")
- plot(y, type = "l", main = "y")
此後,我們可以使用週期圖來考慮這些時間序列變數的每一個屬性。
gram(y, main = "y", col = "red")
當然,我們可以利用一個過濾器,從總體時間序列變數中去除一些不需要的成分。為此,我們可以應用上下限相對較窄的Christiano-Fitzgerald濾波器。此後,我們使用應用於與週期有關的資訊的週期圖,來調查它是否成功地剔除了一些頻率成分。
- cf(y0)
- gram(cycle)
這個結果將表明,濾波器已經排除了大部分的高頻率成分。為了看看這個週期與之前的資料有什麼關係,我們把通過濾波器的週期性資訊繪製在分量上。此外,我們還將這個結果繪製在綜合週期的變數上。
- plot(x1, type = "l", lty = 1)
- lines(cycle, lty = 3, lwd = 3)
- plot(y, type = "l", lty = 1)
- lines(cycle, lty = 3, lwd = 3)
在這兩種情況下,它似乎都對過程中的趨勢做了合理的描述。
南非商業週期的譜分解法
為了考慮如何在實踐中使用這些頻譜分解,我們現在可以考慮將這些技術應用於南非商業週期的各種特徵中。
下一步將是執行所有的過濾器,這些過濾器被應用於識別南非商業週期的不同方法。
現在,讓我們對商業週期的每一個標準應用一個週期圖。
線性濾波器提供了一個很差的結果,因為趨勢明顯占主導地位(這不是週期應該有的)。這與Hodrick-Prescott濾波器的特徵形成對比,後者的趨勢資訊已經被去除。Baxter & King和Christiano & Fitzgerald的帶通濾波器也是這種情況。在這兩種情況下,噪聲也已經被去除。最後的結果與Beveridge-Nelson分解有關,我們注意到週期包括大量的趨勢和大量的噪聲。
小波分解
為了提供一個小波分解的例子,我們將把該方法應用於南非通貨膨脹的資料。這將允許使用在這個過程中推匯出對趨勢的另一種衡量方法,這可以被認為是代表核心通貨膨脹。請注意,這種技術可以應用於任何階數的單整資料,所以我們不需要首先考慮變數的單整階數。
然後,我們將利用消費者價格指數的月度資料,該資料包含在SARB的季度公告中。資料可以追溯到2002年。為了計算通貨膨脹的同比指標,我們使用diff和lag命令。
diff/cpi[-1 * (length - 11):length]
為了確保所有這些變數的轉換都已正確進行,我們對資料進行繪圖。
plot(inf.yoy)
由於我們在這種情況下主要對識別平滑的趨勢感興趣,我們將使用貝希斯函式。這樣的函式是Daubechies 4小波,它應用修正的離散小波變換方法。此外,我們還將使用三個母小波來處理各自的高頻成分。
wt(yoy, "d4")
然後我們可以為每個獨立的頻率成分繪製結果,如下所示。
- plot.ts(yoy)
- for (i in 1:4) plot.ts(d4[[i]]
如果我們現在想在資料上繪製趨勢(父小波)。
- plot.ts(inf, ylab = "inf")
- lines(ren)
請注意,由於各自的頻段是相加的,我們可以將其中一個母頻段加入到趨勢中,如下所示。
- inf.tmp <- inf.tren + inf.d4$w3
- inf.tren2 <- ts(inf.tmp, start = c(2003, 1), frequency = 12)
- plot.ts(inf.yoy, ylab = "inf")
- lines(inf.tren2, col = "red")
相關經濟變數的週期性成分之間的相關性
為了確定週期的特徵是否合適,我們可以考慮巨集觀經濟總量的一些不同週期性方法之間的相關性。例如,我們可以考慮產出和生產(或就業)的週期性在不同的滯後期應該是相關的。如果它們不相關,那麼該方法可能無法準確描述各自變數的週期性成分。
在本文使用的例子中,程式碼可能有點難以理解,但我們鼓勵你自己去研究,以提高你對這個編碼環境的總體理解。
下一步是讀入資料併為資料的各種週期性成分建立一些矩陣。
- yd <- dat[5:n.obs, ] - dat[1:(n.obs - 4), ] # 儲存輸出
- yc_li <- matrix(rep(0, n.obs * n.var), ncol = n.var)
- yc_hp <- matrix(rep(0, n.obs * n.var), ncol = n.var)
- yc_bp <- matrix(rep(0, n.obs * n.var), ncol = n.var)
- yc_bn <- matrix(rep(0, n.obs * n.var), ncol = n.var)
使用上面包含的方法對資料進行過濾。
- for (i in 1:n) {
- # 用線性濾波器對資料進行去趨勢處理
- lin.mod <- lm(dat[, i] ~ time(dat[, i]))
- # 用HP濾波器去趨勢資料
- yc_hp[, i] <- hp.cycle
- #用帶通濾波器去趨勢資料
- yc_bp[, i] <- bp.cycle
- # Beveridge-Nelson分解
- yc_bn[, i] <- bn.[, 2]
- }
計算不同提前期和滯後期的相關關係。
- for (i in 1:n) {
- for (j in 1:n.var) {
- c_li <- leadlag(yc_li[, i], yc_li[, j], maxLeadLag)
- c_hp <- leadlag(yc_hp[, i], yc_hp[, j], maxLeadLag)
- c_bp
- c_bn
- c_yd
- for (k in 1:5) {
- ynamesLong[(cnt + k), 1] <- paste(ynames.tmp)
- }
- cnt <- cnt + 5
繪製結果。
- # 線性趨勢
- barplot(corrStylizedFact)
- box()
- # hp濾波器
- op <- par(mfrow = c(1, 3))
- barplot(corrStyli, ylim = c(-1, 1))
- box()
- # beveridge nelson 分解
- barplot(coracts, ylim = c(-1, 1), col = "red")
- box()
最受歡迎的見解
1.在python中使用lstm和pytorch進行時間序列預測
2.python中利用長短期記憶模型lstm進行時間序列預測分析
8.r語言k-shape時間序列聚類方法對股票價格時間序列聚類
▍關注我們 【大資料部落】第三方資料服務提供商,提供全面的統計分析與資料探勘諮詢服務,為客戶定製個性化的資料解決方案與行業報告等。 ▍諮詢連結:http://y0.cn/teradat ▍聯絡郵箱:[email protected]