【问题标题】:Merging two statistical result sets合并两个统计结果集
【发布时间】:2009-09-26 07:01:57
【问题描述】:

我有两组从处理中生成的统计信息。来自处理的数据可能是大量结果,因此我宁愿不必存储所有数据以稍后重新计算附加数据。

假设我有两组统计信息,它们描述了两个不同的进程运行会话。

每组包含

Statistics : { mean, median, standard deviation, runs on process} 

如何合并两者的中位数和标准差,以获得两组描述性统计数据的组合摘要。

请记住,我无法保留统计数据所描述的两组数据。

【问题讨论】:

    标签: math statistics


    【解决方案1】:

    Artelius 在数学上是正确的,但他建议的计算方差的方式在数值上是不稳定的。您想按如下方式计算方差:

    new_var=(n(0)*(var(0)+(mean(0)-new_mean)**2) + n(1)*(var(1)+(mean(1)-new_mean)**2) + ...)/new_n
    

    从评论中编辑
    原始代码的问题是,如果您的偏差与平均值相比很小,您最终会从一个大数中减去一个大数以获得一个相对较小的数,这将导致您失去浮点精度。新代码避免了这个问题;而不是转换为 E(X^2) 并返回,它只是将所有对总方差的贡献加在一起,并根据它们的样本大小适当加权。

    【讨论】:

    • 当然。原始代码的问题是,如果您的偏差与平均值相比很小,您最终会从一个大数中减去一个大数以获得一个相对较小的数,这将导致您失去浮点精度。新代码避免了这个问题;而不是转换为 E(X^2) 并返回,它只是将所有对总方差的贡献加在一起,并根据它们的样本大小适当加权。
    • +1 为您的回答和评论。两者都很到位,而且写得很好。
    【解决方案2】:

    你可以得到平均值和标准差,但不能得到中位数。

    new_n = (n(0) + n(1) + ...)
    new_mean = (mean(0)*n(0) + mean(1)*n(1) + ...) / new_n
    
    new_var = ((var(0)+mean(0)**2)*n(0) + (var(1)+mean(1)**2)*n(1) + ...) / new_n - new_mean**2
    

    其中n(0) 是第一个数据集中的运行次数,n(1) 是第二个数据集中的运行次数,依此类推,mean 是均值,var 是方差(其中只是标准差的平方)。 n**2 表示“n 平方”。

    获得组合方差依赖于这样一个事实,即数据集的方差等于数据集平方的均值减去数据集均值的平方。在统计语言中,

    Var(X) = E(X^2) - E(X)^2
    

    上面的 var(n)+mean(n)**2 术语为我们提供了 E(X^2) 部分,然后我们可以将其与其他数据集组合,然后得到所需的结果。

    就中位数而言:

    如果您正在组合两个数据集,那么您可以确定组合中位数位于两个中位数之间(或等于其中之一),但您可以说的不多。取他们的平均值应该没问题,除非你想避免中位数不等于某个数据点。

    如果您要一次性组合多个数据集,您可以取中位数的中位数,也可以取它们的平均值。如果不同数据集之间可能存在显着的系统差异,那么取它们的平均值可能会更好,因为取中位数可以减少异常值的影响。但是,如果您在运行之间存在系统差异,那么忽略它们可能不是一件好事。

    【讨论】:

      【解决方案3】:

      中位数是不可能的。假设您有两个元组,(1, 1, 1, 2) 和 (0, 0, 2, 3, 3)。中位数为 1 和 2,总中位数为 1。无法判断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多