Re: list manipulation, mean value
- To: mathgroup at smc.vnet.net
- Subject: [mg23002] Re: list manipulation, mean value
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Mon, 10 Apr 2000 02:22:30 -0400 (EDT)
- References: <8cp61k$cu5@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Deborah: We can proceed as follows lis = { 1, 0, 2, 1, 3, 4} ; w[n_] := Partition[lis, n, 1] w[2] {{1, 0}, {0, 2}, {2, 1}, {1, 3}, {3, 4}} and go on to build up some custom code. But using the package << Statistics`DescriptiveStatistics` We can go directly to the moving averages. ma = MovingAverage[N[lis], 2] {0.5, 1., 1.5, 2., 3.5} And then get the standard deviations that you want. ReplaceList[{0.5`, 1.`, 1.5`, 2.`, 3.5`}, {x__, y___} :> StandardDeviation[{x}]] {StandardDeviation[{0.5}], 0.353553, 0.5, 0.645497, 1.15109} Well! However we can extend the definition of StandardDeviation to single element lists. Unprotect[StandardDeviation]; StandardDeviation[{x_}] := 0; Protect[StandardDeviation]; Now we have ReplaceList[{0.5`, 1.`, 1.5`, 2.`, 3.5`}, {x__, y___} :> StandardDeviation[{x}]] {0, 0.353553, 0.5, 0.645497, 1.15109} Build a function to do the work: final[lis_] := Table[ReplaceList[ MovingAverage[N[lis], k], {x__, y___} :> StandardDeviation[{x}]], {k, 1, Length[lis]}] final[lis] {0.06 Second, {{0, 0.707107, 1., 0.816497, 1.14018, 1.47196}, {0, 0.353553, 0.5, 0.645497, 1.15109}, {0, 0., 0.57735, 0.816497}, {0, 0.353553, 0.763763}, {0, 0.424264}, {0}}} If you want to get just one list then flatfinal[lis_] := Flatten[final[lis]] flatfinal[lis] {0, 0.707107, 1., 0.816497, 1.14018, 1.47196, 0, 0.353553, 0.5, 0.645497, \ 1.15109, 0, 0., 0.57735, 0.816497, 0, 0.353553, 0.763763, 0, 0.424264, 0} It may be faster to avoid the use of ReplaceList: final2[lis_] := Table[ StandardDeviation[ Take[MovingAverage[N[lis], k], n]], {k, 1, Length[lis]}, {n, 1, Length[lis] - k + 1} ] final2[lis] {{0, 0.707107, 1., 0.816497, 1.14018, 1.47196}, {0, 0.353553, 0.5, 0.645497, 1.15109}, {0, 0., 0.57735, 0.816497}, {0, 0.353553, 0.763763}, {0, 0.424264}, {0}} And custom coding instead of using the package might be quicker. "Deborah Leddon " <Dleddon at students.cas.unt.edu> wrote in message news:8cp61k$cu5 at smc.vnet.net... > Hello, > > I have a rather involved question on how to partition a data list into > sliding windowed components and then calculate a mean value > followed by a running standard deviation. > For example, for the following data list: > lis ={ 1,0,2,1,3,4} > > with a length of n=6, I want to take groups of data points of > lengths running from 1 to n= 6 (length of the data list), perform a > mean value and then take a running standard deviation (STD) as > shown below: > > For a group of length = 1, take from lis: > w(1) = {1,0,2,1,3,4} > perform mean value of each number (sublist;group length =1) to get > {1,0,2,1,3,4}, > perform running standard deviations (STD) to get: > {STD[1], STD[{1,0}], STD[{1,0,2}], STD[{1,0,2,1}], STD[{1,0,2,1,3}], > STD[{1,0,2,1,3,4}]} > then put into a list called lets say "final". > > For the next group of length = 2, take from lis: > w(2) = { {1,0}, {0,2}, {2,1},{1,3}, {3,4} }, *(note this is not just a > partition of the list, but a sliding one)* > get the mean value of each sublist; > {1, 1, 1.5, 2, 3.5}; > perform running standard dev.; > STD[{1}], STD[{1,1}], STD[{1,1,1.5}], STD[{1,1,1.5,2}], > STD[{1,1,1.5,2,3.5}] > then append these STD values to the list 'final'. > > then so on for w(3),.....,w(n=6). > > Eventually the goal is to get a 'final' list of running standard > deviations in order to plot. > > If anyone can help, I'd really appreciate it. Thanks for your time. > > Debbie > > >