2015-06-07 21 views
7

Chức năng chuẩn cov tính ma trận hiệp phương sai mẫu, tôi muốn có ma trận hiệp phương sai dân số.Cách xác định lại cov để tính toán ma trận hiệp phương sai dân số

tôi thử như sau:

cov.pop <- function(x,y=NULL) { 
    cov(x,y)*(length(x)-1)/length(x) 
} 

> sapply(list(Apple,HP,Microsoft),cov.pop,y=Apple) #correct 
[1] 0.7861672 0.1363396 0.2223303 
> sapply(list(Apple,HP,Microsoft),cov.pop,y=HP) #correct 
[1] 0.13633964 0.09560376 0.05226032 
> sapply(list(Apple,HP,Microsoft),cov.pop,y=Microsoft) #correct 
[1] 0.22233028 0.05226032 0.13519964 
> cov.pop(cbind(Apple,HP,Microsoft)) #not correct 
       Apple   HP Microsoft 
Apple  0.8444018 0.14643887 0.23879919 
HP  0.1464389 0.10268552 0.05613145 
Microsoft 0.2387992 0.05613145 0.14521443 

Câu hỏi của tôi
Có một cách đơn giản để thay đổi cov.pop chức năng để có được ma trận hiệp phương sai dân có đúng không?

Trả lời

5

Tôi đoán kết quả là khác nhau vì length trong matrix (tức cbind(Apple, HP, Microsoft)length trong mỗi phần tử list không giống

cov.pop <- function(x,y=NULL) { 
    cov(x,y)*(NROW(x)-1)/NROW(x) 
    } 

Sử dụng một ví dụ dữ liệu

set.seed(24) 
Apple <- rnorm(140) 
HP <- rnorm(140) 
Microsoft <- rnorm(140) 

cov.pop(cbind(Apple,HP,Microsoft)) 
#    Apple   HP Microsoft 
#Apple  0.946489639 0.006511604 0.02518080 
#HP  0.006511604 1.015532869 0.04940075 
#Microsoft 0.025180805 0.049400745 1.08388185 

sapply(list(Apple,HP,Microsoft),cov.pop,y=Apple) 
#[1] 0.946489639 0.006511604 0.025180805 

sapply(list(Apple,HP,Microsoft),cov.pop,y=HP) 
#[1] 0.006511604 1.015532869 0.049400745 

sapply(list(Apple,HP,Microsoft),cov.pop,y=Microsoft) 
#[1] 0.02518080 0.04940075 1.08388185 
+0

+1 và Tôi nghĩ về một cái gì đó dọc theo những dòng đó, nhưng 'NROW (x)' thực sự là thủ thuật :-) – vonjd

+1

@vonjd Vui mừng khi biết rằng nó hoạt động. Cảm ơn vì bạn đã phản hồi – akrun

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