Làm thế nào để tạo ra các số ngẫu nhiên tương quan (phương tiện, phương sai và mức độ tương quan)?


53

Tôi xin lỗi nếu điều này có vẻ hơi quá cơ bản, nhưng tôi đoán tôi chỉ đang tìm cách xác nhận sự hiểu biết ở đây. Tôi có cảm giác tôi phải làm điều này theo hai bước và tôi đã bắt đầu thử tìm hiểu các ma trận tương quan, nhưng nó chỉ bắt đầu có vẻ thực sự liên quan. Tôi đang tìm kiếm một lời giải thích ngắn gọn (lý tưởng với các gợi ý về giải pháp mã giả) về một cách nhanh chóng, lý tưởng để tạo ra các số ngẫu nhiên tương quan.

Đưa ra hai biến số chiều cao và cân nặng giả với các phương tiện và phương sai đã biết và một mối tương quan nhất định, tôi nghĩ rằng về cơ bản tôi đang cố gắng hiểu bước thứ hai này sẽ như thế nào:

   height = gaussianPdf(height.mean, height.variance)
   weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient), 
                        correlated_variance(height.variance, 
                        correlation_coefficient))
  • Làm thế nào để tôi tính trung bình và phương sai tương quan? Nhưng tôi muốn xác nhận rằng đó thực sự là vấn đề có liên quan ở đây.
  • Tôi có cần phải dùng đến thao tác ma trận không? Hay tôi có điều gì khác rất sai trong cách tiếp cận cơ bản của tôi đối với vấn đề này?

1
Không chắc chắn tôi hiểu bạn chính xác, nhưng bạn không phải tính toán "trung bình và phương sai tương quan". Nếu bạn giả định rằng các biến là hai biến bình thường, thì nó đủ để chỉ định các phương tiện và phương sai riêng lẻ và mối tương quan. Có phần mềm cụ thể nào bạn muốn sử dụng cho việc này không?
đánh dấu999


Câu trả lời:


44

Để trả lời câu hỏi của bạn về "một cách lý tưởng nhanh chóng tốt để tạo số ngẫu nhiên tương quan": Cho một mong muốn sai-hiệp phương sai ma trận đó là theo định nghĩa tích cực nhất định, sự phân hủy Cholesky của nó là: = ; là ma trận tam giác thấp hơn.C L L T L LCCLLTL

Nếu bây giờ bạn sử dụng ma trận để chiếu một vectơ biến ngẫu nhiên không tương quan , thì phép chiếu kết quả sẽ là các biến ngẫu nhiên tương quan.X Y = L XLXY=LX

Bạn có thể tìm thấy một lời giải thích ngắn gọn tại sao điều này xảy ra ở đây .


Cảm ơn! Điều này rất hữu ích. Tôi nghĩ rằng ít nhất tôi có một ý thức tốt hơn về những gì tôi cần xem xét tiếp theo.
Joseph Weissman

7
Có phải phương pháp này chỉ áp dụng cho các phân phối Gaussian (như được chỉ định trong câu hỏi) hoặc có thể được sử dụng để tạo các biến tương quan theo các phân phối khác không? Nếu không, bạn có biết một phương pháp có thể được sử dụng trong trường hợp đó không?
user000001 ngày

1
@Michael: Vâng. Đã nói rằng cho là một ma trận hiệp phương sai hợp lệ, phân tách Cholesky là cách nhanh nhất. Bạn cũng có thể lấy ma trận căn bậc hai (đối xứng) của bằng cách sử dụng SVD (vì vậy , trong đó từ ) nhưng điều đó sẽ nhiều hơn đắt quá X C C = X X = X X T X = U S 0,5 V T C = U S V TCXCC=XX=XXTX=US0.5VTC=USVT
usεr11852 nói Phục hồi Monic

1
@Michael: Tất nhiên rồi. Hiệp phương sai của họ sẽ (xấp xỉ) giống nhau, không phải là số.
usεr11852 nói Phục hồi Monic

1
@Sid: Mọi phân phối liên tục không được hỗ trợ trên toàn bộ dòng thực sẽ ngay lập tức bị lỗi. Ví dụ: nếu chúng tôi sử dụng đồng phục chúng tôi không thể đảm bảo rằng "các số tương quan" sẽ nằm trong ; tương tự như vậy đối với một Poisson, chúng ta sẽ kết thúc với các số không rời rạc. Ngoài ra, bất kỳ phân phối nào có tổng phân phối không phải là phân phối giống nhau (ví dụ: tổng phân phối phân phối không dẫn đến phân phối ) cũng sẽ thất bại. Trong tất cả các trường hợp được đề cập, các số được tạo ra sẽ tương quan theo nhưng chúng sẽ không tương ứng với phân phối mà chúng tôi đã bắt đầu. [ 0 , 1 ] t t CU[0,1][0,1]ttC
usεr11852 nói Phục hồi Monic

36

+1 cho @ user11852 và @ jem77bfp, đây là những câu trả lời hay. Hãy để tôi tiếp cận điều này từ một khía cạnh khác, không phải vì tôi nghĩ nó thực sự tốt hơn trong thực tế , mà bởi vì tôi nghĩ nó mang tính hướng dẫn. Dưới đây là một vài sự thật có liên quan mà chúng tôi đã biết:

  1. X Y N ( 0 , 1 )r là độ dốc của đường hồi quy khi cả và được chuẩn hóa , nghĩa là , XYN(0,1)
  2. Y Xr2 là tỷ lệ của phương sai trong quy cho phương sai trong , YX



    (cũng, từ các quy tắc cho phương sai ):

  3. phương sai của một biến ngẫu nhiên nhân với một hằng số là bình phương nhân với phương sai ban đầu:
    Var[aX]=a2Var[X]
  4. phương sai thêm , tức là phương sai của tổng hai biến ngẫu nhiên (giả sử chúng là độc lập) là tổng của hai phương sai:
    Var[X+ε]=Var[X]+Var[ε]

Bây giờ, chúng ta có thể kết hợp bốn sự kiện này để tạo ra hai biến thông thường tiêu chuẩn mà quần thể của chúng sẽ có mối tương quan nhất định, (đúng hơn, ), mặc dù các mẫu bạn tạo sẽ có tương quan mẫu khác nhau. Ý tưởng là tạo ra một biến giả ngẫu nhiên , đó là tiêu chuẩn thông thường, , sau đó tìm một hệ số, và phương sai lỗi, , sao cho , trong đó . (Lưu ý rằng phải là để nó hoạt động và hơn nữa, .) Vì vậy, bạn bắt đầu vớiρ X N ( 0 , 1 ) a v e Y N ( 0 , a 2 + v e ) a 2 + v e = 1 | một | 1 a = r r a 1 - r 2 x i e i v e y irρXN(0,1)aveYN(0,a2+ve)a2+ve=1|a| 1a=rr mà bạn muốn; đó là hệ số của bạn, . Sau đó, bạn tìm ra phương sai lỗi mà bạn sẽ cần, đó là . (Nếu phần mềm của bạn yêu cầu bạn sử dụng độ lệch chuẩn, hãy lấy căn bậc hai của giá trị đó.) Cuối cùng, với mỗi biến thể giả ngẫu nhiên, , mà bạn đã tạo, tạo ra một sai số giả ngẫu nhiên, , với phương sai lỗi thích hợp , và tính toán các biến giả ngẫu nhiên tương quan, , bằng cách nhân và thêm. a1r2xieiveyi

Nếu bạn muốn làm điều này trong R, đoạn mã sau có thể phù hợp với bạn:

correlatedValue = function(x, r){
  r2 = r**2
  ve = 1-r2
  SD = sqrt(ve)
  e  = rnorm(length(x), mean=0, sd=SD)
  y  = r*x + e
  return(y)
}

set.seed(5)
x = rnorm(10000)
y = correlatedValue(x=x, r=.5)

cor(x,y)
[1] 0.4945964

(Chỉnh sửa: Tôi quên đề cập :) Như tôi đã mô tả, quy trình này cung cấp cho bạn hai biến tương quan chuẩn thông thường. Nếu bạn không muốn các quy tắc chuẩn , nhưng muốn các biến có một số phương tiện cụ thể (không phải 0) và SD (không phải 1), bạn có thể chuyển đổi chúng mà không ảnh hưởng đến mối tương quan. Do đó, bạn sẽ trừ đi giá trị trung bình quan sát được để đảm bảo rằng giá trị trung bình chính xác bằng , nhân biến số với SD bạn muốn và sau đó thêm giá trị trung bình bạn muốn. Nếu bạn muốn giá trị trung bình quan sát dao động bình thường xung quanh giá trị trung bình mong muốn, bạn sẽ thêm lại chênh lệch ban đầu. Về cơ bản, đây là một phép biến đổi điểm z theo chiều ngược lại. Bởi vì đây là một biến đổi tuyến tính, biến được chuyển đổi sẽ có cùng mối tương quan với biến khác như trước đây. 0

Một lần nữa, điều này, ở dạng đơn giản nhất, chỉ cho phép bạn tạo ra một cặp biến tương quan (điều này có thể được nhân rộng, nhưng trở nên xấu nhanh), và chắc chắn không phải là cách thuận tiện nhất để hoàn thành công việc. Trong R, bạn sẽ muốn sử dụng ? Mvrnorm trong gói MASS , vì cả hai đều dễ dàng hơn và vì bạn có thể tạo nhiều biến với ma trận tương quan dân số nhất định. Tuy nhiên, tôi nghĩ rằng đáng để thực hiện quy trình này để xem một số nguyên tắc cơ bản diễn ra theo cách đơn giản.


Phương pháp hồi quy cơ bản này đặc biệt tốt khi cho phép một người tạo ra một Y ngẫu nhiên tương quan với bất kỳ số lượng "dự đoán" X hiện có nào . Tôi có đúng trong sự hiểu biết như vậy?
ttnphns

Nó phụ thuộc vào chính xác mô hình tương quan giữa các biến bạn muốn, @ttnphns. Bạn có thể lặp lại cái này qua cái khác, nhưng nó sẽ trở nên tẻ nhạt. Để tạo nhiều biến tương quan với một mẫu nhất định, tốt hơn là sử dụng phân tách Cholesky.
gung - Tái lập Monica

gung, bạn có biết cách sử dụng Cholesky để tạo một Y tương quan (xấp xỉ, như trong phương thức của bạn) theo một vectơ tương quan với một số X hiện tại (không mô phỏng) không?
ttnphns

@ttnphns, bạn muốn tạo một Y với một mối tương quan dân số nhất định với một tập hợp X, không phải là một tập hợp các biến p mà tất cả đều có tương quan dân số được xác định trước? Một cách đơn giản là viết phương trình hồi quy để tạo một chiếc mũ chữ Y từ chữ X của bạn, sau đó sử dụng phương pháp trên để tạo Y làm tương quan với chiếc mũ chữ Y của bạn. Bạn có thể hỏi một câu hỏi mới về nó, nếu bạn muốn.
gung - Tái lập Monica

1
Đây là những gì tôi muốn nói trong nhận xét ban đầu của mình: phương pháp này sẽ là phần mở rộng trực tiếp của những gì bạn nói trong câu trả lời của bạn: về cơ bản là phương pháp hồi quy (Hat).
ttnphns

16

Nói chung, đây không phải là điều đơn giản để làm, nhưng tôi tin rằng có các gói để tạo biến thông thường đa biến (ít nhất là trong R, xem mvrnormtrong MASSgói), trong đó bạn chỉ cần nhập ma trận hiệp phương sai và vectơ trung bình.

Ngoài ra còn có một cách tiếp cận "mang tính xây dựng" hơn. Giả sử chúng ta muốn mô hình hóa một vectơ ngẫu nhiên và chúng ta có hàm phân phối . Bước đầu tiên là lấy hàm phân phối biên; tức là tích hợp trên tất cả : Sau đó, chúng tôi tìm thấy - hàm nghịch đảo của - và cắm một biến ngẫu nhiên được phân phối đồng đều trên khoảng . Trong bước này, chúng tôi tạo tọa độ đầu tiên .(X1,X2)F(x1,x2)Fx2

FX1(x1)=F(x1,x2)dx2.
FX11FX1ξ1[0,1]x^1=FX11(ξ)

Bây giờ, vì chúng ta đã có một tọa độ, chúng ta cần cắm nó vào hàm phân phối ban đầu và sau đó nhận hàm phân phối có điều kiện với điều kiện : trong đó là hàm mật độ xác suất của phân phối cận biên ; tức là .F(x1,x2)x1=x^1

F(x2|X1=x^1)=F(x^1,x2)fX1(x^1),
fX1X1FX1(x1)=fX1(x1)

Sau đó, một lần nữa, bạn tạo một biến phân phối đồng đều trên (độc lập với ) và cắm nó vào nghịch đảo của . Do đó, bạn có được ; nghĩa là, thỏa mãn . Phương pháp này có thể được khái quát thành các vectơ có nhiều chiều hơn, nhưng nhược điểm của nó là bạn phải tính toán, phân tích hoặc bằng số, nhiều hàm. Ý tưởng cũng có thể được tìm thấy trong bài viết này: http://www.econ-pol.unisi.it/dmq/pdf/DMQ_WP_34.pdf .ξ2[0,1]ξ1F(x2|X1=x^1)x^2=(F(x2|X1=x^1))1(ξ)x^2F(x^2|X1=x^1)=ξ

Nếu bạn không hiểu ý nghĩa của việc cắm biến đồng nhất vào hàm phân phối xác suất nghịch đảo, hãy thử tạo một bản phác thảo về trường hợp đơn biến và sau đó nhớ cách giải thích hình học của hàm nghịch đảo.


Ý tưởng thông minh! Có sức hấp dẫn trực quan đơn giản. Nhưng có vẻ đắt tiền tính toán.
MichaelChirico

(+1) điểm rất tốt. Sẽ tốt hơn khi bắt đầu nói , sau đó nó sẽ tự nhiên hơn để tạo một phân phối gốc và sau đó phân phối có điều kiện. Rất xuất sắc! fX,Y(x,y)=fX(x)fY|X(y)
KevinKim

1

Nếu bạn đã sẵn sàng để từ bỏ hiệu quả, bạn có thể sử dụng một thuật ngữ vứt bỏ. Ưu điểm của nó là, nó cho phép mọi loại phân phối (không chỉ Gaussian).

Bắt đầu bằng cách tạo hai chuỗi số không ngẫu nhiên và với bất kỳ phân phối mong muốn nào. Đặt theo giá trị mong muốn của hệ số tương quan. Sau đó làm như sau:{xi}i=1N{yi}i=1NC

1) Tính hệ số tương quancold=corr({xi},{yi})

2) Tạo hai munbers ngẫu nhiên vàn1n2:1n1,2N

3) Hoán đổi số vàxn1xn2

4) Tính tương quan mớicnew=corr({xi},{yi})

5) Nếusau đó giữ trao đổi. Khác hoàn tác trao đổi.|Ccnew|<|Ccold|

6) Nếu dừng, khác goto 1)|Cc|<ϵ

Hoán đổi ngẫu nhiên sẽ không làm thay đổi phân phối biên của .xi

Chúc may mắn!


Tôi hơi bối rối bởi ký hiệu. phải là vectơ không? Nếu không, đúng nghĩa là gì? xicorr(xi,yi)
Vách đá AB

Tôi xin lỗi, tôi là người có sở thích thống kê - tôi không quen thuộc với các ký hiệu. là một số, là một chuỗi các số (được đặc trưng bởi giá trị trung bình, phương sai, phân phối xác suất) và cũng vậy . không được viết tốt, nó nên được sửaxi{xi}ycorr(xi,yi)corr({xi},{yi})=(1/N)Σi=1N(xix¯)(yyy¯)
F. Jatpil

Tôi thấy, làm cho ý nghĩa hoàn hảo. Tôi đã bỏ qua " " trong chính xácc o r r ( { x i } , { y i } ){}corr({xi},{yi})
Cliff AB
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.