Computing a moving average

Dennis Alders picture Dennis Alders · Sep 23, 2014 · Viewed 20.6k times · Source

I need to compute a moving average over a data series, within a for loop. I have to get the moving average over N=9 days. The array I'm computing in is 4 series of 365 values (M), which itself are mean values of another set of data. I want to plot the mean values of my data with the moving average in one plot.

I googled a bit about moving averages and the "conv" command and found something which i tried implementing in my code.:

hold on
for ii=1:4;
    M=mean(C{ii},2)
    wts = [1/24;repmat(1/12,11,1);1/24];
    Ms=conv(M,wts,'valid')
    plot(M)
    plot(Ms,'r')

end
hold off

So basically, I compute my mean and plot it with a (wrong) moving average. I picked the "wts" value right off the mathworks site, so that is incorrect. (source: http://www.mathworks.nl/help/econ/moving-average-trend-estimation.html) My problem though, is that I do not understand what this "wts" is. Could anyone explain? If it has something to do with the weights of the values: that is invalid in this case. All values are weighted the same.

And if I am doing this entirely wrong, could I get some help with it?

My sincerest thanks.

Answer

thewaywewalk picture thewaywewalk · Sep 24, 2014

There are two more alternatives:

1) filter

From the doc:

You can use filter to find a running average without using a for loop. This example finds the running average of a 16-element vector, using a window size of 5.

data = [1:0.2:4]'; %'
windowSize = 5;
filter(ones(1,windowSize)/windowSize,1,data)

2) smooth as part of the Curve Fitting Toolbox (which is available in most cases)

From the doc:

yy = smooth(y) smooths the data in the column vector y using a moving average filter. Results are returned in the column vector yy. The default span for the moving average is 5.

%// Create noisy data with outliers:

x = 15*rand(150,1); 
y = sin(x) + 0.5*(rand(size(x))-0.5);
y(ceil(length(x)*rand(2,1))) = 3;

%//  Smooth the data using the loess and rloess methods with a span of 10%:

yy1 = smooth(x,y,0.1,'loess');
yy2 = smooth(x,y,0.1,'rloess');