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

wkyowqbh  于 2023-01-10  发布在  其他
关注(0)|答案(5)|浏览(362)

我不确定这是应该用SO还是其他的.SE,所以如果这被认为是离题的话,我会删除。
我有一个向量,我试图计算方差“手工”(意思是基于方差的定义,但仍然执行计算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。

t8e9dugd

t8e9dugd1#

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

uurv41yg

uurv41yg2#

虽然这个问题已经得到了回答,但我担心有些人仍然会在“总体方差”和“估计值”之间混淆,这可能是由于这个例子。
如果向量vec表示整个总体,则vec只是表示分布函数的一种方法,可以更简洁地将其总结为pmf,而pmf是从vec导出的。关键是,vec的元素在这种情况下不是随机变量。在这种情况下,从pmf计算E[X]和var[X]是正确的。
然而,大多数情况下,当你有数据时(例如以向量的形式),它是来自基础总体的随机样本,向量的每个元素都是随机变量的观测值:这是从总体中“抽取”。在本例中,可以假设每个元素都是从同一个分布(“iid”)中独立抽取的。实际上,这种随机抽样意味着您无法计算真实的pmf,因为您可能会有一些仅由偶然性引起的变化。同样,您无法获得E[X]、E[X^2]以及Var[X]的真实值。这些值需要进行估计。* 样本平均值 * 通常是E[X]的良好估计值(尤其是无偏估计值),但结果是 * 样本方差 * 是总体方差的有偏估计值。要更正此偏差,需要将其乘以因子n/(n-1)。
因为后一种情况在实践中最常见(除了教科书上的练习),它是当你在R中调用var()函数时计算出来的。所以如果你被要求找出“估计方差”,它很可能暗示你的向量vec是随机样本,你属于后一种情况。如果这是最初的问题,那么你就有了答案,我希望你能清楚地认识到,变量名的选择和代码中的注解会导致混乱:事实上,你无法从随机抽样中计算出总体的pmf、期望值或方差:你能得到的是他们的估计值,其中一个--方差--是有偏差的。
我想澄清这一点,因为这种混淆(如代码中所示)在初次熟悉这些概念时非常常见,尤其是公认的答案可能会产生误导:V[X] = E[X^2] - E[X]^2不是样本方差;它实际上是“总体方差”,而“总体方差”无法从随机样本中获得。如果用样本估计值(作为平均值)替换此方程中的值,则会得到sample.V[X] = average[X^2] - average[X]^2,它是“样本方差”,并且是有偏的。
有人可能会说我对语义很挑剔;不过,公认答案中的“滥用符号”,只有在大家都认同的情况下,才是可以接受的。不过,对于那些试图找出这些概念上的差异的人来说,我相信最好是保持准确。

yyyllmsg

yyyllmsg3#

下面是一种计算“估计总体方差”的方法,该方法与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

我想知道人们是怎么看待“估计器”这个词的。
在函数中(不太可能像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)
ne5o7dgx

ne5o7dgx4#

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)
cig3rfwq

cig3rfwq5#

Var()函数计算样本方差。如果你想要总体方差,你应该把它乘以((n-1)/n)。
假设x1是数组:

计算长度

n〈-长度(x1)

计算弹出方差

变量(x1)*((n-1)/n)

相关问题