Ho 2 serie temporali e sto utilizzando ccf
per trovare la correlazione incrociata tra di esse. ccf(ts1, ts2)
elenca le correlazioni incrociate per tutti i ritardi temporali. Come posso trovare il ritardo che risulta nella massima correlazione senza guardare manualmente i dati?Individuazione del ritardo con cui la correlazione incrociata è massimo ccf()
risposta
Distacco la risposta 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)
}
Perché due virgole sono usate in cor = c $ acf [,, 1] e lag? – Anusha
ho pensato di rifare la funzione di cui sopra, ma averlo trovare la correlazione massima assoluta che restituisce la correlazione originale (positiva o negativa). Ho anche superato (quasi) il numero di ritardi.
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)
}
Ho modificato la soluzione originale che, al fine di eseguire un loop funzione ed emettere i valori corrispondenti ad un carattere vettore di indici (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))
}
ho rimosso il data.frame
parte all'interno della funzione, poiché è inutilmente lento. Per un ciclo su ciascuna colonna in una data.frame
e restituire i risultati in un data.frame
, uso questo metodo:
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')
Poiché 3 è superiore a 4, avevo anche una stab a modificare questa funzione, questa volta implementando un'idea da 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)
}
Essenzialmente si aggiunge un termine "errore", in modo che se ci sono diversi valori prossimi al massimo, tutti vengono restituiti, ad esempio:
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
Se non viene fornito alcun valore per e
, viene considerato pari a zero e la funzione si comporta come quella nvogen inviata.
Ok trovato la risposta qui http://r.789695.n4.nabble.com/ccf-function-td2288257.html – tan
Perché non lo metti come risposta e accrediti i poster dalla mailing list di aiuto R ? –
sì, l'avrei fatto, ma non ho abbastanza punti reputazione per rispondere alla mia domanda. – tan