代码之家  ›  专栏  ›  技术社区  ›  TheGoat

基于滚动窗口的小波相关

  •  1
  • TheGoat  · 技术社区  · 7 年前

    我有3个时间序列,我可以应用小波变换使用滚动窗口。滚动窗口采用长度为200的单个时间序列,并应用 waveslim::modwt

    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 modwt 对于跨越4个级别的第一个窗口,并将一些值替换为 NA s

    我相信我已经用以下方法修改了@G.Grothendieck的答案,我希望我是对的:

    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))
    

    最后一件事是为数据的输出构建相关矩阵 砖墙 L

    有一个函数称为 waveslim::wave.correlation 输出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. 申请 砖墙
    4. 使用上述3个随时间变化的输出,为4个级别创建完整的3x3相关矩阵
    1 回复  |  直到 7 年前
        1
  •  1
  •   Scarabee    7 年前

    把你在问题中给出的部分放在一起:

    1) 创建3个时间序列

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

    modwt brick.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))))
    

    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]] 是的相关矩阵 d2 在第28个窗口中:

    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 . 注意,对于 d3 d4