R 数据长度不是2的幂/样本大小不能被2^J整除(小波分析)
我有多个长度为149的时间序列,我想用小波变换去噪 以下是我的数据示例:R 数据长度不是2的幂/样本大小不能被2^J整除(小波分析),r,time-series,wavelet,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) : S
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示例时,似乎输入序列的长度也不满足此要求(尽管该示例当然有效):
数据(ibm)
ibm.returns我研究了dwt
的代码,它之所以有效,是因为dwt
不检查长度是否是2的幂,而是检查长度是否是2^J的倍数(实际上错误消息是这样说的:dwt(t)中的错误):样本大小不能被2^J整除
如果J=4
,则时间序列的长度必须是16的倍数。当您正在测量时,up.sample
可以用来克服这个问题,因为它用0填充时间序列。但你不提供最后的长度,而是上采样的频率
因此
应该可以了。谢谢,这回答了部分问题。但是零的影响是什么呢?(有没有更好的方法/其他方法?)。使用连续小波变换会更好吗?或者这会有根本性的不同吗?我对小波变换一点也不在行,但你可以试着给一个大小合适的时间序列加上一串零(也就是说,您创建一个长度为16*k的时间序列,然后将sime量0#s添加到该序列中,看看结果如何不同。这只是一些想法。我不熟悉R,但MATLAB中有一个函数nextpow2
,可以像2^nextpow2(149)一样使用)=256
并将提供您所需的号码。
data(ibm)
ibm.returns <- diff(log(ibm))
ibmr.haar <- dwt(ibm.returns, "haar") #works
log2(length(ibm.returns))
[1] 8.523562
dwt(up.sample(t, 16, 0))