How to work out if there is a cyclic element to data
7 views (last 30 days)
Show older comments
I have a set of time series. I suspect that some of them tend to mean revert more than others. When I feed the time series through a digital bandpass filter I often find that I can visually deduce a dominant cycle however that doesn't usually last long.
Using my approach of digital bandpass filters I still find it hard to work out if this is mean reversion or not. For example if we consider the null hypothesis that this is just white noise then even feeding white noise through a digital bandpass filter will still produce a cyclic output from the filter.
I have used an Augmented Dickey Fuller test to assess stationary/cointegration however is there a similar test to determine if cyclic components really exist in the time series or am I just seeing noise?
Any thoughts?
0 Comments
Answers (2)
Wayne King
on 19 Dec 2011
Hi Stewart, Is this data stationary? If so you can use a nonparametric spectral estimator to test the hypothesis that there are line components (oscillations) in the data.
Dr. Seis
on 19 Dec 2011
As a rough start, you can try correlating the time series with sections of itself. For example:
% User defined inforation
length_rand = 180; % Repeat signal every 180 samples
length_signal = 750; % Entire signal will be 750 samples
noise_amp = 0.3; % Noise is 30% of signal
subset_size = 0.25; % Subset size will be 45% length of entire signal
% Generate synthetic cyclic signal w/ noise and its subset
temp_rand = randn(length_rand,1);
temp_signal = zeros(length_signal,1);
for i = 1 : floor(length_signal/length_rand)
temp_signal(1+(i-1)*length_rand:(i)*length_rand) = temp_rand+noise_amp*randn(length_rand,1);
end
temp_signal(1+i*length_rand:end) = temp_rand(1:length(temp_signal(1+i*length_rand:end)));
true_signal = temp_signal; % Entire signal
temp_signal(subset_size*length_signal:end) = 0; % Subset of entire signal
% Plot info
figure;
subplot(2,1,1);
plot(true_signal,'LineWidth',3); hold on;
plot(temp_signal,'r-'); hold off;
legend('true signal','temp signal');
title('Signal with subset used for correlation');
a = xcorr(temp_signal,true_signal);
xlim([0 length_signal]);
subplot(2,1,2);
plot(a);
title('Result from xcorr');
xlim([0 length_signal]);
This will produce something that looks like this:

The location of the peaks does NOT mark the end/beginning of the cyclic signal. However, the strength and distance between peaks should be similar if there is a cyclic signal.
See Also
Categories
Find more on Get Started with Signal Processing Toolbox in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!