一个变量由第二个变量加权的标准差

Standard Deviation of One Variable Weighted By Second Variable

我想计算一个变量的标准差,该变量用第二个变量对每个观察值进行加权。

values <- c(100, 200, 300, 400, 200)
sizes <- c(12, 54, 1, 218, 63)

如何找到 values 的标准差并根据 sizes 应用权重?

我们可以用Hmisc中的wtd.var求出方差,然后对它求平方根

sqrt(Hmisc::wtd.var(values, sizes))
#[1] 102.696

如@AaronMontgomery 所述,删除 NA 后可能需要 normwt = TRUE 使权重总和达到 'values' 的长度(默认情况下为 FALSE)

sqrt(Hmisc::wtd.var(values, sizes, normwt = TRUE))
#[1] 138.3356v

那个Hmisc比较大。在安装和加载具有多个依赖项的包的过程中,我使用 base R 完成了此操作。首先,我必须检查 Wiki 中的公式。 https://en.wikipedia.org/wiki/Weighted_arithmetic_mean:

请注意,V1 只是权重的总和。然后我把它转换成 R-speak:

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

这与 Hmisc 中的 wtd.var 函数一致。

当然,如果您想要添加功能,例如归一化、最大似然估计或为您删除 NA,请使用 wtd.var 函数。但是 OP 没有具体说明任何内容。还有,如果你网速慢,或者你想自己动手边学边学,那就用我的方法吧。 :)

编辑 1:对于 可靠性 权重 (normwt=TRUE):

> V1 <- sum(w)
> V2 <- sum(w^2)
> sqrt(sum(w * ((x-mw)^2))/(V1 - V2/V1))
[1] 138.3356

编辑 2:处理缺失值 (na.rm=TRUE):

obs <- !is.na(x) & !is.na(w)
x <- x[obs]
w <- w[obs]

然后改用这些。