Skip to content

How to calculate moving average without using filter()?

5 messages · Bert Gunter, Rui Barradas, David Winsemius +1 more

#
There are a zillion answers to this, because your question is really:
How do I smooth a time series? So you can search on appropriate
keywords.

My answer is: don't use moving averages -- that's pathetically
ancient. ?loess is one among the zillions of alternatives you might
consider. Post on CV (stats.stackexchange.com) for other statistical
alternatives for time series smoothing.

Also, the "understanding" you expressed above is flawed. apply-type
constructs **are** (R-level) loops. So have you done your homework by
reading An Intro to R
(http://cran.r-project.org/doc/manuals/R-intro.pdf) or other web
tutorials? If not, please do so before posting here further.

Cheers,
Bert

-- Bert

Bert Gunter
Genentech Nonclinical Biostatistics
(650) 467-7374

"Data is not information. Information is not knowledge. And knowledge
is certainly not wisdom."
H. Gilbert Welch
On Mon, Feb 17, 2014 at 10:45 AM, C W <tmrsg11 at gmail.com> wrote:
#
Hello,

Many packages have a movind average function. For instance package 
forecast. Or

library(sos)
findFn("moving average")

In your example, what you compute is not exactly a moving average, but 
in can be computed with something like the following.

s <- (seq_along(dat) - 1) %/% 3
sapply(split(dat, s), mean)


Hope this helps,

Rui Barradas


Em 17-02-2014 18:45, C W escreveu:
#
On Feb 17, 2014, at 10:45 AM, C W wrote:

            
Construct a vector for grouping and use tapply. Modulo division is a common method for achieving this. Sometimes the seq-function can be used if you adjust the length properly.
0    1    2    3    4    5    6 
 2.0  5.0  8.0 11.0 14.0 17.0 19.5 


tapply(dat, round(seq(1, (length(dat)/3),  len=length(dat))), mean)
   1    2    3    4    5    6    7 
 1.5  4.5  8.0 11.0 14.5 18.0 20.0 

The comment about weighting dos not seem to be exemplified in your example.
David Winsemius
Alameda, CA, USA