# Successive Differences of a Randomly-Generated Timeseries

November 25, 2012
By

(This article was first published on Life in Code, and kindly contributed to R-bloggers)

I was wondering about the null distribution of successive differences of random sequences, and decided to do some numerical experiments. I quickly realized that successive differences equates to taking successively higher-order numerical derivatives, which functions as a high-pass filter. So, the null distribution really depends on the spectrum of the original timeseries.

Here, I've only played with random sequences, which are equivalent to white noise. Using the wonderful animation package, I created a movie that shows the timeseries resulting from differencing, along with their associated power spectra. You can see that, by the end, almost all of the power is concentrated in the highest frequencies. The code required to reproduce this video is shown below.

Note -- For optimum viewing, switch the player quality to high.
require(animation)
## large canvas, write output to this directory, 1 second per frame
ani.options(ani.width=1280, ani.height=720, loop=F, title='Successive differences of white noise', outdir='.', interval=1)
require(plyr)
require(xts)
## How many realizations to plot?
N=5
## random numbers
aa = sapply(1:26, function(x) rnorm(1e2));
colnames(aa) = LETTERS;

saveVideo( {
## for successive differences, do...
for (ii in 1:50) {
## first make the differences and normalize
aa1 = apply(aa, 2, function(x) {
ret=diff(x, differences=ii);ret=ret/max(ret)
});
## Turn into timeseries object for easy plotting
aa1 = xts(aa1, as.Date(1:nrow(aa1)));

## next, compute spectrum
aa2 = alply(aa1, 2, function(x) {
## of each column, don't modify original data
ret=spectrum(x, taper=0, fast=F, detrend=F, plot=F);
## turn into timeseries object
ret= zoo(ret$spec, ret$freq)});
## combine into timeseries matrix
aa2 = do.call(cbind, aa2 );
colnames(aa2) = LETTERS;

## plot of timeseries differences
## manually set limits so plot area is exactly the same between successive figures
myplot = xyplot(aa1[,1:N], layout=c(N,1),
xlab=sprintf('Difference order = %d', ii),
ylab='Normalized Difference',
ylim=c(-1.5, 1.5),
scales=list(alternating=F, x=list(rot=90), y=list(relation='same')));

## plot of spectrum
myplot1 = xyplot(aa2[,1:N], layout=c(N,1),
ylim=c(-0.01, 5), xlim=c(0.1, 0.51),
xlab='Frequency', ylab='Spectral Density',
type=c('h','l'),
scales=list(y=list(relation='same'), alternating=F));
## write them to canvas
plot(myplot, split=c(1,1,1,2), more=T);
plot(myplot1, split=c(1,2,1,2), more=F);
## provide feedback of process
print(ii)}

## controls for ffmpeg
}, other.opts = "-b 5000k -bt 5000k")