2012-04-06 3 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

Цель состоит в том, чтобы в основном веса наблюдений, которые дальше назад во времени меньше. Это очень просто реализовать, но я хотел бы использовать максимально возможную встроенную функциональность. Кто-нибудь знает, что это соответствует в R?

Thanks

+0

Я предполагаю, что это неполные спецификации и то, что вы действительно хотите доставлены потребуют более точно определять, как w_i построена и более подробно о границах суммирования. –

ответ

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

+0

Hmisc, как оказалось, делает именно это. – Alex

+0

Обратите внимание на последнюю строку ответа. Это взвешенная дисперсия. –

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.

Чарльз Кангаи

+2

wtd.mean работает, но wtd.var в вашем примере дает «INF». почему это? – Torvon

+0

@Torvon Это теперь исправлено в версии для разработки Hmisc. https://github.com/harrelfe/Hmisc/issues/69 –

+0

Сумма (вес) не обязательно должна быть 1. – vdesai

0

Я тоже получаю ошибки от 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) 
Смежные вопросы