2

I need some help smoothing out some data in R. So basically, I just have a 'time' column and a 'velocity' column. The velocity basically represents the movement of certain tadpoles. Its just that my data has a lot of noise and I think that using 'moving averages' might help me smooth out my graphs and reveal certain patterns . How do I do this in R? Or are there better smoothing techniques I can use that might be easier for a rookie R user like me to understand?

Thanks guys

My data basically looks like this...but it lasts up 9000s

Time    Velocity
1.36    2.4
1.81    1.2
2.19    2.4
2.51    2.1
2.98    1.8
3.51    3.0
4.88    2.1
5.38    2.0
6.52    2.4
6.71    1.2
7.29    2.4
7.67    2.1
8.27    1.8
9.13    3.0
9.95    2.1
10.69   2.0
11.29   2.54
12.82   1.64
13.32   2.70
13.89   2.19
14.33   2.44
14.93   2.93
15.75   2.77
17.63   3.21
18.18   2.4
18.82   1.2
20.02   2.4
20.86   2.1
21.44   1.8
22.24   3.0
23.07   2.1
23.67   2.0
Danubian Sailor
  • 1
  • 38
  • 145
  • 223
  • Give a look to this previously asked SO question http://stackoverflow.com/questions/743812/calculating-moving-average-in-r – Fabio Marroni Jun 26 '13 at 10:08

3 Answers3

6

Have a look at the rollmean function from R's zoo package. This should fit your needs!

Update:

Now that I've got a little more time, here's some sample code. If you'd like to fill the values at the beginning and at the end of your time series, you have to use rollapply, otherwise just take rollmean. Have a look at the console output, it'll become clear what I mean.

# Packages
library(zoo)

# Start RNG
set.seed(10)

# Sample data
tmp <- data.frame(time = 1:30, 
                  velocity = round(runif(30, 1, 3), digits = 2))

# Moving average (window size = 5) using rollmean
rollmean(tmp[, 2], k = 5, fill = NA)
 [1]    NA    NA 1.806 1.694 1.682 1.620 1.588 1.726 1.896 2.014 1.952 1.944 1.916 1.828 1.620 1.680 1.602 1.792 1.966 2.192 2.396 2.378 2.206 2.142
[25] 2.232 2.018 2.184 2.164    NA    NA

# Moving average (window size = 5) using rollapply
rollapply(tmp[, 2], width = 5, function(...) {round(mean(...), digits = 3)}, partial = TRUE)
 [1] 1.823 1.965 1.806 1.694 1.682 1.620 1.588 1.726 1.896 2.014 1.952
[12] 1.944 1.916 1.828 1.620 1.680 1.602 1.792 1.966 2.192 2.396 2.378
[23] 2.206 2.142 2.232 2.018 2.184 2.164 2.103 1.910
fdetsch
  • 5,239
  • 3
  • 30
  • 58
2

A moving average in R is simple:

MoveAve <- function(x, width) {
    as.vector(filter(x, rep(1/width, width), sides=2));
}

Where x is your data and width is the length of your averaging window.

With the sides parameter of the filter function you can control the position of the window, see the documentation:

If sides = 1 the filter coefficients are for past values only; if sides = 2 they are centred around lag 0. In this case the length of the filter should be odd, but if it is even, more of the filter is forward in time than backward.

rinni
  • 2,246
  • 1
  • 18
  • 21
  • What do you mean by average window?...so If I say width=20, would it average out the velocity every 20 s interval?....Can you tell me what sides represent? – Sarah May Muholland Jun 26 '13 at 10:23
  • with width=20 it would average over 20 values with a sliding window. Just try it with x<-1:10; MoveAve(x,2) and change the width – rinni Jun 26 '13 at 10:33
  • @Mona Jalal: Sure it does. It performs averages over the columns. If you remove the `as.vector` from the function it returns a matrix. – rinni May 13 '14 at 08:08
2

If you load the "TTR" package (Technical Trading Rules ) you can pick one of the many MAs from the MA "family".

?SMA

SMA(x, n = 10, ...)

EMA(x, n = 10, wilder = FALSE, ratio = NULL, ...)

DEMA(x, n = 10, v = 1, wilder = FALSE, ratio = NULL)

WMA(x, n = 10, wts = 1:n, ...)

EVWMA(price, volume, n = 10, ...)

ZLEMA(x, n = 10, ratio = NULL, ...)

VWAP(price, volume, n = 10, ...)

VMA(x, w, ratio = 1, ...)

hvollmeier
  • 2,956
  • 1
  • 12
  • 17