为什么 var() 函数给出的答案与计算出的方差不同?

Why is the var() function giving me a different answer than my calculated variance?

我不确定这是否应该放在 SO 或其他一些 .SE 中,所以如果这被认为是题外话我会删除。

我有一个向量,我正在尝试计算方差 "by hand"(意思是基于方差的定义,但仍在 R 中执行计算)使用等式:V[X] = E[X^2] - E[X]^2 其中 E[X] = sum (x * f(x))E[X^2] = sum (x^2 * f(x))

但是,我计算的方差与 R 的 var() 函数(我用来检查我的工作)不同。为什么 var() 函数不同?它是如何计算方差的?我已经多次检查我的计算,所以我对我计算的值相当有信心。下面提供了我的代码。

vec <- c(3, 5, 4, 3, 6, 7, 3, 6, 4, 6, 3, 4, 1, 3, 4, 4)
range(vec)
counts <- hist(vec + .01, breaks = 7)$counts
fx <- counts / (sum(counts)) #the pmf f(x)
x <- c(min(vec): max(vec)) #the values of x
exp <- sum(x * fx) ; exp #expected value of x
exp.square <- sum(x^2 * fx) #expected value of x^2
var <- exp.square - (exp)^2 ; var #calculated variance
var(vec)

这给了我 2.234 的计算方差,但是 var() 函数说方差是 2.383。

虽然 V[X] = E[X^2] - E[X]^2 是总体方差(当向量中的值是整个总体时,不仅仅是样本),var 函数计算总体方差( 样本方差)的 估计量

虽然已经回答了这个问题,但我担心有些人可能仍然会混淆 总体方差 和样本中的 估计值 ,以及这可能是由于示例。

如果向量 vec 代表全部人口,那么 vec 只是表示分布函数的一种方式,可以在您从中导出的 pmf 中更简洁地总结。至关重要的是,本例中 vec 的元素不是随机变量。在这种情况下,您从 pmf 计算出的 E[X] 和 var[X] 是正确的。

然而,大多数时候,当您有数据(例如以向量的形式)时,它是来自基础总体的随机样本。向量的每个元素都是随机变量的观察值:它是来自总体的 "draw"。对于这个例子,可以公平地假设每个元素都是独立绘制的,来自相同的分布 ("iid")。实际上,这种随机抽样意味着您无法计算出真正的 pmf,因为您可能会因为偶然而产生一些变化。同样,您无法从样本中获得 E[X]、E[X^2] 和 Var[X] 的真实值。需要估计这些值。 样本平均值 通常是 E[X] 的一个很好的估计(特别是,它是无偏的),但事实证明 样本方差是总体方差的有偏估计。要纠正这种偏差,您需要将其乘以系数 n/(n-1)。

由于后一种情况在实践中最常见(除了教科书练习),它是您在 R 中调用 var() 函数时计算的结果。因此,如果您被要求找到 "estimated variance",这很可能意味着您的向量 vec 是一个随机样本,并且您属于后一种情况。如果这是最初的问题,那么您已经有了答案,我希望大家清楚 变量名称的选择和代码中的注释可能会导致混淆 :的确,您无法从随机样本中计算总体的 pmf、期望值或方差:您可以获得的是他们的 估计值 ,其中之一——方差——有偏见。

我想澄清一下,因为在编码中看到的这种混淆在第一次熟悉这些概念时非常常见。特别是,接受的答案可能会产生误导:V[X] = E[X^2] - E[X]^2 is not the sample variance;它确实是总体方差,你不能从随机样本中得到它。如果用样本估计值(平均值)替换此等式中的值,您将得到 sample.V[X] = average[X^2] - average[X]^2,即 样本方差,并且有偏差。

有人可能会说我对语义很挑剔;但是,接受的答案中的 "abuse of notation" 只有在每个人都承认它时才可以接受。但是,对于那些试图找出这些概念差异的人,我认为最好保持精确。

这是计算 "estimated population variance" 的一种方法,它与统计数据包中 var 函数的输出相匹配:

vec <- c(3, 5, 4, 3, 6, 7, 3, 6, 4, 6, 3, 4, 1, 3, 4, 4)
n <- length(vec)
average <- mean(vec)
differences <- vec - average
squared.differences <- differences^2
sum.of.squared.differences <-  sum(squared.differences)
estimator <- 1/(n - 1)
estimated.variance <- estimator * sum.of.squared.differences
estimated.variance
[1] 2.383333
var(vec) == estimated.variance # The "hand calculated" variance equals the variance in the stats package.
[1] TRUE

我想知道人们对给术语贴上标签有什么看法 "estimator."

在函数中(不太可能处理错误和异常以及统计包中的 var 函数):

estimated.variance.by.hand <- function (x){
  n <- length(x)
  average <- mean(x)
  differences <- x - average
  squared.differences <- differences^2
  sum.of.squared.differences <-  sum(squared.differences)
  estimator <- 1/(n - 1)
  est.variance <- estimator * sum.of.squared.differences
  est.variance
}
estimated.variance.by.hand(vec)
estimated.variance.by.hand(1:10)
var(1:10)
estimated.variance.by.hand(1:100)
var(1:100)

R-base var() 在分母中取 N-1,以获得更可靠的(偏差较小 ) 方差估计量。不幸的是,没有选项告诉 var() 取而代之的是 N,所以我为这种情况编写了自己的方差函数。

var_N = function(x){var(x)*(length(x)-1)/length(x)}

和一些代码来说明上面的功能,基本功能,手动方式和@dca 的 estimated.variance.by.hand() 功能:

## Data
x = c(4,5,6,7,8,2,4,6,6)
mean_x = mean(x)


## Variance with N-1 in denominator
var(x)
sum((x - mean_x) ^2) / (length(x) - 1)
estimated.variance.by.hand(x)


## Variance with N in denominator
sum((x - mean_x) ^2) / length(x)
var(x) * (length(x) - 1) / length(x)
var_N = function(x){var(x)*(length(x)-1)/length(x)}
var_N(x)