The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Message from discussion moving average function

From:
To:
Cc:
Followup To:
Subject:
 Validation: For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon.

More options May 1 2012, 5:24 am
Newsgroups: comp.soft-sys.math.mathematica
From: Ray Koopman <koop...@sfu.ca>
Date: Tue, 1 May 2012 09:24:23 +0000 (UTC)
Local: Tues, May 1 2012 5:24 am
Subject: Re: moving average function
On Apr 30, 1:42 am, Robert McHugh <rtmphon...@gmail.com> wrote:

> Below is a moving average function that has the following features:
> 1. returns a list with the same length as the original length
> 2. provides a reasonable estimate for averages on the "sides" of the
> window.

> Have failed to figure out how to do this with ListConvolve and
> ListCorrelate, so I submit this with the hope that others can
> recommend how it might be improved. Also searched this website for
> alternatives but didn't find any that met the above criteria.

> I was motivated to do this in order to keep my code free of handling
> special cases related to the edges of the widow size.  Note that in
> one particular case, I have data measured every minute and would like
> to compare the results of using averaging the data over window sizes
> of 61, 121, and 181.

> Recommendations for how to improve the function or alternatives are
> appreciated.
> Bob.

> movingAverageBalanced[list_List, nAvg_Integer?OddQ ] :=
>  Module[{nHang, middle, left, right, all},
>   nHang = (nAvg - 1)/2;

>   middle = MovingAverage[list, nAvg];

>   left = Total[ Take[list, 2 # - 1]] /(2 # - 1) & /@ Range[nHang];
>   right =
>    Reverse[Total[ Take[list, -( 2 # - 1)]] /(2 # - 1) & /@
>      Range[nHang]];
>   all = Join[left, middle, right] ;
>   Return[all];
>   ]

> Example
> listTest = {a, b, c, d, e, f, g, h, i, j, k};
> r = movingAverageBalanced[listTest, 5];
> r // TableForm

> {
>  {a},
>  {1/3 (a + b + c)},
>  {1/5 (a + b + c + d + e)},
>  {1/5 (b + c + d + e + f)},
>  {1/5 (c + d + e + f + g)},
>  {1/5 (d + e + f + g + h)},
>  {1/5 (e + f + g + h + i)},
>  {1/5 (f + g + h + i + j)},
>  {1/5 (g + h + i + j + k)},
>  {1/3 (i + j + k)},
>  {k}

> }

bma[data_List, n_Integer] := bma[data, Table[1,{n}]]

bma[data_List, wts_List] :=
ListCorrelate[wts, data, {-1,1}, 0]/
ListCorrelate[wts, Table[1,{Length@data}], {-1,1}, 0]

bma[testList, 5]

a
(a + b)/2
(a + b + c)/3
(a + b + c + d)/4
(a + b + c + d + e)/5
(b + c + d + e + f)/5
(c + d + e + f + g)/5
(d + e + f + g + h)/5
(e + f + g + h + i)/5
(f + g + h + i + j)/5
(g + h + i + j + k)/5
(h + i + j + k)/4
(i + j + k)/3
(j + k)/2
k

bma[testList, {1,2,3,2,1}]

a
(2*a + b)/3
(3*a + 2*b + c)/6
(2*a + 3*b + 2*c + d)/8
(a + 2*b + 3*c + 2*d + e)/9
(b + 2*c + 3*d + 2*e + f)/9
(c + 2*d + 3*e + 2*f + g)/9
(d + 2*e + 3*f + 2*g + h)/9
(e + 2*f + 3*g + 2*h + i)/9
(f + 2*g + 3*h + 2*i + j)/9
(g + 2*h + 3*i + 2*j + k)/9
(h + 2*i + 3*j + 2*k)/8
(i + 2*j + 3*k)/6
(j + 2*k)/3
k