Cách tạo ma trận hiệp phương sai tùy ý


21

Ví dụ, trong R, MASS::mvrnorm()chức năng này rất hữu ích để tạo dữ liệu để chứng minh những điều khác nhau trong thống kê. Nó nhận một Sigmađối số bắt buộc là ma trận đối xứng chỉ định ma trận hiệp phương sai của các biến. Làm cách nào để tạo ma trận đối xứng với các mục tùy ý?n×n


3
Tôi nghĩ rằng câu hỏi này sẽ có lợi từ việc được chỉnh sửa để tập trung vào "làm thế nào tôi có thể tạo ra một ma trận hiệp phương sai tùy ý" và ít hơn về khía cạnh mã hóa. Chắc chắn có một vấn đề thống kê cơ bản về chủ đề ở đây, như được thể hiện bằng câu trả lời.
Cá bạc

Câu trả lời:


22

Tạo một ma trận A với giá trị tùy ýn×nMột

và sau đó sử dụng dạng ma trận hiệp phương sai của bạn. Σ= =MộtTMột

Ví dụ

n <- 4  
A <- matrix(runif(n^2)*2-1, ncol=n) 
Sigma <- t(A) %*% A

Tương tự như vậy , Sigma <- A + t(A).
rsl

6
@MoazzemHossen: Đề xuất của bạn sẽ tạo ra một ma trận đối xứng, nhưng nó có thể không phải lúc nào cũng là nửa cực dương (ví dụ: đề xuất của bạn có thể tạo ra một ma trận có giá trị riêng âm) và do đó, nó có thể không phù hợp như một ma trận hiệp phương sai
Henry

Có, tôi nhận thấy rằng R trả về lỗi trong trường hợp cách được đề xuất của tôi tạo ra ma trận không phù hợp.
rsl

4
Lưu ý rằng nếu bạn thích một ma trận tương quan để có thể diễn giải tốt hơn, có chức năng ? Cov2cor , có thể được áp dụng sau đó.
gung - Phục hồi Monica

1
@ B11b: Bạn cần ma trận hiệp phương sai của bạn là bán xác định dương. Điều đó sẽ đặt ra một số giới hạn cho các giá trị hiệp phương sai, không hoàn toàn rõ ràng khi n>2
Henry

24

Tôi muốn có quyền kiểm soát các đối tượng tôi tạo, ngay cả khi chúng có thể tùy ý.

Xem xét, sau đó, rằng tất cả các khả năng hiệp phương sai ma trận Σ có thể được thể hiện dưới dạngn×nΣ

Σ=P Diagonal(σ1,σ2,,σn) P

nơi là một trực giao ma trận và σ 1σ 2σ n0 .Pσ1σ2σn0

Về mặt hình học, điều này mô tả một cấu trúc hiệp phương sai với một loạt các thành phần chính có kích thước . Các thành phần này chỉ trong các hướng dẫn của các hàng của P . Xem các số liệu tại Ý nghĩa của phân tích thành phần chính, hàm riêng & giá trị riêng cho các ví dụ với n = 3 . Đặt σ i sẽ đặt độ lớn của hiệp phương sai và kích thước tương đối của chúng, từ đó xác định bất kỳ hình dạng elip mong muốn nào. Các hàng của P định hướng các trục của hình dạng mà bạn thích.σiPn=3σiP

Một đại số và lợi ích của phương pháp này tính toán là khi , Σ được dễ dàng đảo ngược (mà là một hoạt động phổ biến trên hiệp phương sai ma trận):σn>0Σ

Σ1=P Diagonal(1/σ1,1/σ2,,1/σn) P.

Đừng quan tâm đến các hướng, mà chỉ về phạm vi kích thước của ? Điều đó tốt: bạn có thể dễ dàng tạo ra một ma trận trực giao ngẫu nhiên. Chỉ cần bọc n 2 iid các giá trị chuẩn vào một ma trận vuông và sau đó trực giao hóa nó. Nó gần như chắc chắn sẽ làm việc (với điều kiện n không phải là rất lớn). Phân tách QR sẽ làm điều đó, như trong mã nàyσin2n

n <- 5
p <- qr.Q(qr(matrix(rnorm(n^2), n)))

Công trình này vì -variate phân phối multinormal để tạo ra là "hình elip": nó là bất biến theo tất cả quay và phản xạ (thông qua nguồn gốc). Do đó, tất cả các ma trận trực giao được tạo ra đồng nhất, như lập luận tại Làm thế nào để tạo các điểm phân bố đồng đều trên bề mặt của hình cầu đơn vị 3-d? .n

Một cách nhanh chóng để có được từ Pσ i , một khi bạn đã xác định hoặc tạo ra chúng, sử dụng và khai thác 's tái sử dụng các mảng trong phép tính số học, như trong ví dụ này với σ = ( σ 1 , ... , σ 5 ) = ( 5 , 4 , 3 , 2 , 1 ) :ΣPσTôicrossprodRσ= =(σ1,Giáo dục,σ5)= =(5,4,3,2,1)

Sigma <- crossprod(p, p*(5:1))

Như một tấm séc, sự phân hủy Số ít giá trị gia tăng phải trả lại cả hai P ' . Bạn có thể kiểm tra nó bằng lệnhσP'

svd(Sigma)

Tất nhiên nghịch đảo Sigmathu được chỉ bằng cách thay đổi phép nhân bằng thành một phép chia:σ

Tau <- crossprod(p, p/(5:1))

Bạn có thể xác minh điều này bằng cách xem zapsmall(Sigma %*% Tau), mà nên là ma trận sắc. Một nghịch đảo tổng quát (cần thiết cho tính toán hồi quy) thu được bằng cách thay thế bất kỳ σ i0 bằng 1 / σ i , chính xác như trên, nhưng giữ bất kỳ số không trong σ i như họ.n×nσTôi01/σTôiσTôi


P

1
Có thể đáng nói rằng các giá trị số ít trong svd(Sigma)sẽ được sắp xếp lại - điều đó làm tôi bối rối trong một phút.
FrankD

1

Bạn có thể mô phỏng ma trận xác định dương ngẫu nhiên từ phân phối Wishart bằng cách sử dụng chức năng "rWishart" từ gói "thống kê" được sử dụng rộng rãi.

n <- 4
rWishart(1,n,diag(n))

1

Có một gói dành riêng cho điều đó, clusterGeneration(được viết bởi Harry Joe, một tên tuổi lớn trong lĩnh vực đó).

Có hai chức năng chính:

  • genPositiveDefMat tạo ma trận hiệp phương sai, 4 phương thức khác nhau
  • rcorrmatrix : tạo ma trận tương quan

Ví dụ nhanh:

library(clusterGeneration)
#> Loading required package: MASS
genPositiveDefMat("unifcorrmat",dim=3)
#> $egvalues
#> [1] 15.408962  5.673916  1.228842
#> 
#> $Sigma
#>          [,1]     [,2]     [,3]
#> [1,] 6.714871 1.643449 6.530493
#> [2,] 1.643449 6.568033 2.312455
#> [3,] 6.530493 2.312455 9.028815
genPositiveDefMat("eigen",dim=3)
#> $egvalues
#> [1] 8.409136 4.076442 2.256715
#> 
#> $Sigma
#>            [,1]       [,2]      [,3]
#> [1,]  2.3217300 -0.1467812 0.5220522
#> [2,] -0.1467812  4.1126757 0.5049819
#> [3,]  0.5220522  0.5049819 8.3078880

Được tạo vào ngày 2019-10-27 bởi gói reprex (v0.3.0)

Cuối cùng, lưu ý rằng một cách tiếp cận khác là thực hiện thử đầu tiên từ đầu, sau đó sử dụng Matrix::nearPD()để làm cho ma trận của bạn xác định dương.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.