2012-04-29 21 views
11

我有2個時間序列,我使用ccf找到它們之間的互相關。 ccf(ts1, ts2)列出了所有時滯的交叉相關。如何在不手動查看數據的情況下找到導致最大相關性的滯後?發現互相關最大的滯後ccf()

+0

好的在這裏找到了答案http://r.789695.n4.nabble.com/ccf-function-td2288257.html – tan 2012-04-29 02:17:36

+3

爲什麼不把它作爲答案,並從R幫助郵件列表中扣除海報? – 2012-04-29 06:49:36

+0

是的我會這樣做,但我沒有足夠的聲望點來回答我自己的問題。 – tan 2012-04-29 16:12:07

回答

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 2014-09-30 07:58:42

10

我想我會重做上述功能,但它已經發現,返回原來的相關性(正或負)的絕對最大相關性。我也超出了(幾乎)滯後的數量。

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

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 2014-10-01 19:34:45

+1

這是一個三維數組,正如cor解釋的那樣。 – nvogen 2014-10-02 20:39:20

1

我已經在功能和輸出(x)的對應於索引的字符向量中的值修改了原有的溶液爲好,以環功能中的一部分,因爲它不必要的慢。遍歷在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相同。