Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

quick standard deviation with weights

I wanted to use a function that would quickly give me a standard deviation of a vector ad allow me to include weights for elements in the vector. i.e.

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

For weighted means I can use wt.mean() from library(SDMTools) e.g.

>  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

but the wt.sd function does not seem to provide what I thought I wanted:

>   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

I am expecting a function that returns 0.8944272 from me weighted sd. Preferably I would be using this on a data.frame like:

data.frame(x=c(1,2,3),w=c(1,1,3))
like image 794
user1320502 Avatar asked Aug 09 '13 10:08

user1320502


2 Answers

library(Hmisc)
sqrt(wtd.var(1:3,c(1,1,3)))
#[1] 0.8944272
like image 54
Roland Avatar answered Oct 09 '22 16:10

Roland


You can use rep to replicate the values according to their weights. Then, sd can be computed for the resulting vector.

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

sd(rep(x, w))
[1] 0.8944272
like image 38
Sven Hohenstein Avatar answered Oct 09 '22 16:10

Sven Hohenstein