跳转到内容

描述性统计手册/统计变异性度量/方差

来自Wikibooks,开放世界的开放书籍
  • 简要描述什么是方差以及它的用途。
  • 数学公式
  • 指向维基百科相关文章的链接。

在此详细描述方差最有效的的数据集和目的。还应描述可能导致误导结果的数据集。

  • 如果存在,请包含常见分布的标准值。例如,正态分布的偏度和峰度始终为零。
  • 包含正态分布的标准误差,如果可能,也包含其他分布的标准误差。
  • 抽样分布。

计算大小为N的总体方差σ2的公式为

其中

代表总体均值。

计算样本方差s2(总体方差的无偏估计)的公式,从大小为n的样本中计算,为

其中

代表样本均值。

因此,计算方差的简单算法可以用以下伪代码描述

double sum;
double sum_sqr;
double variance;
long n = data.length; // the number of elements in the data array (the actual syntax is language-specific)

for i = 0 to n
 sum += data[i];
 sum_sqr += ( data[i] * data[i] );
end for

variance = ((n * sum_sqr) - (sum * sum))/(n*(n-1));

另一种在求和时避免sum_sqr中出现大数的算法

double avg;
double var;
long n = data.length; // number of elements

for i = 0 to n
 avg = (avg*i + data[i]) / (i + 1);
 if (i > 0) var += (var * (i - 1) + (data[i] - avg)*(data[i] - avg)) / i;
end for

return var; // resulting variance

另一种算法

[编辑 | 编辑源代码]

Chan、Golub 和 Leveque(American Statistician,1983 年,第 242 页)的“校正两遍算法”

 avg=0
 for all i
   avg=avg+data[i]
 end for
 avg=avg/n

 sum=0
 sum2=0
 for all i
    sum2=sum2+(data[i]-avg)^2
    sum=sum+(data[i]-avg)
 end for
 var=(sum2-sum/n)/(n-1)

 return var

算法分析

[编辑 | 编辑源代码]

在计算机上处理大型数据集或大数时,选择最大程度减少计算机近似计算引起的误差的算法非常重要。在下面合并上述算法的讨论。

实际上,第一个公式在处理有限精度算术时存在精度问题。如果测量值与均值之间的差异非常小,则第一个公式将产生精度问题,因为信息将在 (xi - µ) 操作中丢失。第二个公式的中间运算中不会发生这种显著性损失。

事实上,第二个公式更容易出现问题。第一个公式在均值相对于方差非常大的时候可能会出现问题,但在实践中这种情况相对较少,而且这个问题也会影响第二个公式。更常见的情况是,均值和方差相当,并且观测值非常多。在这种情况下,第二个公式会导致两个非常大的数字相减,而它们的差值相对较小(大约与观测值的个数成反比)。如果你有一百万个观测值,如果你使用普通的浮点运算,第二个公式会损失大约六位有效数字。

问题可能发生在

  1. 当偏差相对于均值非常小时,或者
  2. 当它们相对于算术工具(浮点计算机、定点计算器、纸和笔)的表示能力较小时。

为了精确起见,我们必须指定工具和数据的性质。

你所说的普通浮点运算是什么意思?是在谈论寄存器宽度方面的精度,还是隐含地引用了一些“非普通”方案,即非 IEEE 方案?谢谢。我认为这个参考非常明确。然而,我并不想暗示使用非标准但仍然是浮点运算。我想到的是完全不同的系统。一个简单的例子是一个基于无限精度整数的有理数系统。另一个系统可能是定点运算。第一个系统在计算中不会损失精度,而第二个系统会或多或少地损失精度,具体取决于相关的值和定点系统的特性。你还可以想象一个优化器,它注意到你可能会将大量非常小的数字加起来,并且会重新排序加法以避免大部分舍入误差,方法是使用 log N 个临时值来执行加法。

包括如何在常见的统计软件包中访问它(如果已知)。还可以提供计算它的源代码示例链接等。

华夏公益教科书