2012-04-29 10 views
11

Ich habe 2 Zeitreihen und ich verwende ccf, um die Kreuzkorrelation zwischen ihnen zu finden. ccf(ts1, ts2) listet die Kreuzkorrelationen für alle Zeitverzögerungen auf. Wie kann ich die Verzögerung finden, die zu maximaler Korrelation führt, ohne die Daten manuell zu betrachten?Finden Lag, bei der Kreuzkorrelation ist maximal ccf()

+0

Ok die Antwort gefunden hier http://r.789695.n4.nabble.com/ccf-function-td2288257.html – tan

+3

Warum Sie das nicht als eine Antwort und kreditieren Sie die Plakate von der R-Hilfe-Mailing-Liste ? –

+0

Ja, hätte ich getan, aber ich habe nicht genug Reputationspunkte, um meine eigene Frage zu beantworten. – tan

Antwort

18

die Antwort der Veröffentlichung 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

Warum werden zwei Kommata in cor = c $ acf [,, 1] und Lag verwendet? – Anusha

10

Ich dachte, ich die obige Funktion wiederholen würde, aber haben sie die absolute maximale Korrelation finden, die die ursprüngliche Korrelation (positiv oder negativ) zurückgibt. Ich habe auch (fast) die Anzahl der Verzögerungen herausgefahren.

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

Können Sie sagen, warum zwei Kommas beim Extrahieren von acf d $ acf [,, 1] verwendet werden? Vielen Dank. – Anusha

+1

Es ist ein dreidimensionales Array wie? Cor erklärt. – nvogen

1

Ich habe die Originallösung als auch modifiziert, um die Schleife über die Funktion und geben die Werte in einen Zeichenvektor von Indizes entsprechend (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 entfernt, um die data.frame Teil in der Funktion, wie es unnötig langsam ist. Um Schleife über jeden Spalt in einem data.frame und gibt die Ergebnisse auf eine neues data.frame, verwende ich diese Methode:

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

Da 3 mehr als 4 ist, ich hatte auch einen Stich an diese Funktion zu modifizieren, diesmal durch die Umsetzung eine Idee von 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) 
} 

im Wesentlichen wird ein „Fehler“ Begriff hinzugefügt, so dass, wenn es mehrere Werte nahe am Maximum sind, sie alle zurück zu bekommen, zum Beispiel:

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 

Wenn kein Wert für e angegeben wird, wird dies als null angenommen, und die Funktion verhält sich genau wie die angegebene nvogen.