2017-08-14 39 views
0

我有3個時間序列,我可以將小波變換應用到滾動窗口。滾動窗口採用長度爲200的單個時間序列,並在前30個樣本上應用waveslim::modwt函數。此輸出5只列出其中我只對感興趣的(D1,D2,D3,D4),並且這些各自具有30的長度一個簡單的例子可以在這裏找到:使用滾動窗口的小波關聯

library(waveslim) 
J <- 4 #no. of levels in decomposition 
data(ar1) 
ar1.modwt <- modwt(ar1, "la8", J) 

@G。格洛騰迪克已經爲單個時間序列here提供了一個整潔的滾動窗口代碼。

滾動窗口增加1,我們又走了,產生另外5個列表,其中我只關心d1-> d4等等,直到時間序列的全長已經翻轉。

下一步是將waveslim::brick.wall函數應用於滾動窗口列表的輸出。 brick.wall函數查看modwt的輸出,查看4個級別的第一個窗口,並用NA s替換一些值。

我相信我通過修改@G來解決這個問題。格羅滕迪克回答使用以下方法中,我希望我右:

modwt2 <- function(...) unlist(head(brick.wall(modwt(...)), 4)) 
rollr <- rollapplyr(ar1, 30, FUN = modwt2, wf = "la8", n.levels = 4, boundary = "periodic") 
L <- lapply(1:nrow(rollr), function(i) matrix(rollr[i,], , 4)) 

最後一塊是構造相關矩陣爲brick.wall函數,它是L以上在4個級別的感興趣的輸出。

有一個稱爲waveslim::wave.correlation的函數,它需要兩個brick.wall輸出X和Y並計算各個級別上的wave.correlation

library(waveslim) 
data(exchange) 
returns <- diff(log(as.matrix(exchange))) 
returns <- ts(returns, start=1970, freq=12) 
wf <- "la8" 
J <- 4 
demusd.modwt <- modwt(returns[,"DEM.USD"], wf, J) 
demusd.modwt.bw <- brick.wall(demusd.modwt, wf) 
jpyusd.modwt <- modwt(returns[,"JPY.USD"], wf, J) 
jpyusd.modwt.bw <- brick.wall(jpyusd.modwt, wf) 
returns.modwt.cor <- wave.correlation(demusd.modwt.bw, jpyusd.modwt.bw, 
             N = dim(returns)[1]) 

我想對此進行擴展並計算我的3個時間序列的完全相關矩陣。請注意,以上匯率的例子沒有使用滾動窗口方法,因爲它使用了我現在想要做的時間序列的全部長度,並且它還爲兩個時間序列之間的相關性生成了單個值。由於我對這些相關矩陣的特徵值隨着時間的推移感興趣,它並不構建我所需要的全相關矩陣。

因此,在總結:

  1. 取3時間序列
  2. 使用滾動窗口應用modwt函數
  3. 應用brick.wall函數以滾動窗口的每個輸出在2以上
  4. 創建完整的3×3的相關性使用以上3個輸出的4個級別的矩陣
+0

我不明白,你幾乎擁有一切,只需要對3個時間序列應用/修改'wave.correlation'? – PoGibas

+0

@PoGibas這不是那麼簡單,至少不是在我的頭上。是的,我有第1部分和第2部分,我需要創建第3個,但我不是一個強大的程序員,使用列表對我來說很困難,我不有任何與他們合作的經驗。如果您有任何意見,我會很高興聽到。 – TheGoat

回答

1

你在你的問題給出件放在一起:

1)創建3個時間序列

set.seed(1) 
s <- replicate(3, rnorm(200), simplify = FALSE) 

2)& 3)應用modwtbrick.wall與滾動窗口

modwt2 <- function(...) unlist(head(brick.wall(modwt(...), wf = "la8"), 4)) 

rollr <- lapply(s, function(x) rollapplyr(x, 30, FUN = modwt2, wf = "la8", 
              n.levels = 4, boundary = "periodic")) 

L <- lapply(rollr, function(x) lapply(1:nrow(x), function(i) matrix(x[i,], , 4))) 

res <- lapply(L, function(y) lapply(y, function(x) as.list(as.data.frame(x)))) 

4)創建相關矩陣

create_4mat <- function(w) { 
    # create four 3*3 correlation matrices (one for each level) for window w 
    M <- replicate(4, matrix(0, nrow = 3, ncol = 3), simplify = FALSE) 
    for (k in 1:4) { 
    for (i in 1:3) { 
     for (j in (i:3)[-1]) { 
     M[[k]][i, j] = wave.correlation(res[[i]][[w]], res[[j]][[w]], N=30)[k, 1] 
     } 
    } 
    M[[k]] <- M[[k]] + t(M[[k]]) + diag(1, 3, 3) 
    } 
    M 
} 

output <- lapply(1:171, create_4mat) 

output是4個相關矩陣的171個列表的列表。

例如,output[[28]][[2]]是在第28屆窗口d2相關矩陣:

output[[28]][[2]] 
#   [,1]  [,2]  [,3] 
# [1,] 1.0000000 -0.1740320 0.2292872 
# [2,] -0.1740320 1.0000000 0.6046918 
# [3,] 0.2292872 0.6046918 1.0000000 

編輯:特徵值(如在註釋請求)

對於d1

eigenvalues1 <- lapply(output, function(x) eigen(x[[1]], symmetric = TRUE, 
               only.values = TRUE)$values) 

同樣適用於d2。請注意,對於d3d4,所有相關矩陣都填充了缺失值。

+0

非常感謝您的支持,這是一個巨大的幫助。現在我有「輸出」的最後一塊是如何使用apply函數和特徵函數來計算每個級別的特徵值,即d1-> d4? – TheGoat

+0

@PigWolf:不客氣,我編輯了我的答案。 – Scarabee