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

时间:2015-02-20 20:49:10

标签: r variance

我不确定这应该是SO还是其他.SE,所以如果这被认为是偏离主题我会删除。

我有一个向量,我正在尝试使用以下等式计算“手动”方差(意味着基于方差的定义,但仍然在R中执行计算):V[X] = E[X^2] - E[X]^2其中{{1} }和E[X] = sum (x * f(x))

但是,我的计算方差与R具有的E[X^2] = sum (x^2 * f(x))函数不同(我用它来检查我的工作)。为什么var()函数不同?它是如何计算方差的?我已经多次检查了我的计算,所以我对我计算的值非常有信心。我的代码如下。

var()

这给出了2.234的计算方差,但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.383。

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

虽然已经回答了这个问题,但我担心有些人可能仍然会在样本中将种群差异估计混淆,这可能是由于这个例子。

如果向量vec表示完整填充,则vec只是表示分布函数的一种方式,可以在您从中派生的pmf中更简洁地汇总。至关重要的是,在这种情况下vec的元素不是随机变量。在这种情况下,您对pmf的E [X]和var [X]的计算是正确的。

但是,大多数情况下,当您拥有数据(例如以矢量形式)时,它是来自基础人口的随机样本。向量的每个元素都是随机变量的观测值:它是一个&#34; draw&#34;来自人口。对于这个例子,可以假设每个元素是从相同的分布中独立绘制的(&#34; iid&#34;)。在实践中,这种随机抽样意味着您无法计算真实的pmf,因为您可能仅仅因为机会而有一些变化。同样,您无法从样本中获得E [X],E [X ^ 2]的真实值,从而得到Var [X]的真值。需要估算这些值。 样本平均值通常是对E [X]的一个很好的估计(特别是它是无偏的),但事实证明样本方差是一个有偏差的估计值。人口差异。要纠正这种偏差,您需要将其乘以系数n /(n-1)。

由于后一种情况在实践中最常见(除了教科书练习),它是在R中调用var()函数时计算的内容。因此,如果您被要求查找& #34;估计方差&#34;,它很可能意味着你的向量vec是一个随机样本,你属于后一种情况。如果这是原始问题,那么你有答案,我希望很明显,选择变量名称和代码中的注释会导致混淆:实际上,你无法计算pmf,期望值或随机样本中人口的方差:你能得到的是他们的估计,其中一个 - 方差的 - 是有偏见的。

我想澄清这一点,因为在编码中看到的这种混乱在首次熟悉这些概念时非常常见。特别是,接受的答案可能会产生误导:V [X] = E [X ^ 2] - E [X] ^ 2 样本方差;它确实是种群差异,你无法从随机样本中获得。如果用它们的样本估计值(作为平均值)替换这个等式中的值,你将得到样本.V [X] =平均值[X ^ 2] - 平均值[X] ^ 2,这是样本方差< / em>,并且有偏见。

有些人可能会说我对语义很挑剔;然而,滥用符号&#34;在接受的答案中,只有当每个人都承认这一点时才能接受。然而,对于那些试图弄清楚这些概念差异的人,我认为最好保持精确。

答案 2 :(得分:1)

这是计算人口差异的一种方法&#34;匹配stats包中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

我想知道人们如何考虑标记术语&#34; estimator。&#34;

在一个函数中(不太可能处理错误和异常以及stats包中的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)

答案 3 :(得分:1)

R基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)