2017-08-14 9 views
0

ウェーブレット変換をローリングウィンドウを使用して適用できる3つの時系列があります。ローリングウィンドウは、長さ200の単一の時系列をとり、waveslim::modwt関数を最初の30サンプルにわたって適用します。これは私にのみ興味そのうち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は、1つの時系列のローリングウインドウのアプローチのためのきちんとしたコードを提供しましたhere

ローリングウィンドウが1ずつ増加し、私たちはもう一度やり直して、時系列の全長がロールオーバーされるまで、d1-> d4だけを気にする5つのリストを作成します。

次の手順は、ローリングウィンドウリストの出力に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)) 

最後のピースは、関心の4つのレベルを超える上記Lあるbrick.wall機能の出力の相関行列を構築することです。

brick.wall出力XとYを取り、様々なレベルでwave.correlationを計算するwaveslim::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つの時系列の完全相関行列を計算したいと思います。上記の例の為替レートでは、私が今したい時系列の全長を使用するので、ローリングウインドウアプローチを使用しないことに注意してください。また、2つの時系列間の相関のための単一の値も生成します。時間の経過とともにこれらの相関行列の固有値に興味があるので、私が必要とする完全な相関行列は構成しません。要約中のSO

  1. 3時系列を取るローリング・ウィンドウ
  2. を使用してmodwt関数を適用
  3. 上記2のローリング・ウィンドウの各出力にbrick.wall機能を適用し、完全な3x3の相関関係を作成します。上記の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を作成します)ローリング・ウィンドウ

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)))) 
modwtbrick.wallを適用します

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]] 
#   [,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) 
例えば

output[[28]][[2]]は28ウィンドウのd2の相関行列であります

d2の場合も同様です。 d3d4については、すべての相関行列が欠損値で埋められていることに注意してください。

+0

これは大変ありがとうございます。これは大きな助けとなります。私が "出力"を持つ最後の部分は、apply関数と固有関数を使って各レベルの固有値、つまりd1→d4を計算する方法です。 – TheGoat

+0

@PigWolf:あなたは歓迎です、私は自分の答えを編集しました。 – Scarabee

関連する問題