Поиск запаздывания, при котором кросс-корреляция максимальна ccf()

У меня есть 2 временных ряда, и я использую ccf, чтобы найти взаимную корреляцию между ними. ccf(ts1, ts2) перечислены перекрестные корреляции для всех временных задержек. Как я могу найти задержку, которая приводит к максимальной корреляции без ручного поиска данных?

Ответ 2

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

Find_Abs_Max_CCF<- function(a,b)
{
 d <- ccf(a, b, plot = FALSE, lag.max = length(a)-5)
 cor = d$acf[,,1]
 abscor = abs(d$acf[,,1])
 lag = d$lag[,,1]
 res = data.frame(cor,lag)
 absres = data.frame(abscor,lag)
 absres_max = res[which.max(absres$abscor),]
 return(absres_max)
}

Ответ 3

Поскольку 3 больше 4, у меня также был удар по модификации этой функции, на этот раз, реализовав идею здесь:

ccfmax <- function(a, b, e=0)
{
 d <- ccf(a, b, plot = FALSE, lag.max = length(a)/2)
 cor = d$acf[,,1]
 abscor = abs(d$acf[,,1])
 lag = d$lag[,,1]
 res = data.frame(cor, lag)
 absres = data.frame(abscor, lag)
 maxcor = max(absres$abscor)
 absres_max = res[which(absres$abscor >= maxcor-maxcor*e &
                        absres$abscor <= maxcor+maxcor*e),]
 return(absres_max)
}

По существу добавляется термин "ошибка", поэтому, если существует несколько значений, близких к максимуму, все они возвращаются, например:

ayy <- jitter(cos((1:360)/5), 100)
bee <- jitter(sin((1:360)/5), 100)

ccfmax(ayy, bee, 0.02)
           cor lag
348  0.9778319  -8
349  0.9670333  -7
363 -0.9650827   7
364 -0.9763180   8

Если значение e не задано, оно принимается равным нулю, а функция ведет себя точно так же, как опубликован nvogen.

Ответ 4

Я также модифицировал исходное решение, чтобы перебрать функцию и вывести значения, соответствующие символьному вектору индексов (x):

abs.max.ccf <- function(x,a,b) {
  d <- ccf(a, b, plot=FALSE, lag.max=length(a)-5)
  cor <- d$acf[,,1]
  abscor <- abs(d$acf[,,1])
  lag <- d$lag[,,1]
  abs.cor.max <- abscor[which.max(abscor)]
  abs.cor.max.lag <- lag[which.max(abscor)]
  return(c(x, abs.cor.max, abs.cor.max.lag))
}

Я удалил часть data.frame внутри функции, так как она излишне медленна. Чтобы перебрать каждый столбец в data.frame и вернуть результаты в новый data.frame, я использую этот метод:

max.ccf <- lapply(colnames(df), function(x) unlist(abs.max.ccf(x, df$y, df[x])))
max.ccf <- data.frame(do.call(rbind, max.ccf))
colnames(max.ccf) <- c('Index','Cor','Lag')