Önceden belirlenmiş bir korelasyon matrisi ile nasıl veri oluşturabilirim?


19

Ortalama = , varyans = , korelasyon katsayısı = 0.8 ile korelasyonlu rasgele dizi üretmeye çalışıyorum . Aşağıdaki kodda, kullandığım ve standart sapmalar ve ve araç olarak kullanılır.1 0.8010.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

Bu bana doğru verir corrcoef()arasındaki 0.8 xve y. Benim sorum bir dizi üretebilir nasıl ben zde aynı korelasyon ile y(aynı korelasyon ile r=0.8 ), ancak ile değil istiyorum x. Bilmem gereken belirli bir formül var mı? Buldum birini ancak bunu anlayamadık.


Yanıtlar:


21

Belli bir korelasyon matrisi ile nasıl veri oluşturacağınızı soruyorsunuz.

Yararlı bir gerçektir ki, bir rasgele vektörün varsa kovaryans matrisi ile daha sonra rastgele vektör, ortalama sahiptir ve kovaryans matrisi . Yani, ortalama sıfır olan verilerle başlarsanız, çarpmak bunu değiştirmez, bu nedenle ilk gereksiniminiz kolayca karşılanır. Σ A x A E ( x ) Ω = A Σ A T AxΣAxAE(x)Ω=AΣATA

Diyelim ki ilişkili olmayan verilerle (ortalama kovaryans matrisi diyagonaldir) başlıyorsunuz - korelasyon matrisi hakkında konuştuğumuzdan, alalım . kalın kare kökü olarak yı seçerek verilen bir kovaryans matrisi ile verilere dönüştürebilirsiniz - o zaman istenen kovaryans matrisine .A Ω A x ΩΣ=IAΩAxΩ

Örneğinizde, şöyle bir şey istersiniz:

Ω=(1.80.81.80.81)

Ne yazık ki bu matris pozitif değil, bu nedenle bir kovaryans matrisi olamaz - determinantın negatif olduğunu görerek bunu kontrol edebilirsiniz. Belki de bunun yerine

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

yeterli olur. Matlab (ki ne kullandığınız gibi görünüyor) cholesky kare kök hesaplamak için emin değilim ama işlevi Rkullanabilirsiniz chol().

Bu örnekte, yukarıda listelenen iki için uygun matris katları (sırasıyla)Ω

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

Buna Rulaşmak için kullanılan kod:

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
MATLAB fonksiyonu da denir chol. neredeyse tekil ise, bunun sayısal olarak kararsız olabileceğini unutmayın . Bu durumda, örneğin SVD yoluyla elde edilen simetrik kare kökün kullanılması, sayısal kararlılık açısından genellikle daha iyi bir seçimdir. :)Ω
kardinal

1
Tabii ki doğru @cardinal - neredeyse tekil matrislerle sayısal olarak bir şeyler yapmaya çalıştığınızda teorik olarak haklı birçok şey kötüye gidiyor. Hedef korelasyon matrisinin bunun bir sorun olduğu alanda olmadığı durumu (uygun olarak) hayal ediyordum. Bunu işaret etmeniz iyi - teşekkürler (ve diğer cevabıma düzenleme için teşekkürler)
Macro

1
Bunu düşünmemizin ana nedeni, OP'nin ilk önerisinin bile pozitif kesin olmadığını fark etmedeki keskin gözünüzden kaynaklanıyordu. Ve umarım diğer soruya yapılan düzenleme aşırı hevesli değildi; Her iki yanıtı da seviyorum.
kardinal

7

R kullanıyorsanız, normal olarak dağıtılmış değişkenleri istediğinizi varsayarak, MASS paketinden mvrnorm işlevini de kullanabilirsiniz. Uygulama yukarıdaki Macro'nun açıklamasına benzer, ancak tekil değer ayrışmasıyla (ampirik seçenek true olarak ayarlanmışsa) cholesky ayrışma ve ölçekleme yerine korelasyon matrisinin özvektörlerini kullanır.

Eğer normal dağılımdan çekilen girişlerle bir matris, özvektörler pozitif kesin bir ilişki matrisi ve gelen öz değerleri, kare kökü bir kare matris diyagonal boyunca o zaman:Σ γ λ ΣXΣγλΣ

X=γλXT

X 'normalde dağılmış korelasyon matrisi olan ve sütun ortalamaları aynı olduğunda .XΣX

Korelasyon matrisinin pozitif tanımlı olması gerektiğini, ancak R'deki Matrix paketinden nearPD işleviyle dönüştürmenin faydalı olacağını unutmayın.


1

Cholesky çarpanlarına ayırmayan alternatif bir çözüm aşağıdadır. İstediğiniz kovaryans matrisini yapalım ve ile verileriniz olduğunu varsayalım . nin özdeğerlerin diyagonal matrisi ve sütun özvektörlerinin matrisi ile pozitif kesin olduğunu varsayalım . x Σ x = I Σ y Λ VΣyxΣx=IΣyΛV

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

y=Ax istenilen verileri üretir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.