35

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

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

谢谢

4

5 回答 5

36

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)
于 2012-04-07T02:23:28.007 回答
32

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。

查尔斯·康盖

于 2014-06-24T10:59:42.420 回答
7

Hmisc使用该wtd.var()功能时,我也遇到错误。幸运的是,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)
于 2017-08-18T18:22:29.300 回答
2

正如其他人所指出的,包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 包(v0.3.0)于 2020 年 8 月 26 日创建

于 2020-08-26T23:02:21.440 回答
0

Hmisc 包提供了这个功能:

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

于 2012-04-08T02:27:10.013 回答