2012-04-06 314 views
18

我有一个时间系列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} 

裁判:http://en.wikipedia.org/wiki/Weighted_mean#Weighted_sample_variance

的目标是基本重量是更久远的时间较少的观察。这是非常简单的实现,但我想尽可能多地使用funcitonality内置。有谁知道这在R中对应于什么?

谢谢

+0

我猜这是一个不完整的规范,你真正想要交付的东西需要更好地说明如何构造w_i以及更详细的求和限制。 – 2012-04-07 14:19:35

回答

24

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) 
+1

是的,我正在寻找加权差异。并不意味着 – Alex 2012-04-08 02:26:18

+0

事实证明,Hmisc就是这样做的。 – Alex 2012-04-08 02:26:30

+0

请注意答案中的最后一行。这是加权的方差。 – 2012-04-08 02:47:00

16

的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。

查尔斯康艾我也得到来自Hmisc错误使用wtd.var()功能时

+2

wtd.mean的作品,但在你的例子wtd.var给'INF'。这是为什么? – Torvon 2015-07-01 11:12:07

+0

@Torvon这现在已经修复在Hmisc的开发版本中。 https://github.com/harrelfe/Hmisc/issues/69 – 2017-04-19 19:03:03

+0

总和(wt)不一定是1。 – vdesai 2017-12-20 02:06:37

0

。幸运的是,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)