2013-08-09 40 views
6

Tôi muốn sử dụng hàm sẽ nhanh chóng cho tôi độ lệch chuẩn của quảng cáo vectơ cho phép tôi bao gồm trọng số cho các phần tử trong vectơ. tức là:độ lệch chuẩn nhanh với trọng số

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 

Đối với phương tiện có trọng số, tôi có thể sử dụng từ library(SDMTools) ví dụ:

> 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 

nhưng wt.sd chức năng dường như không cung cấp những gì tôi nghĩ rằng tôi muốn:

> 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 

Tôi đang mong đợi một hàm trả về 0.8944272 từ tôi trọng sd. Tốt nhất tôi sẽ được sử dụng này trên một data.frame như:

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

Lưu ý các tài liệu từ 'SDMTools :: wt.var': "wt.var là phương sai không thiên vị của tính trung bình có cân bằng phương trình của Thư viện Scentific GNU". – Roland

Trả lời

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

Bạn có thể sử dụng rep để tái tạo các giá trị theo trọng lượng của họ. Sau đó, sd có thể được tính cho vector kết quả.

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

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

+1 - nhưng có một cái nhìn tại triển khai 'Hmisc :: wtd.var', trông có vẻ mở rộng hơn. – flodel

Các vấn đề liên quan