问题
I have a time series x_0 ... x_t
. I would like to compute the exponentially weighted variance of the data. That is:
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}
ref: http://en.wikipedia.org/wiki/Weighted_mean#Weighted_sample_variance
The goal is to basically weight observations that are further back in time less. This is very simple to implement but I would like to use as much built in funcitonality as possible. Does anyone know what this corresponds to in R?
Thanks
回答1:
R provides weighted mean. In fact, ?weighted.mean shows this example:
## 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)
One more step:
v <- sum(wt * (x - xm)^2)
回答2:
The Hmisc package contains the functions you need.
Thus:
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)
Unfortunately the author of the Hmisc package did not include an explicit wtd.sd
function. You have to square root wtd.var.
Charles Kangai
回答3:
I too get errors from Hmisc
when using the wtd.var()
function. Fortunately, SDMTools
has comparable functionality, and even calculates SD directly for you, without needing to take sqrt of variance.
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)
回答4:
Hmisc package provides this functionality:
http://rgm2.lab.nig.ac.jp/RGM2/func.php?rd_id=Hmisc:wtd.stats
来源:https://stackoverflow.com/questions/10049402/calculating-weighted-mean-and-standard-deviation