2013-08-09 14 views
6

Volevo utilizzare una funzione che mi consenta di ottenere rapidamente una deviazione standard di un annuncio vettoriale, consentendomi di includere i pesi per gli elementi nel vettore. cioèdeviazione standard rapida con i pesi

sd(c(1,2,3))  #weights all equal 1 
#[1] 1 
sd(c(1,2,3,3,3)) #weights equal 1,1,3 respectively 
#[1] 0.8944272 

Per mezzi appesantiti posso usare wt.mean() da library(SDMTools) esempio

> mean(c(1,2,3)) 
[1] 2 
>  wt.mean(c(1,2,3),c(1,1,1)) 
[1] 2 
> 
>  mean(c(1,2,3,3,3)) 
[1] 2.4 
>  wt.mean(c(1,2,3),c(1,1,3)) 
[1] 2.4 

ma la funzione wt.sd non sembra fornire quello che ho pensato che volevo:

> sd(c(1,2,3)) 
[1] 1 
>  wt.sd(c(1,2,3),c(1,1,1)) 
[1] 1 
>  sd(c(1,2,3,3,3)) 
[1] 0.8944272 
>  wt.sd(c(1,2,3),c(1,1,3)) 
[1] 1.069045 

mi aspetto una funzione che restituisce 0.8944272 da me ponderata sd. Preferibilmente sarei usando questo su un data.frame come:

data.frame(x=c(1,2,3),w=c(1,1,3)) 
+0

Nota i documenti da 'SDMTools :: wt.var': "wt.var è la varianza imparziale del calcolo media ponderata utilizzando le equazioni di GNU Scentific Library". – Roland

risposta

9
library(Hmisc) 
sqrt(wtd.var(1:3,c(1,1,3))) 
#[1] 0.8944272 
3

È possibile utilizzare rep di replicare i valori in base al loro peso. Quindi, sd può essere calcolato per il vettore risultante.

x <- c(1, 2, 3) # values 
w <- c(1, 1, 3) # weights 

sd(rep(x, w)) 
[1] 0.8944272 
+0

+1 - ma date un'occhiata all'implementazione di 'Hmisc :: wtd.var', che sembra molto più scalabile. – flodel