计算累积平均值(平均值)

时间:2012-06-17 20:46:16

标签: r average cumulative-sum

我想知道如何计算某些数字的累积平均值。我将举一个简单的例子来描述我在寻找什么。

我有以下数字

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

如果我做这些数字的平均值,我会得到3。

现在,如何进行这些数字的累积平均值。

7 个答案:

答案 0 :(得分:14)

与列表的累积总和类似,我建议: 向量 x 的累积平均值 avg 将包含从第1个位置到位置 x 的平均值。

一种方法是通过对所有先前值求和并除以它们的数来计算每个位置的均值。

arithmetic mean的定义重写为递归公式。一个得到

avg(1) = x(1)

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

为向量的每个元素(或列表,一维数组或者你调用它)评估此表达式可以得到累积平均值。

如果你必须计算非常大或非常多的整数的平均值,并且如果你必须存储它们的累积总和就会遇到溢出,这种递归方法会派上用场。

实施例

在你的例子中

1, 2, 3, 4, 5

我们得到了

1, 1.5, 2, 2.5, 3

答案 1 :(得分:8)

如何在R中创建累积平均值? 答: 这个答案由Jim Holtman jholtman@gmail.com提供 他使用cumsum()函数和seq_along()函数来阅读这些函数。但提供的代码清楚地表明了这一点。 6,6 + 16,6 + 16 + 8,等等

   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

答案 2 :(得分:7)

只需保留数字的运行总和,以及它们的运行计数。 平均值只是计数的总和。

答案 3 :(得分:4)

这个问题表明严重缺乏研究,但我还没有足够的声誉来投票。如果我正确理解了这个问题,那么所需的是累积移动平均值

Wikipedia非常清楚地描述了累积移动平均线。我不允许在这里发布图片,但是按照该链接获取一个简单的公式(前一个平均值和新值的加权平均值)。

答案 4 :(得分:3)

这是一个老问题,从那以后发生了很多变化。我只是想用dplyr答案来更新它。 dplyr具有cummean函数,可直接给出向量的累积均值。

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

#[1] 1.0 1.5 2.0 2.5 3.0

答案 5 :(得分:0)

  

myNum的   [1] 1 2 3 4 5

     

cumsum(mynum)/ seq(从= 1,到= 5)

[1] 1.0 1.5 2.0 2.5 3.0

答案 6 :(得分:0)

我做了一个简单的C ++类。

#include <iostream>

using namespace std;

class Average {

public:
    Average(const double initVal=0.0){accumVal=initVal;}
    double getAverage(const double newVal) {

        accumVal += newVal;
        return accumVal / ++numAccumVal;
    }
    void clear(const double clearedVal=0.0) {

        accumVal = clearedVal;
        numAccumVal = 0;
    }
private:
    double accumVal;
    unsigned int numAccumVal=0;
};

int main(int argc, const char * argv[]) {

    Average avg;

    for (size_t i=1; i<=5; ++i) { //feed in 1 to 5

        double result = avg.getAverage(i);
        cout << "Result : " << result << endl; //print the result
    }
    return 0;
}

如果您运行代码,您将得到如下结果。

Result : 1
Result : 1.5
Result : 2
Result : 2.5
Result : 3
Program ended with exit code: 0