help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: vectorized moving average?


From: Tim Rueth
Subject: RE: vectorized moving average?
Date: Tue, 11 May 2010 13:28:34 -0700

Yep, worked great, thanks!

Now, I just have to figure out how to do an exponential MA using filter().
(I think movavg() has a bug in it for the exponential case, where alpha =
'e'.)

--Tim


> -----Original Message-----
> From: address@hidden [mailto:address@hidden On 
> Behalf Of James Sherman Jr.
> Sent: Tuesday, May 11, 2010 11:01 AM
> To: address@hidden
> Cc: Octave-ML
> Subject: Re: vectorized moving average?
> 
> I can't double-check right now, but I think it is that filter 
> is setup so that it does (in this simplified case), let b be 
> the coefficients and has length m,
> 
> y(n) = b(1)*x(n) + b(2)*x(n-1) ... + b(m)*x(n-m+1)
> 
> So, the first value of your coefficient vector (sweep as you 
> call it) should be the value you want to weigh the "current" 
> value of x (what you call a).  Thus, long story short, I 
> believe that your sweep value should be:
> 
> sweep = (ma_days:-1:1).^alpha;
> norm_sweep = sweep/sum(sweep);
> 
> Just reversed of what you put in.  Also, as a side note, the 
> reason why there wasn't much difference between movavg and 
> filter for what you put in, is because you just gave it 
> uniform noise, so any average function is really just 
> approximating the average of the noise.
> 
> On Tue, May 11, 2010 at 1:41 PM, Tim Rueth <address@hidden> wrote:
> >
> > Thanks for showing how to use filter() to do a simple 
> moving average.  I implemented your code, and it agrees with 
> movavg(x,10,10,0), which calculates a 10-day simple moving 
> average.  There's only a difference in the first 9 numbers 
> due to assumed values of negative time (movavg calculates a 
> "run-in" period).  As you might recall, I'm trying to use 
> filter() to avoid movavg()'s for-loop.
> >
> > Now, what I'm trying to do is a weighted moving average, 
> identical to the "alpha" parameter of movavg().  When 
> alpha=0, it's a simple moving average, and agrees with 
> filter().  If I change alpha to 1, I'm suppose to get a 
> linear MA.  Here's the code in movavg.m that does the 
> weighting (lead is the number of days to average, equal to 10 
> in the above case):
> >
> >   lead = (1:lead).^alpha;
> >   ## Adjust the weights to equal 1
> >   lead = lead / sum (lead);
> >
> >  So, for a 10-day linearly-weighted moving average (lead = 
> 10, alpha = 1), the previous 9 days and current day should be 
> weighted as follows: 1/55, 2/55, 3/55...10/55, with the 
> greatest weight (10/55) applied to the current day.  So, I 
> tried a simple test case with just a 2-day MA on a 6-element vector:
> >
> > ma_days = 2;
> > alpha = 1;
> > len = 6;
> > a = rand(1,len);
> >
> > # Calculate MA using movavg()
> > ma = movavg(a,ma_days,ma_days,alpha);
> >
> > # Calculate MA using filter()
> > sweep = (1:ma_days).^alpha;
> > norm_sweep = sweep/sum(sweep);
> > f = filter(norm_sweep,1,a);
> >
> > disp(ma);
> > disp(f);
> >
> > The movavg() and filter() results are similar, but not 
> equal.  I'm guessing I don't have the arguments for filter() 
> correct, but I can't figure out what I did wrong.  
> Particularly, I'm not sure what the second argument of 
> filter() is supposed to do.  Help?
> >
> > ________________________________
> > From: address@hidden [mailto:address@hidden On 
> Behalf Of James Sherman Jr.
> > Sent: Friday, May 07, 2010 12:58 PM
> > To: address@hidden
> > Cc: Octave-ML
> > Subject: Re: vectorized moving average?
> >
> > I'm not sure what you mean by weighting of 0.5, but to do a simple 
> > 10-day average, it'd be x = rand(1, 100); y = 
> filter(1/10*ones(1, 10), 
> > 1, x) This assumes that the values at negative time (x(0), 
> x(-1), etc) 
> > are all zero.  So, for example, the first value of y would 
> be x(1)/10.
> > On Fri, May 7, 2010 at 3:33 PM, Tim Rueth 
> <address@hidden> wrote:
> >>
> >> I looked at both conv() and filter(), but can't figure out 
> how to do 
> >> a moving average with them.  Perhaps I'm not understanding the 
> >> functions of the input vars correctly.
> >>
> >> Let's say I have an array, a = rand(1,100).  Can you tell 
> me how I'd 
> >> use
> >> conv() and filter() to take, say the 10-day moving average of it, 
> >> with a weighting of 0.5?
> >>
> >> Thanks!
> >>
> >>
> >> > -----Original Message-----
> >> > From: Andy Buckle [mailto:address@hidden
> >> > Sent: Thursday, May 06, 2010 12:06 AM
> >> > To: address@hidden
> >> > Cc: address@hidden
> >> > Subject: Re: vectorized moving average?
> >> >
> >> > conv is also an m file, but it only has a few ifs in. 
> then it calls 
> >> > filter to get the job done. which is an oct file.
> >> >
> >> > Andy
> >> >
> >> > On Thu, May 6, 2010 at 6:28 AM, Tim Rueth 
> <address@hidden> wrote:
> >> > > Does anyone know how to take an n-day weighted moving 
> average of 
> >> > > a vector without using a for-loop?  I looked at the M code
> >> > for movavg()
> >> > > and it uses a for-loop, so I'm guessing there probably isn't a 
> >> > > way, but I thought I'd check.  Thanks.
> >> > >
> >> > > --Tim
> >> > > _______________________________________________
> >> > > Help-octave mailing list
> >> > > address@hidden
> >> > > https://www-old.cae.wisc.edu/mailman/listinfo/help-octave
> >> > >
> >> > >
> >> >
> >> >
> >> >
> >> > --
> >> > /* andy buckle */
> >> >
> >>
> >>
> >> _______________________________________________
> >> Help-octave mailing list
> >> address@hidden
> >> https://www-old.cae.wisc.edu/mailman/listinfo/help-octave
> >
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]