У меня есть 2 временных ряда, и я использую ccf
, чтобы найти взаимную корреляцию между ними. ccf(ts1, ts2)
перечисляет взаимные корреляции для всех временных лагов. Как я могу найти отставание, которое приводит к максимальной корреляции, не просматривая данные вручную?
Нахождение лага, при котором взаимная корреляция максимальна ccf ()
- Хорошо, нашел здесь ответ r.789695.n4.nabble.com/ccf -function-td2288257.html 29.04.2012
- Почему бы вам не изложить это как ответ и не упомянуть плакаты из списка рассылки R help? 29.04.2012
- да, я бы так и поступил, но у меня недостаточно очков репутации, чтобы ответить на свой вопрос. 29.04.2012
- Вернитесь к вопросу, когда будете. :) 30.04.2012
- @tan Вы также можете отметить свой ответ как правильный. И, помимо ссылки, я лично считаю, что было бы неплохо резюмировать ответ, чтобы сэкономить Stackoverflowers лишним щелчком. (Я отредактировал ваш ответ, чтобы показать, что я имею в виду; не обижайтесь, если вы хотите отредактировать его обратно :-) 08.08.2012
Ответы:
Размещение ответа http://r.789695.n4.nabble.com/ccf-function-td2288257.html
Find_Max_CCF<- function(a,b)
{
d <- ccf(a, b, plot = FALSE)
cor = d$acf[,,1]
lag = d$lag[,,1]
res = data.frame(cor,lag)
res_max = res[which.max(res$cor),]
return(res_max)
}
Я подумал, что повторю указанную выше функцию, но пусть она найдет абсолютную максимальную корреляцию, которая возвращает исходную корреляцию (положительную или отрицательную). Я также увеличил (почти) до максимума количество лагов.
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 больше, чем 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.
Я также изменил исходное решение, чтобы перебрать функцию и вывести значения, соответствующие вектору символов индексов (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')