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]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to