我不确定这应该是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。
答案 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)