2012-04-29 3 views
11

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

+0

Хорошо нашел ответ здесь http://r.789695.n4.nabble.com/ccf-function-td2288257.html – tan

+3

Почему вы не ставите это как ответ и не кредитуете плакаты из списка рассылки помощи R ? –

+0

Да, я бы сделал это, но у меня недостаточно очков репутации, чтобы ответить на мой собственный вопрос. – tan

ответ

18

Проводка ответ 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) 
} 
+1

Почему два запятых используются в cor = c $ acf [,, 1] и лагом? – Anusha

10

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

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) 
} 
+0

Можете ли вы сказать, почему две запятые используются при извлечении acf d $ acf [,, 1]? Благодарю. – Anusha

+1

Это трехмерный массив, который объясняет. – nvogen

1

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

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') 
2

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

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.