2012-04-06 18 views
18

Ho una serie storica x_0 ... x_t. Vorrei calcolare la varianza ponderata in modo esponenziale dei dati. Cioè:Calcolo della media ponderata e deviazione standard

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

L'obiettivo è quello di peso sostanzialmente le osservazioni che sono più indietro nel tempo meno. Questo è molto semplice da implementare, ma mi piacerebbe utilizzare il più funzionale possibile. Qualcuno sa a cosa corrisponde questo in R?

Grazie

+0

Sto indovinando che questa è una specifica incompleta e che cosa si vuole veramente consegnato richiederà una migliore specificazione di come w_i è costruito e maggiori dettagli sui limiti della somma. –

risposta

24

R fornisce media ponderata. ? Infatti, spettacoli weighted.mean questo esempio:

## 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) 

Un altro passo:

v <- sum(wt * (x - xm)^2) 
+1

sì, sto cercando la varianza ponderata però. non significa – Alex

+0

Hmisc, come si è scoperto, fa proprio questo. – Alex

+0

Nota l'ultima riga nella risposta. Questa è la varianza ponderata. –

16

Il pacchetto Hmisc contiene le funzioni hai bisogno.

Così:

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) 

Purtroppo l'autore del pacchetto Hmisc non ha incluso una funzione esplicita wtd.sd. Devi raddrizzare radice wtd.var.

Charles Kangai

+2

wtd.mean funziona, ma wtd.var nell'esempio fornisce "INF". perché? – Torvon

+0

@Torvon Ora è stato risolto nella versione di sviluppo di Hmisc. https://github.com/harrelfe/Hmisc/issues/69 –

+0

sum (wt) non deve essere 1. – vdesai

0

anch'io ottenere gli errori da Hmisc quando si utilizza la funzione di wtd.var(). Fortunatamente, SDMTools ha funzionalità comparabili e calcola anche la SD direttamente per te, senza dover prendere sqrt di varianza.

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)