2011-12-19 34 views
10

Trong khi sử dụng chức năng princomp() trong R, gặp phải lỗi sau: "covariance matrix is not non-negative definite".Làm thế nào để sử dụng hàm princomp() trong R khi ma trận hiệp phương sai có số không?

Tôi nghĩ, điều này là do một số giá trị bằng không (thực sự gần bằng không, nhưng trở thành số không trong làm tròn) trong ma trận hiệp phương sai.

Có một công việc xung quanh để tiến hành với PCA khi ma trận hiệp phương sai có chứa số không?

[FYI: lấy ma trận hiệp phương sai là bước trung gian trong cuộc gọi princomp(). Tệp dữ liệu để tạo lại lỗi này có thể được tải xuống từ đây - http://tinyurl.com/6rtxrc3]

+0

Thêm đầu vào mẫu để làm cho vấn đề có thể tái sản xuất rất hữu ích cho người trả lời. –

+1

Nếu bạn nhìn vào 'stats ::: princomp.default' bạn sẽ thấy rằng lỗi xảy ra khi bạn có các giá trị riêng âm trong ma trận hiệp phương sai. –

+0

@ Richie Cotton: Tôi ước tôi có thể cung cấp. Dữ liệu của tôi là rất lớn (10K x 10K) và tôi đã không tìm ra phần gây ra lỗi. Tôi sẽ rất vui khi được biết liệu có cách nào để tôi có thể trích xuất một phần dữ liệu rắc rối và đăng nó ở đây không! – 384X21

Trả lời

9

Chiến lược đầu tiên có thể là giảm đối số dung sai. Nhìn tôi rằng princomp sẽ không vượt qua một đối số khoan dung nhưng rằng prcomp chấp nhận một đối số 'tol'. Nếu không có hiệu quả, điều này sẽ xác định vectơ đó có gần-zero hiệp phương sai:

nr0=0.001 
which(abs(cov(M)) < nr0, arr.ind=TRUE) 

Và điều này sẽ xác định vectơ với giá trị riêng tiêu cực:

which(eigen(M)$values < 0) 

Sử dụng ví dụ h9 trên trang trợ giúp (qr):

> which(abs(cov(h9)) < .001, arr.ind=TRUE) 
     row col 
[1,] 9 4 
[2,] 8 5 
[3,] 9 5 
[4,] 7 6 
[5,] 8 6 
[6,] 9 6 
[7,] 6 7 
[8,] 7 7 
[9,] 8 7 
[10,] 9 7 
[11,] 5 8 
[12,] 6 8 
[13,] 7 8 
[14,] 8 8 
[15,] 9 8 
[16,] 4 9 
[17,] 5 9 
[18,] 6 9 
[19,] 7 9 
[20,] 8 9 
[21,] 9 9 
> qr(h9[-9,-9])$rank 
[1] 7     # rank deficient, at least at the default tolerance 
> qr(h9[-(8:9),-(8:9)])$ take out only the vector with the most dependencies 
[1] 6     #Still rank deficient 
> qr(h9[-(7:9),-(7:9)])$rank 
[1] 6 

cách tiếp cận khác có thể sử dụng chức năng alias:

alias(lm(rnorm(NROW(dfrm)) ~ dfrm)) 
+0

Rất đẹp. Tôi đã không đi qua 'bí danh' trước đây. –

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