1. 程式人生 > 其它 >拓端tecdat|R語言分解商業週期時間序列資料:線性濾波器、HP濾波器、Baxter King濾波器、Beveridge Nelson分解等去趨勢方法

拓端tecdat|R語言分解商業週期時間序列資料:線性濾波器、HP濾波器、Baxter King濾波器、Beveridge Nelson分解等去趨勢方法

原文連結:http://tecdat.cn/?p=23000

原文出處:拓端資料部落公眾號

分解南非GDP資料

本文包含各種過濾器,可用於分解南非GDP的方法。我們做的第一件事是清除當前環境中的所有變數。這可以通過以下命令進行。

  1. rm(list = ls())
  2. graphics.off()

載入資料

如前所述,南非的GDP資料將其作為時間序列儲存在gdp中,我們執行以下命令。

  1. gdp <- ts(dat.tmp, start = c(1960, 2), frequency = 4)

為了確保這些計算和提取的結果是正確的,我們檢查一下資料的圖表。

plot(gdp)

線性濾波器去除資料線性趨勢


為了估計一個線性趨勢,我們可以利用一個包括時間趨勢和常數的線性迴歸模型。為了估計這樣一個模型,我們使用lm命令,如下。

  1. lin.mod$fitted.values # 擬合值與時間趨勢有關
  2. ts(lin.trend, start = c(1960, 1)) # 為趨勢建立一個時間序列變數
  3. gdp - linear # 週期是資料和線性趨勢之間的差異

迴歸的擬合值包含與線性趨勢有關的資訊。這些資訊需要從模型物件lin.mod中提取,在上面的塊中,我們將這些值分配給時間序列物件linear。然後從資料中剔除趨勢,就得到了週期。

然後我們可以藉助下面的命令來繪製這個結果,其中趨勢和週期被繪製在不同的數字上。

  1. plot.ts(gdp, ylab = "")
  2. lines(linear, col = "red")
  3. legend("topleft", legend = c("data", "trend")

霍德里克 - 普雷斯科特(Hodrick-Prescott,HP)濾波器對資料進行去趨勢處理

要用流行的HP濾波法分解這個資料。在這種情況下,我們將lambda的值設定為1600,這也是對季度資料的建議。

  1. hp(gdp, freq = 1600)
  2. plot.ts(gdp, ylab = "") # 繪製時間序列
  3. plot.ts(hp.decom$cycle, ylab = "") # 繪製週期圖

這似乎更準確地反映了我們對南非經濟表現的理解。

用Baxter-King濾波器去趨勢資料

為了利用Baxter-King濾波器。在這種情況下,我們需要指定週期的頻帶,其上限被設定為32,下限被設定為6。

  1. bk(gdp, pl = 6, pu = 32)
  2. plot.ts(gdp, ylab = "")
  3. plot.ts(cycle, ylab = "")

這似乎再次為南非經濟活動的週期性提供了一個相當準確的表述。還要注意的是,週期的表示比以前提供的要平滑得多,因為噪音不包括在週期中。

Christiano-Fitzgerald濾波器去趨勢資料

這個濾波器的性質與上面提供的非常相似。此外,產生與Baxter-King濾波器高度相似的結果。

  1. plot.ts(gdp, ylab = "")
  2. plot.ts(cfcycle, ylab = "")

用Beveridge-Nelson分解法 "去趨勢 "資料

為了將資料分解為隨機趨勢和平穩週期,我們可以採用Beveridge-Nelson分解法。當採用這種技術時,我們需要指定與平穩部分有關的滯後期的數量。在我下面的例子中,我假設有八個滯後期。

  1. plot.ts(gdp, ylab = "")
  2. lines(bn.trend, col = "red")
  3. plot.ts(bn.cycle, ylab = "")

比較週期的不同衡量標準

然後,我們可以將所有這些結果結合在一張圖上,考慮各自的相似性和差異。在這個例子中,我建立了一個時間序列ts.union,但是我也可以先繪製一個單一的序列,然後再使用lines命令在上面繪製連續的圖。

  1. ts.union(lin.cycle, hp.decom, bp.decom,
  2. cf.decom, bn.cycle)
  3. plot.ts(comb, ylab = "")

譜分解

在我們考慮使用譜技術之前,最好先清除當前環境中的所有變數,並關閉所有的圖。下一步是確保你可以通過使用library命令來訪問這些包中的程式。

  1. library(tsm)
  2. library(TSA)
  3. library(mFilter)

使用譜技術進行分解。我們可以為三個時間序列變數生成數值,然後將它們組合成一個單一的變數。

  1. 2 * cos(2 * pi * t * w[1]) + 3 * sin(2 * pi * t *
  2. w[1]) # no.obs點上的6個週期的頻率
  3. 4 * cos(2 * pi * t * w[2]) + 5 * sin(2 * pi * t *
  4. w[2]) #頻率為10個週期的觀察點
  5. 6 * cos(2 * pi * t * w[3]) + 7 * sin(2 * pi * t *
  6. w[3]) # 在沒有觀測點的情況下,頻率為40個週期
  7. y <- x1 + x2 + x3

為了觀察這些變數,我們可以把它們繪製在一個單獨的軸上。

  1. par(mfrow = c(2, 2), mar = c(2.2, 2.2, 2, 1), cex = 0.8)
  2. plot(x1, type = "l", main = "x1")
  3. plot(x2, type = "l", main = "x2")
  4. plot(x3, type = "l", main = "x3")
  5. plot(y, type = "l", main = "y")

此後,我們可以使用週期圖來考慮這些時間序列變數的每一個屬性。

gram(y, main = "y", col = "red")

當然,我們可以利用一個過濾器,從總體時間序列變數中去除一些不需要的成分。為此,我們可以應用上下限相對較窄的Christiano-Fitzgerald濾波器。此後,我們使用應用於與週期有關的資訊的週期圖,來調查它是否成功地剔除了一些頻率成分。

  1. cf(y0)
  2. gram(cycle)

這個結果將表明,濾波器已經排除了大部分的高頻率成分。為了看看這個週期與之前的資料有什麼關係,我們把通過濾波器的週期性資訊繪製在分量上。此外,我們還將這個結果繪製在綜合週期的變數上。

  1. plot(x1, type = "l", lty = 1)
  2. lines(cycle, lty = 3, lwd = 3)
  3. plot(y, type = "l", lty = 1)
  4. 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")

然後我們可以為每個獨立的頻率成分繪製結果,如下所示。

  1. plot.ts(yoy)
  2. for (i in 1:4) plot.ts(d4[[i]]

如果我們現在想在資料上繪製趨勢(父小波)。

  1. plot.ts(inf, ylab = "inf")
  2. lines(ren)

請注意,由於各自的頻段是相加的,我們可以將其中一個母頻段加入到趨勢中,如下所示。

  1. inf.tmp <- inf.tren + inf.d4$w3
  2. inf.tren2 <- ts(inf.tmp, start = c(2003, 1), frequency = 12)
  3. plot.ts(inf.yoy, ylab = "inf")
  4. lines(inf.tren2, col = "red")

相關經濟變數的週期性成分之間的相關性

為了確定週期的特徵是否合適,我們可以考慮巨集觀經濟總量的一些不同週期性方法之間的相關性。例如,我們可以考慮產出和生產(或就業)的週期性在不同的滯後期應該是相關的。如果它們不相關,那麼該方法可能無法準確描述各自變數的週期性成分。

在本文使用的例子中,程式碼可能有點難以理解,但我們鼓勵你自己去研究,以提高你對這個編碼環境的總體理解。

下一步是讀入資料併為資料的各種週期性成分建立一些矩陣。

  1. yd <- dat[5:n.obs, ] - dat[1:(n.obs - 4), ] # 儲存輸出
  2. yc_li <- matrix(rep(0, n.obs * n.var), ncol = n.var)
  3. yc_hp <- matrix(rep(0, n.obs * n.var), ncol = n.var)
  4. yc_bp <- matrix(rep(0, n.obs * n.var), ncol = n.var)
  5. yc_bn <- matrix(rep(0, n.obs * n.var), ncol = n.var)

使用上面包含的方法對資料進行過濾。

  1. for (i in 1:n) {
  2. # 用線性濾波器對資料進行去趨勢處理
  3. lin.mod <- lm(dat[, i] ~ time(dat[, i]))
  4. # 用HP濾波器去趨勢資料
  5. yc_hp[, i] <- hp.cycle
  6. #用帶通濾波器去趨勢資料
  7. yc_bp[, i] <- bp.cycle
  8. # Beveridge-Nelson分解
  9. yc_bn[, i] <- bn.[, 2]
  10. }

計算不同提前期和滯後期的相關關係。

  1. for (i in 1:n) {
  2. for (j in 1:n.var) {
  3. c_li <- leadlag(yc_li[, i], yc_li[, j], maxLeadLag)
  4. c_hp <- leadlag(yc_hp[, i], yc_hp[, j], maxLeadLag)
  5. c_bp
  6. c_bn
  7. c_yd
  8. for (k in 1:5) {
  9. ynamesLong[(cnt + k), 1] <- paste(ynames.tmp)
  10. }
  11. cnt <- cnt + 5

繪製結果。

  1. # 線性趨勢
  2. barplot(corrStylizedFact)
  3. box()
  1. # hp濾波器
  2. op <- par(mfrow = c(1, 3))
  3. barplot(corrStyli, ylim = c(-1, 1))
  4. box()
  1. # beveridge nelson 分解
  2. barplot(coracts, ylim = c(-1, 1), col = "red")
  3. box()

最受歡迎的見解

1.在python中使用lstm和pytorch進行時間序列預測

2.python中利用長短期記憶模型lstm進行時間序列預測分析

3.使用r語言進行時間序列(arima,指數平滑)分析

4.r語言多元copula-garch-模型時間序列預測

5.r語言copulas和金融時間序列案例

6.使用r語言隨機波動模型sv處理時間序列中的隨機波動

7.r語言時間序列tar閾值自迴歸模型

8.r語言k-shape時間序列聚類方法對股票價格時間序列聚類

9.python3用arima模型進行時間序列預測

▍關注我們 【大資料部落】第三方資料服務提供商,提供全面的統計分析與資料探勘諮詢服務,為客戶定製個性化的資料解決方案與行業報告等。 ▍諮詢連結:http://y0.cn/teradat ▍聯絡郵箱:[email protected]