2012-04-29 9 views
11

Mam 2 szeregi czasowe i używam ccf, aby znaleźć korelację krzyżową między nimi. ccf(ts1, ts2) zawiera listę korelacji krzyżowych dla wszystkich opóźnień czasowych. Jak mogę znaleźć opóźnienie, które powoduje maksymalną korelację bez ręcznego przeglądania danych?Znalezienie opóźnienia, w którym korelacja krzyżowa jest maksymalna ccf()

+0

Ok znalazłem odpowiedź tutaj http://r.789695.n4.nabble.com/ccf-function-td2288257.html – tan

+3

Dlaczego nie umieszczasz tego jako odpowiedzi i nie uznawaj plakatów z listy mailingowej pomocy R ? –

+0

Tak, zrobiłbym tak, ale nie mam wystarczającej liczby punktów reputacji, aby odpowiedzieć na moje własne pytanie. – tan

Odpowiedz

18

zamieszczaniu odpowiedź 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

Dlaczego dwa przecinki są używane w cor = c $ acf [,, 1] i opóźnieniu? – Anusha

10

pomyślałem, że powtórzyć powyższą funkcję ale to znaleźć absolutny max korelację, która zwraca oryginalny korelację (dodatnią lub ujemną). Wyzerowałem też (prawie) liczbę opóźnień.

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

Czy możesz powiedzieć, dlaczego dwa przecinki są używane podczas wyodrębniania acf d $ acf [,, 1]? Dzięki. – Anusha

+1

Jest to trójwymiarowa tablica, jak wyjaśnia Cor. – nvogen

1

I został zmodyfikowany pierwotny roztwór, a także, w celu pętli na wyjściu funkcji i wartości odpowiadające wektora postaci indeksów (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)) 
} 

I usunąć data.frame część w ramach funkcji, ponieważ jest niepotrzebnie powolna. Pętli na każdej kolumnie w data.frame i zwraca wynik do nowego data.frame, używać tej metody:

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

Ponieważ 3 jest większy niż 4, to również miał uderzają w modyfikacji tej funkcji, tym razem poprzez wprowadzenie pomysł z 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) 
} 

zasadniczo „error” termin jest dodana, tak, że jeśli istnieje kilka wartości bliskie maksimum, wszyscy się wrócił, np:

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 

Jeśli żadna wartość dla e nie jest podana, przyjmuje się, że jest równa zero, a funkcja zachowuje się tak samo, jak ta, którą opublikowano nvogen.

Powiązane problemy