将每日Welford计算方差结合到每月

时间:2015-06-18 18:59:19

标签: algorithm statistics variance standard-deviation

我成功地使用Welford的方法来计算运行方差和标准差,如Stack Overflow和John D Cook's excellent blog post所述。

我将“Sk”和stdev的时间戳,计数,总和和运行计算存储在数据库表PER DAY中。

我想将每日计算的计数,总和和Sk值组合或汇总得到每月标准偏差。

John D Cook的博客another post提供了将两个“RunningStats”合并为1的算法(参见operator + method)。这适用于将2天合并为1.我可以使用它来迭代这些日子以结合当月的所有日子。但是,与计算每日stdev不同,我必须以流式方式处理大量样本,我可以访问所有日常数据,并希望一个公式可以同时合并当月的所有日期。这将有助于创建数据库视图。

似乎只是简单地总结Sk值并除以每月总计数-1会产生准确的方差。

示例数据:

DATE, COUNT, SUM, Sk, STDDEV
1-Jun-15, 60, 514, 1556.733336, 5.14
2-Jun-15, 51, 455, 1523.686274, 5.52
3-Jun-15, 61, 556, 1494.196722, 4.99
...

1 个答案:

答案 0 :(得分:0)

x1, ..., xn为一天的值。然后,据我所知,Sk被定义(数学上;滚动实现不同)如下。

Mk = (sum_{i=1}^n xi) / n     [Mk = SUM / COUNT]
Sk = sum_{i=1}^n (xi - Mk)^2.

Sk列进行求和的问题在于,每个值都是根据不同的平均值计算的,因此总体方差是低估的。相反,我们应该有一个像

这样的术语
sum_{i=1}^n (xi - (Mk + delta))^2,

我们根据现有数量重写。

  sum_{i=1}^n (xi - (Mk + delta))^2
= sum_{i=1}^n (xi - Mk - delta)^2
= sum_{i=1}^n ((xi - Mk)^2 - 2 (xi - Mk) delta + delta^2)
= Sk + n delta^2.

此处delta是月平均值减去每日平均值。再一次,我不保证数值稳定性。