Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate cumulative average (mean)

I would like to know how to calculate the cumulative average for some numbers. I will give a simple example to describe what I am looking for.

I have the following numbers

vec <- c(1, 2, 3, 4, 5)

If I do the average of these numbers I will get 3 as a result.

Now, how to do the cumulative average of these numbers.

like image 542
MR BIG Avatar asked Jun 17 '12 20:06

MR BIG


4 Answers

The question indicates serious lack of research but I don't have enough reputation yet to vote the question down. If I understand the question correctly, what is desired is the cumulative moving average.

Wikipedia describes cumulative moving average very clearly. I'm not allowed to post an image here but follow that link for a simple formula (a weighted average of the previous average and the new value).

like image 57
Jam560 Avatar answered Oct 02 '22 04:10

Jam560


In analogy to the cumulative sum of a list I propose this: The cumulative average avg of a vector x would contain the averages from 1st position till position i.

One method is just to compute the the mean for each position by summing over all previous values and dividing by their number.

By rewriting the definition of the arithmetic mean as a recursive formula. One gets

avg(1) = x(1)

and

avg(i) = (i-1)/i*avg(i-1) + x(i)/i;    (i > 1)

Evaluating this expression for every element of your vector (or list, one-dimensional array or however you call it) gives you the cumulative average.

This recursive method comes in handy if you have to calculate an average over very large or very many integers and would run into an overflow if you had to store their cumulative sum.

Example

In your example

1, 2, 3, 4, 5

we get

1, 1.5, 2, 2.5, 3
like image 22
Marius Avatar answered Oct 18 '22 21:10

Marius


This is an old question and there have been lot of changes since then. I just thought of updating it with a dplyr answer. dplyr has a cummean function which directly gives the cumulative mean of the vector.

vec <- c(1, 2, 3, 4, 5)
library(dplyr)
cummean(vec)

#[1] 1.0 1.5 2.0 2.5 3.0
like image 10
Ronak Shah Avatar answered Oct 18 '22 22:10

Ronak Shah


You can use the cumsum() function and the seq_along() function so read up on those. But the code provided make it clear. 6, 6 + 16, 6 + 16 + 8, and so on.

x <- sample(1:20)
x
# [1]  6 16  8  1 17 11  2 19 18  5 15 13  3 20  9 14  7 10 12  4
    
cumsum(x) / seq_along(x)
# [1]  6.000000 11.000000 10.000000  7.750000  9.600000  9.833333  8.714286
#10.000000 10.888889 10.300000
#[11] 10.727273 10.916667 10.307692 11.000000 10.866667 11.062500 10.823529
#10.777778 10.842105 10.500000
like image 8
dxander Avatar answered Oct 18 '22 20:10

dxander