moving average function

*To*: mathgroup at smc.vnet.net*Subject*: [mg126307] moving average function*From*: Robert McHugh <rtmphone09 at gmail.com>*Date*: Mon, 30 Apr 2012 04:40:57 -0400 (EDT)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com

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} }