Wavemulcor包 - wave.multiple.cross.correlation函数 - 替换长度为零

时间:2017-07-19 22:04:59

标签: r time-series cross-correlation wavelet-transform

我想使用wavemulcor软件包,特别是wave.multiple.cross.correlation函数来对我的数据执行小波多重交叉相关。

我按照包装手册跟踪了这个例子,但是使用了我的数据。该函数与示例数据一起使用,但在我尝试使用时会抛出错误。错误是指"替换的长度为零"但我不确定这是什么意思。

我已经用Google搜索了错误,但是对于不同的函数存在许多相同问题的示例,并且通常它们都与代码中的循环有关。

然后我用Google搜索了如何解决问题并阅读有关调试的内容。我尝试调试代码,但我无法弄清楚它在哪里发生故障,我仍处于学习编码的早期阶段。我认为可能是wave.multiple.cross.correlation函数中的这段代码导致了这个问题:

xy.cor.vec <- matrix(unlist(xy.cor), l, dd)
    xy.mulcor <- matrix(0, l, 2 * lm + 1)
    YmaxR <- vector("numeric", l)
    for (i in 1:l) {
        r <- xy.cor.vec[i, ]
        P <- diag(d)/2
        P[lower.tri(P)] <- r
        P <- P + t(P)
        Pidiag <- diag(solve(P))
        if (is.null(ymaxr)) {
            YmaxR[i] <- Pimax <- which.max(Pidiag)
        }

还有其他方法可以确定为什么这不起作用吗?

实际错误如下:

> Lst <- wave.multiple.cross.correlation(xx, lag.max = NULL, ymaxr = NULL)
Error in YmaxR[i] <- Pimax <- which.max(Pidiag) : 
  replacement has length zero

我试图跟踪原始代码中的所有变量,但我无法弄清楚。

这是我尝试使用的代码,为了完整起见,here是指向xx的dput()的链接,xx是我想要使用的变量列表,请参阅下面的代码了解详细信息。 XX

library(wavemulcor)
library(readxl)

rm(list = ls()) # clear objects
graphics.off() # close graphics windows

RNC20_30Hourly <- read_excel(RNC20_30Hourly.xlsx")

RNC20_30Hourly <- RNC20_30Hourly[-1]

RNC20_30TS <- ts(RNC20_30Hourly, start = 1, frequency = 23)

wf <- "d4"
J <- 6
lmax <- 36

n <- nrow(RNC20_30TS)

CK0158U09A3.modwt <- modwt(RNC20_30TS[,"CK0158U09A3"], wf, J)
CK0158U09A3.modwt.bw <- brick.wall(CK0158U09A3.modwt, wf)

CK0158U21A1.modwt <- modwt(RNC20_30TS[,"CK0158U21A1"], wf, J)
CK0158U21A1.modwt.bw <- brick.wall(CK0158U21A1.modwt, wf)

CK0158U21A2.modwt <- modwt(RNC20_30TS[,"CK0158U21A2"], wf, J)
CK0158U21A2.modwt.bw <- brick.wall(CK0158U21A2.modwt, wf)

CK0158U21A3.modwt <- modwt(RNC20_30TS[,"CK0158U21A3"], wf, J)
CK0158U21A3.modwt.bw <- brick.wall(CK0158U21A3.modwt, wf)

xx <- list(CK0158U09A3.modwt.bw, 
           CK0158U21A1.modwt.bw, 
           CK0158U21A2.modwt.bw,
           CK0158U21A3.modwt.bw)

Lst <- wave.multiple.cross.correlation(xx, lag.max = 13, ymaxr = NULL)

CK0158.RTWP.cross.cor <- as.matrix(Lst$xy.mulcor[1:J,])
YmaxR <- Lst$YmaxR

cell.names <- c("CK0158U09A3", "CK0158U21A1", "CK0158U21A2", "CK0158U21A3")
rownames(CK0158.RTWP.cross.cor)<-rownames(CK0158.RTWP.cross.cor,
                                          do.NULL = FALSE, prefix = "Level ")
lags <- length(-lmax:lmax)

lower.ci <- tanh(atanh(CK0158.RTWP.cross.cor) - qnorm(0.975) /
                   sqrt(matrix(trunc(n/2^(1:J)), nrow=J, ncol=lags)- 3))
upper.ci <- tanh(atanh(CK0158.RTWP.cross.cor) + qnorm(0.975) /
                   sqrt(matrix(trunc(n/2^(1:J)), nrow=J, ncol=lags)- 3))

par(mfrow=c(3,2), las=1, pty="m", mar=c(2,3,1,0)+.1, oma=c(1.2,1.2,0,0))
for(i in J:1) {
  matplot((1:(2*lmax+1)),CK0158.RTWP.cross.cor[i,], type="l", lty=1, ylim=c(-1,1),
          xaxt="n", xlab="", ylab="", main=rownames(CK0158.RTWP.cross.cor)[[i]][1])
  if(i<3) {axis(side=1, at=seq(1, 2*lmax+1, by=12),
                labels=seq(-lmax, lmax, by=12))}
  #axis(side=2, at=c(-.2, 0, .5, 1))
  lines(lower.ci[i,], lty=1, col=2) ##Add Connected Line Segments to a Plot
  lines(upper.ci[i,], lty=1, col=2)
  abline(h=0,v=lmax+1) ##Add Straight horiz and vert Lines to a Plot
  text(1,1, labels=cell.names[YmaxR[i]], adj=0.25, cex=.8)
}
par(las=0)
mtext('Lag (hours)', side=1, outer=TRUE, adj=0.5)
mtext('Wavelet Multiple Cross-Correlation', side=2, outer=TRUE, adj=0.5)

非常感谢您解决/解决此问题的任何帮助。

2 个答案:

答案 0 :(得分:2)

用细齿梳检查了代码后,我发现了代码中的错误。根据手册,用法如下:

wave.multiple.cross.correlation(xx, lag.max = NULL, ymaxr = NULL)

但是在提供的示例中,作者使用了一个名为lmax的不同变量来指定要使用的滞后。

Lst <- wave.multiple.cross.correlation(xx, lmax)

从上面的例子可以看出,我为滞后指定了两个不同的参数,lmax = 36和lag.max = 13

啊,这只是我的100个声誉!

答案 1 :(得分:1)

考虑到时间序列的长度,似乎将最大小波水平J设置得太高(代码的第14行):

14 J < - 6

尝试使用J&lt; - 4并运行

Lst&lt; - wave.multiple.cross.correlation.prueba(xx,lag.max = lmax,ymaxr = NULL)

其中lmax是您之前设置为36的最大滞后(或您选择的任何其他合理值)。

一般来说,最大小波水平的推荐值是J = trunc(log2(T)) - 3(安全方面),T =时间序列的长度。

事实上,报告的错误是您的原始xx列表的结果,其中级别d6和s6填充有NaN。 请注意,这不是wavemulcor包的一部分,而是之前的小波变换计算 在进入你选择的wavemulcor包功能之前。

希望这有帮助。