Time series forecasting: double exponential smoothing

Jump to navigationJump to search

The data is from the file zurich.txt from http://statistik.mathematik.uni-wuerzburg.de/timeseries/index.php.

The dashed curve are the observed values. The blue curve are the predicted values and it is computed by the following rules:

Initial values:

$S_0 = y_0$
$b_0 = y_1-y_0$

Then, the values are iteratively computed by

$S_t = \alpha\cdot y_t + (1-\alpha)\cdot(S_{t-1} + b_{t-1})$
$b_t = \gamma\cdot(S_t - S_{t-1}) + (1-\gamma)\cdot b_{t-1}$

Here, the time series $y$ is stored in the array data.

The JavaScript code

    var data, datax, i, brd;

//
// zurich.txt from http://statistik.mathematik.uni-wuerzburg.de/timeseries/index.php
//
// global array data
data = "406.60 428.50 ... 521.80 524.40 526.80";
data = data.split(' ');
datax = [];
for (i = 0; i < data.length; i++)  {
data[i] = parseFloat(data[i]);
datax[i] = i;
}

brd = JXG.JSXGraph.initBoard('jxgbox', {boundingbox:[-2, 550, data.length+2, 380], grid: false});
brd.create('axis',[[0,0],[0,1]]);
brd.create('axis',[[0,400],[1,400]]);

brd.create('curve',[datax,data],{strokeColor:'gray',dash:2});                    // plot the observed data

alpha = brd.create('slider', [[10,520],[100,520],[0,0.1,1.0]],{name:'&alpha;'});
gamma = brd.create('slider', [[10,510],[100,510],[0,0.1,1.0]],{name:'&gamma;'});

estimate = brd.create('curve',[[0],[0]]);                                        // The filtered curve

estimate.updateDataArray = function() {
var t,
alphalocal = alpha.Value(),  // Read the slider value of alpha
gammalocal = gamma.Value(),  // Read the slider value of gamma
S = data[0],                 // Set the inital values for S and b
b = data[1]-data[0],
Snew;

this.dataX[0] = 0;
this.dataY[0] = S;
for (t=1; t<data.length; t++) {
Snew = alphalocal*data[t] + (1-alphalocal)*(S + b);
b    = gammalocal*(Snew - S) + (1-gammalocal)*b;
this.dataX[t] = t;
this.dataY[t] = Snew;
S = Snew;
}
}
brd.update(); // first computation of the filtered curve.