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()
Antwort
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)
}
Warum werden zwei Kommata in cor = c $ acf [,, 1] und Lag verwendet? – Anusha
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)
}
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')
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.
Ok die Antwort gefunden hier http://r.789695.n4.nabble.com/ccf-function-td2288257.html – tan
Warum Sie das nicht als eine Antwort und kreditieren Sie die Plakate von der R-Hilfe-Mailing-Liste ? –
Ja, hätte ich getan, aber ich habe nicht genug Reputationspunkte, um meine eigene Frage zu beantworten. – tan