计算加权平均值和标准差

Posted

技术标签:

【中文标题】计算加权平均值和标准差【英文标题】:Calculating weighted mean and standard deviation 【发布时间】:2012-04-20 10:05:58 【问题描述】:

我有一个时间序列x_0 ... x_t。我想计算数据的指数加权方差。那就是:

V = SUMw_i*(x_i - x_bar)^2, i=1 to T where SUMw_i = 1 and x_bar=SUMw_i*x_i

参考:http://en.wikipedia.org/wiki/Weighted_mean#Weighted_sample_variance

目标基本上是对时间较早的观察结果进行加权。这实现起来非常简单,但我想尽可能多地使用内置功能。有谁知道这在 R 中对应什么?

谢谢

【问题讨论】:

我猜这是一个不完整的规范,您真正想要交付的内容需要更好地规范 w_i 的构造方式以及求和限制的更多细节。 【参考方案1】:

R 提供加权平均值。事实上, ?weighted.mean 显示了这个例子:

 ## GPA from Siegel 1994
 wt <- c(5,  5,  4,  1)/15
 x <- c(3.7,3.3,3.5,2.8)
 xm <- weighted.mean(x, wt)

还有一步:

v <- sum(wt * (x - xm)^2)

【讨论】:

事实证明,Hmisc 就是这样做的。 只是一个提示......如果你像我一样脑袋很厚,15 是个人重量的总和。在这种情况下,权重会被归一化。一开始我没听懂。 您忘记将 v 除以 n 或 n-1 @skan 上面的公式表示集合的总体方差。请注意,sum(wt) == 1 在表达式中乘以 wt 就是除法。 看来这个答案目前效果最好。我认为更一致的是v &lt;- weighted.mean( (x-xm)^2, wt ),因为当权重未标准化时,这也有效。【参考方案2】:

Hmisc 包包含您需要的功能。

因此:

x <- c(3.7,3.3,3.5,2.8)

wt <- c(5,  5,  4,  1)/15

xm <- wtd.mean(x, wt)

var <- wtd.var(x, wt)

sd <- sqrt(var)

不幸的是,Hmisc 包的作者没有包含明确的wtd.sd 函数。您必须对 wtd.var 求平方根。

查尔斯·康盖

【讨论】:

wtd.mean 有效,但您的示例中的 wtd.var 给出了“INF”。这是为什么呢? @Torvon 这现在在 Hmisc 的开发版本中得到修复。 github.com/harrelfe/Hmisc/issues/69 sum(wt) 不必为 1。【参考方案3】:

在使用wtd.var() 函数时,我也收到来自Hmisc 的错误。幸运的是,SDMTools 具有类似的功能,甚至可以直接为您计算 SD,而无需取 sqrt 方差。

library(SDMTools)

x <- c(3.7,3.3,3.5,2.8)
wt <- c(5,  5,  4,  1)/15  ## Note: no actual need to normalize weights to sum to 1, this will be done automatically.

wt.mean(x, wt)
wt.sd(x,wt)

wt.var(x, wt)

【讨论】:

SDMTools 不再维护。【参考方案4】:

Hmisc 具有功能wt.var(),正如其他人所指出的那样。

请注意,您需要了解您需要频率还是可靠性权重。在您的情况下,我相信您对可靠性权重感兴趣,因此需要明确设置normwt=TRUE。在这种情况下,您可以以任何格式给出您的权重(总和为 1,总和为 N,等等)。如果要使用频率权重,则需要注意如何指定权重。

library(Hmisc)

n <- 3
x <- seq_len(n)
w <- c(0.1, 0.2, 0.6)
w2 <- w / min(w)
w3 <- w / sum(w)

## reliability weights?
wtd.var(x = x, weights = w, normwt=TRUE)
#> [1] 0.95
wtd.var(x = x, weights = w2, normwt=TRUE)
#> [1] 0.95
wtd.var(x = x, weights = w3, normwt=TRUE)
#> [1] 0.95

## frequency weights?
wtd.var(x = x, weights = w)
#> Warning in wtd.var(x = x, weights = w): only one effective observation; variance
#> estimate undefined
#> [1] -4.222222
wtd.var(x = x, weights = w2)
#> [1] 0.5277778
wtd.var(x = x, weights = w3)
#> Warning in wtd.var(x = x, weights = w3): only one effective observation;
#> variance estimate undefined
#> [1] Inf

由reprex package (v0.3.0) 于 2020 年 8 月 26 日创建

【讨论】:

频率/可靠性权重之间的差异没有得到足够的重视。 +1【参考方案5】:

Hmisc 包提供了这个功能:

http://rgm2.lab.nig.ac.jp/RGM2/func.php?rd_id=Hmisc:wtd.stats

【讨论】:

以上是关于计算加权平均值和标准差的主要内容,如果未能解决你的问题,请参考以下文章

计算多个变量的一个均值和标准差

怎么算标准差?

如何计算 RDD[Long] 的标准差和平均值?

平均值μ;方差σ2;标准差σ

从平均值和标准差计算 Z 分数

如何有效地计算pyspark中的平均值和标准差