bruno Piguet
2009-Jul-03 17:24 UTC
[R] A fast version of ccf () accepting missing values ?
Dear R-Helpers,
I need to compute cross-correlation on two signals wich may contain
missing values.
One cannot pass "Na.action=na.pass" to the ccf() function.
So, I wrote a naive function of my own (see below).
Unsurprisingly, this function is not very fast.
Do you think that it is possible to do better, or should I accept my fate
?
Bruno.
my_ccf <- function (X, Y, lag.before = NULL, lag.after = NULL) {
l_X <- length(X)
l_Y <- length(Y)
if (l_Y != l_X) {
cat ("X and Y should have same size !")
return
}
if (is.null(lag.before)) {
lag.before <- l_X / 10
#should do 10*log10(N/m)
}
if (is.null(lag.after)) {
lag.after <- l_X / 10
# idem lag.before.
}
res <- list()
res$cor <- rep(0.0, 1 + lag.before + lag.after)
sub_X <- X[ 1 + lag.before : (l_X - lag.after)]
res$delay <- seq(-lag.before, lag.after)
for (i in res$delay) {
sub_Y <- Y[(lag.before+i+1) : (l_X-lag.after+i+1)]
OK <- !(is.na(sub_X) | is.na(sub_Y))
x_select <- sub_X[OK]
y_select <- sub_Y[OK]
res$cor[i+lag.before+1] <- cor (x_select, y_select)
}
return (res)
}
[[alternative HTML version deleted]]
