Làm cách nào để tạo dữ liệu với ma trận tương quan được chỉ định trước?


19

Tôi đang cố gắng tạo chuỗi ngẫu nhiên tương quan với mean = 0 , variance = , hệ số tương quan = . Trong mã dưới đây, tôi sử dụng & làm độ lệch chuẩn và & làm phương tiện.10.8s1s2m1m2

p = 0.8 
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2

Điều này cho tôi đúng corrcoef()0,8 giữa xy. Câu hỏi của tôi là làm thế nào tôi có thể tạo ra một chuỗi có nghĩa là nếu tôi muốn znó cũng tương quan với y(có cùng tương quan ), nhưng không phải với . Có một công thức cụ thể tôi cần biết? Tôi đã tìm thấy một nhưng không thể hiểu nó.r=0.8x


Câu trả lời:


21

Có vẻ như bạn đang hỏi cách tạo dữ liệu với ma trận tương quan cụ thể.

Một thực tế hữu ích ở đây là nếu bạn có một véc tơ ngẫu nhiên với hiệp phương sai ma trận Σ , thì ngẫu nhiên vector Một x có nghĩa là A E ( x ) và ma trận hiệp phương saixΣAxAE(x) . Vì vậy, nếu bạn bắt đầu với dữ liệu có nghĩa là 0, nhân với A sẽ không thay đổi điều đó, vì vậy yêu cầu đầu tiên của bạn dễ dàng được thỏa mãn. Ω=AΣATA

Hãy nói rằng bạn bắt đầu với (zero bình) dữ liệu không tương quan (tức là ma trận hiệp phương sai là đường chéo) - kể từ khi chúng ta đang nói về ma trận tương quan, chúng ta hãy chỉ mất . Bạn có thể chuyển đổi dữ liệu này thành dữ liệu với ma trận hiệp phương sai đã cho bằng cách chọn AΣ=IAcăn bậc hai Cholesky của - sau đó A x sẽ có mong muốn hiệp phương sai ma trận Ω .ΩAxΩ

Trong ví dụ của bạn, bạn dường như muốn một cái gì đó như thế này:

Ω=(1.80.81.80.81)

Thật không may, ma trận không xác định dương, vì vậy nó không thể là ma trận hiệp phương sai - bạn có thể kiểm tra điều này bằng cách thấy rằng định thức là âm. Có lẽ, thay vào đó

Ω=(1.8.3.81.8.3.81)    or   Ω=(12/302/312/302/31)

sẽ đủ. Tôi không chắc làm thế nào để tính toán căn bậc hai cholesky trong matlab (dường như là những gì bạn đang sử dụng) nhưng trong Rbạn có thể sử dụng chol()hàm.

Trong ví dụ này, cho hai s liệt kê ở trên các bội số ma trận thích hợp (tương ứng) sẽ làΩ

A=(100.8.60.3.933.1972)    or   A=(1002/3.745300.8944.4472)

Các Rmã được sử dụng để đi đến được điều này:

x = matrix(0,3,3)
x[1,]=c(1,.8,.3)
x[2,]=c(.8,1,.8)
x[3,]=c(.3,.8,1)
t(chol(x))

     [,1]      [,2]      [,3]
[1,]  1.0 0.0000000 0.0000000
[2,]  0.8 0.6000000 0.0000000
[3,]  0.3 0.9333333 0.1972027

x[1,]=c(1,2/3,0)
x[2,]=c(2/3,1,2/3)
x[3,]=c(0,2/3,1)
t(chol(x))

      [,1]      [,2]      [,3]
[1,] 1.0000000 0.0000000 0.0000000
[2,] 0.6666667 0.7453560 0.0000000
[3,] 0.0000000 0.8944272 0.4472136

1
cholΩ

1
Tất nhiên điều đó đúng @cardinal - rất nhiều điều hợp lý về mặt lý thuyết trở nên tồi tệ khi bạn đang cố gắng thực hiện mọi thứ với số lượng ma trận gần như duy nhất. Tôi đã (thuận tiện) tưởng tượng ra tình huống mà ma trận tương quan mục tiêu không ở trong vương quốc nơi đây là một vấn đề. Thật tốt khi bạn chỉ ra điều này - cảm ơn (và cảm ơn vì đã chỉnh sửa câu trả lời khác của tôi)
Macro

1
Lý do chính khiến tôi suy nghĩ về điều này là do con mắt nhạy bén của bạn khi nhận ra rằng đề xuất đầu tiên của OP thậm chí còn không tích cực. Và, hy vọng việc chỉnh sửa cho câu hỏi khác không quá nhiệt tình; Tôi thích cả hai câu trả lời này.
Đức Hồng Y

7

Nếu bạn đang sử dụng R, bạn cũng có thể sử dụng hàm mvrnorm từ gói MASS, giả sử bạn muốn các biến được phân phối bình thường. Việc triển khai tương tự như mô tả của Macro ở trên, nhưng sử dụng các hàm riêng của ma trận tương quan thay vì phân rã chunkky và chia tỷ lệ với phân rã giá trị số ít (nếu tùy chọn theo kinh nghiệm được đặt thành đúng).

XΣγλΣ

X=γλXT

ΣX

Lưu ý rằng ma trận tương quan phải có giá trị xác định dương, nhưng chuyển đổi nó bằng hàm nearPD từ gói Matrix trong R sẽ hữu ích.


1

ΣyxΣx=IΣyΛV ma trận của vector riêng cột.

Σy=VΛVT=(VΛ)(ΛTVT)=AAT .

y=Ax

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.