数据长度不是2的幂/样本大小不能被2 ^ J整除(小波分析)

时间:2014-10-08 07:37:53

标签: r time-series wavelet

我有多个长度为149的时间序列,我想通过使用小波变换对它们进行去噪。

这是我的数据示例:

t=ts(rnorm(149,5000,1000),start=1065,end=1213) 

当我尝试使用wavetresh和waveslim包时,他们都指出了同样的问题:

library(wavetresh)
wd(t)
  Error in wd(t) : Data length is not power of two
library(waveslim)
dwt(t)
  Error in dwt(t) : Sample size is not divisible by 2^J

据我所知,我的数据长度应该是2 ^ x,但我无法解决这个问题。我认为wavelim中的函数up.sample()应该有助于此,但它没有做到这一点(例如up.sample(t,2^8)给出一个长度为38144的向量)。那么如何在不插入错误的情况下增加矢量长度呢?我知道我可以用零填充,但是我想知道最好的方法。

此外,在查看wavelim的示例时,看起来输入系列的长度也不符合此要求(尽管当然示例有效):

data(ibm)     
ibm.returns <- diff(log(ibm))
ibmr.haar <- dwt(ibm.returns, "haar")  #works
log2(length(ibm.returns))
  [1] 8.523562

我觉得我错过了一些基本的东西,但我无法理解。 谢谢你的帮助。

Ps:我知道我可以使用其他技术来做到这一点,但我真的想测试这种方法。

1 个答案:

答案 0 :(得分:3)

我查看了dwt的代码及其工作原因,dwt不会检查长度是否为 2的强弱,但是否长度为2 ^ J的倍数(实际上这就是错误消息所说的内容:Error in dwt(t) : Sample size is not divisible by 2^J)。

使用J=4时,你的时间序列的长度必须是16的倍数。正如你所知,up.sample可以用来克服这个问题,因为它用0填充时间序列。但是你没有提供最终长度,而是上采样的频率

因此

dwt(up.sample(t, 16, 0))

应该这样做。