我想计算一个变量的标准偏差,该变量通过第二个变量对每个观察值进行加权。
values <- c(100, 200, 300, 400, 200)
sizes <- c(12, 54, 1, 218, 63)
如何在基于values
的情况下应用加权来查找sizes
的标准偏差?
Hmisc
很大。在安装和加载具有多个依赖项的程序包的过程中,我使用基本R进行了此操作。首先,我必须检查Wiki中的公式。 https://en.wikipedia.org/wiki/Weighted_arithmetic_mean:
请注意,V1只是权重之和。然后我将其转换为R语音:
x <- c(100, 200, 300, 400, 200)
w <- c(12, 54, 1, 218, 63)
mu <- weighted.mean(x, w)
sqrt(sum(w * ((x-mu)^2))/(sum(w) - 1))
[1] 102.696
与wtd.var
中的Hmisc
功能一致。
当然,如果您想要增加功能,如归一化,最大似然估计或为您删除NA,请使用wtd.var
函数。但是,OP没有指定任何内容。另外,如果您的互联网速度很慢,或者您想尝试自己做事并同时学习,请使用我的方法。 :)
Edit 1:并且对于reliability权重(normwt=TRUE
):
> V1 <- sum(w)
> V2 <- sum(w^2)
> sqrt(sum(w * ((x-mw)^2))/(V1 - V2/V1))
[1] 138.3356
Edit 2:处理缺失值(na.rm=TRUE
):
obs <- !is.na(x) & !is.na(w)
x <- x[obs]
w <- w[obs]
然后使用这些。
我们可以使用wtd.var
中的Hmisc
来获取方差,然后取其平方根
sqrt(Hmisc::wtd.var(values, sizes))
#[1] 102.696
如@AaronMontgomery所述,在删除NA后,可能需要normwt = TRUE
使权重之和等于“值”的长度(默认情况下为FALSE)
sqrt(Hmisc::wtd.var(values, sizes, normwt = TRUE))
#[1] 138.3356v