加权快速标准差

6

我想使用一个函数,可以快速地为向量提供标准差,并允许我包括向量中元素的权重。例如:

sd(c(1,2,3))     #weights all equal 1
#[1] 1
sd(c(1,2,3,3,3))  #weights equal 1,1,3 respectively
#[1] 0.8944272

对于加权平均数,我可以使用library(SDMTools)中的wt.mean()函数。

>  mean(c(1,2,3))
[1] 2
>     wt.mean(c(1,2,3),c(1,1,1))
[1] 2
> 
>     mean(c(1,2,3,3,3))
[1] 2.4
>     wt.mean(c(1,2,3),c(1,1,3))
[1] 2.4

但是wt.sd函数似乎没有提供我想要的功能:

>   sd(c(1,2,3))
[1] 1
>     wt.sd(c(1,2,3),c(1,1,1))
[1] 1
>     sd(c(1,2,3,3,3))
[1] 0.8944272
>     wt.sd(c(1,2,3),c(1,1,3))
[1] 1.069045

我需要一个返回加权标准差为0.8944272的函数。最好能在像下面这样的数据框上使用:

data.frame(x=c(1,2,3),w=c(1,1,3))

请注意 SDMTools::wt.var 的文档:“wt.var 是使用 GNU 科学库方程计算的加权平均值计算的无偏方差”。 - Roland
2个回答

9
library(Hmisc)
sqrt(wtd.var(1:3,c(1,1,3)))
#[1] 0.8944272

4
您可以使用rep按照它们的权重来复制值。然后,可以为生成的向量计算sd
x <- c(1, 2, 3) # values
w <- c(1, 1, 3) # weights

sd(rep(x, w))
[1] 0.8944272

+1 - 但是请看一下 Hmisc::wtd.var 的实现,那看起来更具可扩展性。 - flodel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接