Question

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))
Was it helpful?

Solution

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

OTHER TIPS

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top