【问题标题】:Data length is not power of two / Sample size is not divisible by 2^J (wavelet analysis)数据长度不是 2 的幂/样本大小不能被 2^J 整除(小波分析)
【发布时间】:2014-10-08 07:37:52
【问题描述】:

我有多个长度为 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,但我无法克服这个问题。我认为 Waveslim 中的函数 up.sample() 应该对此有所帮助,但它并没有起到作用(例如,up.sample(t,2^8) 给出了一个长度为 38144 的向量)。那么如何在不插入错误的情况下增加向量长度呢?我知道我可以用零填充,...但我想知道最好的方法。

此外,在查看waveslim 的示例时,看起来好像 imput serie 的长度也不满足此要求(尽管该示例当然有效):

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

我觉得我缺少一些基本的东西,但我想不通。 感谢您的帮助。

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

【问题讨论】:

  • 我不熟悉R,但是MATLAB中有一个函数nextpow2,可以像2^nextpow2(149)=256一样使用,并且会给你你需要的数字。

标签: r time-series wavelet


【解决方案1】:

我查看了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))

应该可以解决问题。

【讨论】:

  • 谢谢,这回答了部分问题。但是零的影响是什么? (有没有更好的/其他方法来做到这一点?)。使用连续小波变换会更好吗?或者这会根本不同?
  • 好吧,我根本不是小波变换方面的专家,但是您可以尝试将一堆零添加到正确大小的时间序列中(即您使用 length = 16 * k 创建一个时间序列然后在其中添加相同数量的 0#s,看看结果有何不同。只是一些思考的食物。
猜你喜欢
  • 1970-01-01
  • 2018-01-27
  • 2012-03-19
  • 2015-11-25
  • 2014-01-17
相关资源
最近更新 更多