Menghasilkan data dengan matriks kovarians sampel yang diberikan

22

Diberikan matriks kovarians , bagaimana cara menghasilkan data sedemikian rupa sehingga memiliki sampel matriks kovarians \ hat {\ boldsymbol \ Sigma} = \ boldsymbol \ Sigma_s ?Σ = Σ sΣsΣ^=Σs


Lebih umum: kita sering tertarik untuk menghasilkan data dari kepadatan f(x|θ) , dengan data x diberikan beberapa parameter vektor θ . Ini menghasilkan sampel, yang darinya kita dapat lagi memperkirakan nilai θ^ . Yang saya minati adalah masalah sebaliknya: Bagaimana jika kita diberikan seperangkat parameter θs , dan kami ingin membuat sampel x sedemikian rupa, sehingga θ^=θs .

Apakah ini masalah yang diketahui? Apakah metode seperti itu bermanfaat? Apakah algoritma tersedia?

Kees Mulder
sumber
Solusi scalable disediakan oleh Attilio Meucci. Lihat Artikel Risiko ini dan kode matlab
Peter Cotton

Jawaban:

16

Ada dua situasi khas yang berbeda untuk masalah seperti ini:

i) Anda ingin menghasilkan sampel dari distribusi tertentu yang karakteristik populasinya cocok dengan yang ditentukan (tetapi karena variasi pengambilan sampel, Anda tidak memiliki karakteristik sampel yang sama persis).

ii) Anda ingin menghasilkan sampel yang karakteristik sampelnya cocok dengan yang ditentukan (tetapi, karena kendala pencocokan jumlah sampel dengan sekumpulan nilai yang ditentukan sebelumnya, tidak benar-benar berasal dari distribusi yang Anda inginkan).

Anda menginginkan case kedua - tetapi Anda mendapatkannya dengan mengikuti pendekatan yang sama dengan case pertama, dengan langkah standardisasi tambahan.

Jadi untuk normals multivariat, dapat dilakukan dengan cara yang cukup mudah:

Dengan case pertama Anda dapat menggunakan normals acak tanpa struktur populasi (seperti standar normal iid yang memiliki harapan 0 dan matriks kovarian identitas) dan kemudian memaksakannya - mentransformasikannya untuk mendapatkan matriks kovarians dan berarti yang Anda inginkan. Jika dan adalah rata-rata populasi dan kovarian yang Anda butuhkan dan adalah standar normal, Anda menghitung , untuk beberapa mana (misalnya sesuai dapat diperoleh melalui dekomposisi Cholesky) . Maka memiliki karakteristik populasi yang diinginkan.Σ z y = L z + μ L L L ' = Σ LμΣzy=Lz+μLLL=ΣLy

Dengan yang kedua, Anda harus terlebih dahulu mengubah normals acak Anda untuk menghapus bahkan variasi acak menjauh dari mean nol dan kovarian identitas (membuat sampel berarti nol dan sampel kovarian ), kemudian melanjutkan seperti sebelumnya. Tapi itu langkah awal menghapus deviasi sampel dari mean tepat , varian mengganggu distribusi. (Dalam sampel kecil itu bisa sangat parah.) 0 IIn0I

Ini dapat dilakukan dengan mengurangi mean sampel dari ( ) dan menghitung dekomposisi Cholesky dari . Jika adalah faktor Cholesky kiri, maka harus memiliki mean sampel 0 dan kovarians sampel identitas. Anda kemudian dapat menghitung dan memiliki sampel dengan momen sampel yang diinginkan. (Tergantung pada bagaimana jumlah sampel Anda didefinisikan, mungkin ada biola kecil ekstra yang terlibat dengan mengalikan / membagi dengan faktor-faktor seperti , tetapi cukup mudah untuk mengidentifikasi kebutuhan itu.)z = z - ˉ z z L z ( 0 ) = ( L ) - 1 z y = L z ( 0 ) + μ zz=zz¯zLz(0)=(L)1zy=Lz(0)+μn1n

Glen_b -Reinstate Monica
sumber
1
+1. Suatu hari, saya perlu menghasilkan beberapa data dengan matriks kovarians sampel yang diberikan, tidak tahu bagaimana melakukannya, dan untuk beberapa alasan saya butuh banyak waktu untuk menemukan jawaban Anda. Untuk meningkatkan visibilitas utas ini dan untuk menggambarkan saran Anda, saya memposting jawaban lain di sini dengan beberapa kode Matlab.
Amoeba berkata Reinstate Monica
@amoeba Saya ingin tahu apakah ada kemungkinan memasukkan salah satu istilah pencarian yang Anda gunakan yang belum ada di sini ke dalam tag pertanyaan (atau mungkin memasukkan beberapa di edit kecil ke teks pertanyaan, yang seharusnya masih membantu ditemukannya ). Saya sekarang bertanya-tanya apakah saya harus melakukan hal yang sama di R ... tetapi kemudian apakah itu lebih baik dalam jawaban saya, atau sebagai tambahan untuk Anda?
Glen_b -Reinstate Monica
1
Saya sudah mengambil kebebasan untuk mengedit pertanyaan, dan juga mencoba merumuskan jawaban saya sehingga memasukkan kata kunci sebanyak mungkin. Semoga ini bisa membantu. Ngomong-ngomong, saya terkejut bahwa tip sederhana ini (memutihkan data yang dihasilkan sebelum mentransformasikannya menjadi kovarians yang diperlukan) sangat sulit bagi google; tidak dapat menemukan apa pun (di CV atau di tempat lain), sampai akhirnya saya menemukan jawaban Anda.
Amuba mengatakan Reinstate Monica
1
@amoeba Oh, oke, terima kasih. Ya, sebenarnya, saya tidak bisa mengatakan saya ingat pernah melihatnya disebutkan di mana saja untuk kasus multivariat (tidak diragukan lagi, karena itu adalah ide yang cukup jelas, terutama jika Anda sudah memikirkannya untuk kasus univariat, atau memiliki sudah melihatnya dalam kasus univariat).
Glen_b -Reinstate Monica
@ Glen_b Seperti yang Anda katakan, distribusi yang dihasilkan dari sampel yang "dibersihkan" ini tidak mungkin normal. Apakah Anda tahu distribusi apa yang dihasilkan? Atau mungkin apakah itu sama / tidak sama dengan distribusi bersyaratZz¯=μ,Cov(z)=Σ
gg
17

@ Glen_b memberikan jawaban yang baik (+1), yang ingin saya ilustrasikan dengan beberapa kode.

Bagaimana cara menghasilkan sampel dari distribusi Gaussian multivariat dimensional dengan matriks kovarians yang diberikan ? Ini mudah dilakukan dengan menghasilkan sampel dari Gaussian standar dan mengalikannya dengan akar kuadrat dari matriks kovarian, misalnya dengan . Ini tercakup dalam banyak utas pada CV, misalnya di sini: Bagaimana saya bisa menghasilkan data dengan matriks korelasi yang ditentukan sebelumnya? Berikut ini adalah implementasi Matlab sederhana:d Σ c h o l ( Σ )ndΣchol(Σ)

n = 100;
d = 2;
Sigma = [ 1    0.7  ; ...
          0.7   1   ];
rng(42)
X = randn(n, d) * chol(Sigma);

Matriks kovarian sampel dari data yang dihasilkan tentu saja tidak persis ; misalnya dalam contoh pengembalian di atasΣcov(X)

1.0690    0.7296
0.7296    1.0720

Bagaimana cara menghasilkan data dengan sampel korelasi atau matriks kovarians yang ditentukan sebelumnya ?

Seperti yang ditulis @Glen_b, setelah menghasilkan data dari Gaussian standar, pusat, memutihkan, dan membakukannya, sehingga ia memiliki sampel matriks kovarians ; baru kemudian kalikan dengan .c h o l ( Σ )Ichol(Σ)

Ini adalah kelanjutan dari contoh Matlab saya:

X = randn(n, d);
X = bsxfun(@minus, X, mean(X));
X = X * inv(chol(cov(X)));
X = X * chol(Sigma);

Sekarang cov(X), sesuai kebutuhan, kembali

1.0000    0.7000
0.7000    1.0000
amuba kata Reinstate Monica
sumber
+1. Entah bagaimana pertanyaan ini ada dalam berbagai bentuk di berbagai lokasi di CV. Apakah ada cara untuk melanjutkan jika kita sadar bahwa distribusi multivarian adalah non-gaussian?
rgk
Jika Anda tahu bentuk distribusi multivariat yang Anda inginkan, mungkin dalam beberapa kasus.
Glen_b -Reinstate Monica