一个变量由第二个变量加权的标准差
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]
然后改用这些。
我想计算一个变量的标准差,该变量用第二个变量对每个观察值进行加权。
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]
然后改用这些。