Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 数据长度不是2的幂/样本大小不能被2^J整除(小波分析)_R_Time Series_Wavelet - Fatal编程技术网

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

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

我有多个长度为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示例时,似乎输入序列的长度也不满足此要求(尽管该示例当然有效):

数据(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))