2014-10-08 3 views
3

У меня есть несколько временных рядов длины 149, и я хотел бы их смягчить, используя вейвлет-преобразования.Длина данных не равна двум/Размер выборки не делится на 2^J (вейвлет-анализ)

Это пример моих данных:

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^х, но я не могу решить эту проблему. Я думал, что функция up.sample() в wavelim должна была помочь с этим, но это не сделало трюк (например, up.sample(t,2^8) дает вектор длиной 38144). Итак, как увеличить длину вектора без вставки ошибки? Я знаю, что могу наложить ноль, но я хочу знать, как это сделать.

Кроме того, при взгляде на примере waveslim, это выглядит, как если бы длина Imput серии не выполняет это требование, либо (хотя пример конечно делает работу):

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

Я чувствую как будто я пропустил что-то основное, но я не могу понять это. Спасибо за любую помощь.

Ps: Я знаю, что могу использовать другие методы для этого, но я действительно хочу проверить этот подход.

+0

Я не знаком с R, но есть функция в MATLAB 'nextpow2', которая может использоваться как' 2^nextpow2 (149) = 256' и даст вам номер, который вам нужен. – Rashid

ответ

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)) 

должен сделать трюк.

+0

Спасибо, что отвечает на часть вопроса. Но каков эффект нуля? (есть ли лучший способ для этого?). Было бы лучше использовать непрерывное вейвлет-преобразование? Или это было бы принципиально иначе? – Wave

+0

Ну, я вовсе не специалист в вейвлет-преобразованиях, но вы можете попытаться добавить кучу нулей в временные ряды нужного размера (т. Е. Вы создаете таймеры с 'length = 16 * k', а затем добавляете размер sime 0 # s и посмотреть, как разные результаты. Просто пища для мыслей. – thothal