我有一个时间序列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?
由于
答案 0 :(得分: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)
又一步:
v <- sum(wt * (x - xm)^2)
答案 1 :(得分:23)
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。
Charles Kangai
答案 2 :(得分:4)
使用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)
答案 3 :(得分:0)
答案 4 :(得分:0)
包装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-08-26创建