使用滚动窗口进行小波相关

时间:2017-08-14 11:07:30

标签: r time-series correlation wavelet rollapply

我有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。 Grothendieck为单个时间序列here提供了一个整齐的滚动窗口代码。

滚动窗口增加1,我们再次进行,产生另外5个列表,其中我只关心d1-> d4,依此类推,直到时间序列的全长已经翻转为止。

下一步是将waveslim::brick.wall函数应用于滚动窗口列表的输出。 brick.wall函数查看4个级别中第一个窗口的modwt输出,并用NA替换部分值。

我相信我已经通过修改@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函数的输出构建相关矩阵,该函数在4个感兴趣的级别上方L

有一个名为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. 使用滚动窗口
  3. 应用modwt功能
  4. brick.wall函数应用于上面2中滚动窗口的每个输出
  5. 使用3以上的输出随时间创建4个级别的完整3x3相关矩阵

1 个答案:

答案 0 :(得分:1)

将您在问题中提供的部分放在一起:

1)创建3个时间序列

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

2)&amp; 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,所有相关矩阵都填充了缺失值。