计算加权平均值和标准差

Ale*_*lex 29 statistics r mean weighted

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

V = SUM{w_i*(x_i - x_bar)^2, i=1 to T} where SUM{w_i} = 1 and x_bar=SUM{w_i*x_i}
Run Code Online (Sandbox Code Playgroud)

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

目标是基本上加重观察的时间进一步缩短.这很容易实现,但我想尽可能多地使用内置的功能.有谁知道这对应于R?

谢谢

Mat*_*erg 32

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)
Run Code Online (Sandbox Code Playgroud)

更进一步:

v <- sum(wt * (x - xm)^2)
Run Code Online (Sandbox Code Playgroud)

  • 只是一个提示...如果你像我一样厚厚的骷髅,15是个人权重的总和.然后在这种情况下将权重归一化.起初我没有意识到这一点. (6认同)
  • @skan 上面的公式表示集合的总体方差。注意 `sum(wt) == 1` 所以在表达式中乘以 `wt` 就是除法。 (2认同)
  • 看来这个答案目前效果最好。我认为更一致的是 `v &lt;- Weighted.mean( (x-xm)^2, wt )` 因为当权重未标准化时这也有效。 (2认同)

小智 26

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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,Hmisc包的作者没有包含显式wtd.sd函数.你必须平根wtd.var.

Charles Kangai

  • wtd.mean有效,但你的例子中的wtd.var给出'INF'.这是为什么? (2认同)

Mic*_*gge 5

Hmisc使用该wtd.var()功能时,我也收到错误消息。幸运的是,它SDMTools具有可比的功能,甚至可以直接为您计算SD,而无需考虑方差。

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)
Run Code Online (Sandbox Code Playgroud)