2017-08-14 40 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