我有多个长度为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:我知道我可以使用其他技术来做到这一点,但我真的想测试这种方法。
答案 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))
应该这样做。