Корреляция вейвлетов с использованием скользящего окна

У меня есть 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)

@ГРАММ. Гротендик любезно предоставил аккуратный фрагмент кода для подхода скользящего окна для одного временного ряда здесь.

Скользящее окно увеличивается на 1, и мы снова идем, создавая еще 5 списков, из которых меня интересуют только d1-> d4 и так далее, и так далее, пока не будет пролистан весь временной ряд.

Следующим шагом является применение функции waveslim::brick.wall к выводу списков скользящего окна. Функция brick.wall просматривает выходные данные modwt для первого окна на 4 уровнях и заменяет некоторые значения на NAs.

Думаю, я решил это, изменив @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])

Я хочу расширить это и вычислить полную матрицу корреляции для моих трех временных рядов. Обратите внимание, что в приведенном выше примере с обменными курсами не используется подход скользящего окна, поскольку он использует всю длину временного ряда, который я хотел бы сейчас сделать, а также дает одно значение для корреляции между двумя временными рядами. Он не создает полную матрицу корреляции, которая мне нужна, поскольку меня интересуют собственные значения этих матриц корреляции с течением времени.

Итак, в итоге:

  1. Возьмите 3 временных ряда
  2. Применить функцию modwt с помощью скользящего окна
  3. Примените функцию brick.wall к каждому выходу скользящего окна в 2 выше
  4. Создайте полную матрицу корреляции 3x3 для 4 уровней, используя выходные данные 3 выше, с течением времени.

person TheGoat    schedule 14.08.2017    source источник
comment
Я не понимаю, у вас почти все есть, и нужно просто применить / изменить wave.correlation для трех временных рядов?   -  person pogibas    schedule 18.08.2017
comment
@PoGibas не все так просто, ну по крайней мере, в моей голове. Да, у меня есть часть 1 и 2, и мне нужно создать 3-ю, но я не сильный программист и мне сложно работать со списками, у меня нет любой опыт работы с ними. Если у вас есть какие-либо предложения, я был бы рад их услышать.   -  person TheGoat    schedule 18.08.2017


Ответы (1)


Собираем части, которые вы даете в своем вопросе:

1) Создайте 3 временных ряда

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

2) & 3) Применить 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))))

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 - это список из 171 списка из 4 матриц корреляций.

Например, 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 все матрицы корреляции заполнены пропущенными значениями.

person Scarabee    schedule 18.08.2017
comment
Большое вам спасибо за это, это огромная помощь. И последнее, что у меня есть, - как я могу использовать функцию apply и собственную функцию для вычисления собственных значений для каждого из уровней, то есть d1- ›d4? - person TheGoat; 18.08.2017