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