平均加权标准差

机器算法验证 r 标准差 加权平均数
2022-03-22 22:51:55

对于观察次数不等的两组(a 和 b)(n=10 和 n=30),我给出了它们的均值和 sd。计算加权平均值非常简单。但是我怎样才能得出这个加权平均值的标准差呢?请考虑以下虚拟数据集:

a <- rnorm(10,1,1)
b <- rnorm(30,1,1)
weight_a <- 1/4
weight_b <- 3/4

# Calculate weighted mean
weighted_mean <- mean(a)*weight_a + mean(b)*weight_b
# this gives the same average as:
mean(c(a,b))

# Calculate weighted sd
weighted_sd <- sqrt(sd(a)^2*weight_a+sd(b)^2*weight_b)
# this does not give the same sd as:
sd(c(a,b))

我错过了什么?

3个回答

您将随机变量的添加与样本的串联混淆了(很容易做到,我花了一段时间才意识到为什么您的代码不起作用!)。所以对于独立随机变量你可以写,注意系数是平方。这将(大约)适用于以下样本XYVar(aX+bY)=a2Var(X)+b2Var(Y)

set.seed(1)
n <- 100
mu = 1
sigma = 1
a<-rnorm(n,mu,sigma)
b<-rnorm(n,mu,sigma)
weight_a <- 1/4
weight_b <- 3/4
sqrt(sd(a)^2*weight_a^2+sd(b)^2*weight_b^2)
[1] 0.7526849
sd(weight_a*a + weight_b*b)
[1] 0.7524718

对于样本的串联,您需要应用方差公式,针对您使用样本的事实进行适当调整,即乘以下面用 R 代码说明了这一点。Var(X)=E(X2)(E(X))2n/(n1)

suma2 = sum(a^2)
sumb2 = sum(b^2)
suma = sum(a)
sumb = sum(b)
sumc2 = suma2 + sumb2
sumc = suma + sumb
nc = n + n
(sumb2/n - (sumb/n)^2) * n/(n-1)
[1] 0.9175323
sd(b)^2
[1] 0.9175323
sumc2 = suma2 + sumb2
sumc = suma + sumb
(sumc2/nc - (sumc/nc)^2) * nc/(nc-1)
[1] 0.8632217
sd(c(a,b))^2
[1] 0.8632217

当您连接加权系列时,可以自然地合并权重以给出公式。

Var(w)=(wa2Saa+wb2Sbbna+nb(waSa+wbSbna+nb)2)×na+nbna+nb1,

其中加权的长度为 a} 和由加权的长度为的系列形成的系列。的平方和是系列的和,对于也是如此。wanawabnbwbSaaaSaab

这在以下 R 代码中进行了说明。

sumw2 = weight_a^2*suma2 + weight_b^2*sumb2
sumw = weight_a*suma + weight_b*sumb
(sumw2/nc - (sumw/nc)^2) * nc/(nc-1)
[1] 0.3314697
sd(c(weight_a*a, weight_b*b))^2
[1] 0.3314697

请注意,在第一种情况下,除此之外,我必须使用相同大小的系列。为方便起见,我继续使用同一系列。但是用于第二种情况的代码,连接,应该适用于不同大小的系列。

但是,正如@Peter Ellis 在他的回答中所说,您最终试图解决的问题可能类似于双样本 t 检验,您假设这两个样本来自同一个总体,因此每个样本的潜在方差样品是一样的。在这种情况下,您想要估计总体方差。合并方差的公式是众所周知的,可以在维基百科上找到维基百科也提供了 对多个样本的概括)。

不完全清楚你想要的加权标准偏差到底是什么,但我假设你想要一个从中抽取两个样本的单一总体的标准偏差,并且由于某种原因(例如抽样方法)你想给予更多的权重到其中一个样本。您出错的要点是认为这可以通过子样本的标准偏差以某种方式创建。考虑到基础总体的方差是每个点与合并均值的平均平方距离的反映(不是两个子样本的两个均值,这是 sd(a) 等得到的)。因此,您需要对该汇总平均值进行估计;并且您需要每个点与该汇集平均值的距离平方的加权平均值。

您的数学似乎是错误的,并且存在一些概念上的问题。成为您的两个发行版的实际编译。 因为两者都是独立同分布,所以我们有 现在,R 将计算的标准差,并将基于此方差,但实际上不一定是,我认为,因为这是一个有偏见的估计。 这是你的另一个公式 Z

Z=0.25A+0.75BV[Z]=V[0.25A+0.75B]=0.252V[A]+0.752V[B]+20.250.75Cov[A,B]
V[Z]=0.252V[A]+0.752V[B]SD^[Z]=0.252V[A]+0.752V[B]
ZSD^[Z]
SDweighted=0.25V^[A]+0.75V^[B]
有几件事。
1.公式不正确。你的体重应该是平方的。
2. 如果通过方差估计,标准差是有偏估计。正因为如此,修正可能已由R. 然后不再保证它的平方是相同的。
3. 虽然分布是独立同分布的,但样本协方差可能不会为零。可以合理地预期,结果并不完全独立。

所以这些就是你得到不同结果的原因。即使您更正了代码并应用了正确的公式,由于 SD 估计量的修正向下偏差,您可能仍然会有细微的差异。

编辑:对不起,我误读了代码。虽然它仍然是错误的;)