Untuk studi simulasi saya harus membuat variabel acak yang menunjukkan korelasi (populasi) prefined ke variabel .
Saya melihat ke dalam R
paket copula
dan CDVine
yang dapat menghasilkan distribusi multivarian acak dengan struktur ketergantungan yang diberikan. Namun, tidak mungkin untuk memperbaiki salah satu variabel yang dihasilkan ke variabel yang ada.
Setiap ide dan tautan ke fungsi yang ada dihargai!
Kesimpulan: Dua jawaban yang valid muncul, dengan solusi yang berbeda:
- Sebuah
R
naskah oleh caracal, yang menghitung variabel acak dengan tepat (sampel) korelasi untuk variabel yang telah ditetapkan - Suatu
R
fungsi yang saya temukan sendiri, yang menghitung variabel acak dengan korelasi populasi yang ditentukan dengan variabel yang telah ditentukan
[@ttnphns 'tambahan: Saya mengambil kebebasan untuk memperluas judul pertanyaan dari kasus variabel tetap tunggal ke jumlah variabel tetap sewenang-wenang; yaitu cara membuat variabel yang memiliki corretation yang telah ditentukan sebelumnya dengan beberapa variabel tetap yang ada]
sumber
Jawaban:
Ini satu lagi: untuk vektor dengan rata-rata 0, korelasinya sama dengan kosinus sudutnya. Jadi salah satu cara untuk menemukan vektor dengan korelasi yang diinginkan , sesuai dengan sudut :r θx r θ
Ini kodenya:
Untuk proyeksi ortogonal , saya menggunakan dekomposisi untuk meningkatkan stabilitas numerik, sejak saat itu cukup .Q R P = Q Q ′P Q R P=QQ′
sumber
P <- X %*% solve(t(X) %*% X) %*% t(X)
tidak menghasilkan r = 0,6, jadi itu bukan solusi. Saya masih bingung. (Saya akan senang meniru ekspresi AndaQ <- qr.Q(qr(Xctr[ , 1, drop=FALSE]))
di SPSS tetapi tidak tahu caranya.)Xctr[ , 1] %*% solve(t(Xctr[ , 1]) %*% Xctr[ , 1]) %*% t(Xctr[ , 1])
Xctr
rho=1
saya merasa berguna untuk melakukan sesuatu seperti iniif (isTRUE(all.equal(rho, 1))) rho <- 1-10*.Machine$double.eps
NaN
Saya akan menjelaskan solusi yang paling umum. Memecahkan masalah dalam generalitas ini memungkinkan kita untuk mencapai implementasi perangkat lunak yang sangat kompak: cukup dua baris
R
kode saja.Pilih vektor , dengan panjang yang sama dengan , sesuai dengan distribusi yang Anda suka. Mari menjadi residual kuadrat regresi setidaknya dari terhadap : ini ekstrak komponen dari . Dengan menambahkan kembali kelipatan cocok ke , kita dapat menghasilkan vektor memiliki apapun yang diinginkan korelasi dengan . Hingga konstanta multiplikatif aditif sewenang-wenang dan positif - yang bebas Anda pilih dengan cara apa pun - solusinya adalahY Y ⊥ X Y Y X Y Y ⊥ ρ YX Y Y⊥ X Y Y X Y Y⊥ ρ Y
(" " adalah singkatan dari setiap perhitungan yang sebanding dengan standar deviasi.)SD
IniX
R
kode kerjanya . Jika Anda tidak menyediakan , kode akan mengambil nilainya dari distribusi Normal standar multivariat.Sebagai ilustrasi, saya membuat acak dengan komponen dan menghasilkan memiliki berbagai korelasi spesifik dengan ini . Mereka semua dibuat dengan vektor awal yang sama . Berikut adalah sebar plot mereka. "Rugplots" di bagian bawah setiap panel menunjukkan vektor umum .50 X Y ; ρ Y X = ( 1 , 2 , … , 50 ) YY 50 XY;ρ Y X=(1,2,…,50) Y
Ada kesamaan yang luar biasa di antara plot, tidak ada :-).
Jika Anda ingin bereksperimen, berikut adalah kode yang menghasilkan data ini dan gambar. (Saya tidak repot-repot menggunakan kebebasan untuk mengubah dan mengukur hasilnya, yang merupakan operasi yang mudah.)
BTW, metode ini siap digeneralisasi menjadi lebih dari satu : jika secara matematis memungkinkan, ia akan menemukan memiliki korelasi yang ditentukan dengan keseluruhan set . Cukup gunakan kuadrat terkecil biasa untuk menghilangkan efek semua dari dan membentuk kombinasi linear yang sesuai dari dan residu. (Ini membantu untuk melakukan ini dalam hal basis ganda untuk , yang diperoleh dengan menghitung pseudo-invers. Kode follownig menggunakan SVD untuk mencapai itu.)X Y 1 , Y 2 , ... , Y k ; ρ 1 , ρ 2 , … , ρ k Y i Y i X Y i Y YY XY1,Y2,…,Yk;ρ1,ρ2,…,ρk Yi Yi X Yi Y Y
Berikut ini sketsa algoritme dalamYi
R
, di mana diberikan sebagai kolom dari sebuah matriks :y
Berikut ini adalah implementasi yang lebih lengkap bagi mereka yang ingin bereksperimen.
sumber
BTW, this method readily generalizes to more... Just use ordinary least squares... and form a suitable linear combination
x
dan ingin menghasilkan vektor baru yangy
berkorelasi denganx
tetapi juga inginy
vektor tersebut didistribusikan secara seragam.Berikut pendekatan komputasi lain (solusinya diadaptasi dari posting forum oleh Enrico Schumann). Menurut Wolfgang (lihat komentar), ini identik secara komputasi dengan solusi yang diajukan oleh ttnphns.
Berbeda dengan solusi caracal, ia tidak menghasilkan sampel dengan korelasi tepat , tetapi dua vektor yang populasinya korelasinya sama dengan .ρρ ρ
Fungsi berikut dapat menghitung distribusi sampel bivariat yang diambil dari suatu populasi dengan diberikan . Entah menghitung dua variabel acak, atau mengambil satu variabel yang ada (dilewatkan sebagai parameter ) dan membuat variabel kedua dengan korelasi yang diinginkan:ρ
x
Fungsi ini juga dapat menggunakan distribusi marginal non-normal dengan menyesuaikan parameter
mar.fun
. Namun, perlu diketahui bahwa memperbaiki satu variabel hanya berfungsi dengan variabel yang terdistribusi normalx
! (yang mungkin terkait dengan komentar Makro).Juga perhatikan bahwa "faktor koreksi kecil" dari pos asli telah dihapus karena tampaknya bias korelasi yang dihasilkan, setidaknya dalam kasus distribusi Gaussian dan korelasi Pearson (juga lihat komentar).
sumber
rho
.X2 <- mar.fun(n)
untukX2 <- mar.fun(n,mean(x),sd(x))
mendapatkan korelasi yang diinginkan antara x1 dan x2Biarkan menjadi variabel tetap Anda dan Anda ingin menghasilkan variabel yang berkorelasi dengan dengan jumlah . Jika distandarisasi maka (karena adalah koefisien beta dalam regresi sederhana) , di mana adalah variabel acak dari distribusi normal yang memiliki mean dan . Korelasi yang diamati antara data dan akan kira-kira ; dan dapat dilihat sebagai sampel acak dari populasi normal bivariat (jikaY X r X r Y = r X + E E 0 sd = √X Y X r X r Y=rX+E E 0 XYrXYXρ=rsd=1−r2−−−−−√ X Y r X Y X dari normal) dengan .ρ=r
Sekarang, jika Anda ingin mencapai korelasi dalam sampel bivariat Anda persis , Anda perlu memberikan yang memiliki nol korelasi dengan . Pengetatan ini menjadi nol dapat dicapai dengan memodifikasi secara berulang. Nah, dengan hanya dua variabel, satu diberikan ( ) dan satu untuk menghasilkan ( ), jumlah iterasi yang cukup sebenarnya 1, tetapi dengan beberapa variabel yang diberikan ( ) iterasi akan diperlukan.E X E X Y X 1 , X 2 , X 3 , . . .r E X E X Y X1,X2,X3,...
Perlu dicatat bahwa jika normal maka pada prosedur pertama ("perkiraan ") juga akan normal; Namun, dalam pemasangan berulang ke "tepat " cenderung kehilangan normalitas karena pemasangan mengeksploitasi nilai kasus secara selektif.r Y Y r YX r Y Y r Y
Pembaruan 11 Nov 2017. Saya telah menemukan utas lama ini hari ini dan memutuskan untuk memperluas jawaban saya dengan menunjukkan algoritme pengulangan yang pas tentang yang saya bicarakan pada awalnya.
Disclamer: Ini solusi berulang yang saya temukan lebih rendah daripada yang terbaik berdasarkan menemukan basis ganda dan diusulkan oleh @whuber di utas ini hari ini. solusi @ whuber tidak iteratif dan, yang lebih penting bagi saya, tampaknya akan mempengaruhi nilai-nilai dari variabel input "babi" agak kurang dari algoritma "saya" (itu akan menjadi aset kemudian jika tugasnya adalah untuk "memperbaiki" variabel yang ada dan tidak menghasilkan variate acak dari awal). Tetap saja, saya menerbitkan buku saya untuk rasa ingin tahu dan karena itu berhasil (lihat juga Catatan Kaki).
(penyebut tidak berubah pada iterasi, hitung terlebih dahulu)
sumber
Saya merasa ingin melakukan beberapa pemrograman, jadi saya mengambil jawaban yang dihapus @ Adam dan memutuskan untuk menulis implementasi yang bagus di R. Saya fokus menggunakan gaya berorientasi fungsional (yaitu lapply style looping). Gagasan umum adalah untuk mengambil dua vektor, secara acak mengubah salah satu vektor sampai korelasi tertentu telah tercapai di antara mereka. Pendekatan ini sangat kasar, tetapi mudah diimplementasikan.
Pertama kita membuat fungsi yang secara acak mengizinkan vektor input:
... dan buat beberapa contoh data
... tulis fungsi yang memungkinkan vektor input, dan menghubungkannya ke vektor referensi:
... dan ulangi ribuan kali:
Perhatikan bahwa aturan pelingkupan R memastikan
vec1
danvec2
ditemukan di lingkungan global, di luar fungsi anonim yang digunakan di atas. Jadi, permutasi semua relatif terhadap dataset uji asli yang kami hasilkan.Berikutnya, kami menemukan korelasi maksimum:
... atau temukan nilai terdekat dengan korelasi 0,2:
Untuk mendapatkan korelasi yang lebih tinggi, Anda perlu menambah jumlah iterasi.
sumber
Larutan:
Kode python:
Hasil tes:
sumber
Hasilkan variabel normal dengan matriks kovarians SAMPLING seperti yang diberikan
Hasilkan variabel normal dengan matriks kovarians POPULASI seperti yang diberikan
sumber
Cukup buat vektor acak dan urutkan sampai Anda mendapatkan r yang diinginkan.
sumber