+1 ke @ user11852, dan @ jem77bfp, ini adalah jawaban yang bagus. Biarkan saya mendekati ini dari sudut pandang yang berbeda, bukan karena saya pikir itu selalu lebih baik dalam praktek , tetapi karena saya pikir ini instruktif. Berikut adalah beberapa fakta relevan yang sudah kita ketahui:
- X Y N ( 0 , 1 )r adalah kemiringan garis regresi ketika kedua dan yang standar , yaitu, , XYN(0,1)
Y Xr2 adalah proporsi varians dalam disebabkan varians dalam , YX
(juga, dari aturan untuk varian ):
- varians dari variabel acak dikalikan dengan konstanta adalah konstanta kuadrat kali varians aslinya:
Var[aX]=a2Var[X]
- varians add , yaitu varians dari penjumlahan dari dua variabel acak (dengan asumsi mereka independen) adalah jumlah dari dua varians:
Var[X+ε]=Var[X]+Var[ε]
Sekarang, kita dapat menggabungkan keempat fakta ini untuk membuat dua variabel normal standar yang populasinya akan memiliki korelasi, (lebih tepat, ), meskipun sampel yang Anda hasilkan akan memiliki korelasi sampel yang bervariasi. Idenya adalah untuk membuat variabel pseudorandom, , yaitu standar normal, , dan kemudian menemukan koefisien, , dan varian kesalahan, , sehingga , di mana . (Perhatikan bahwa harus agar ini berfungsi, dan, apalagi, .) Jadi, Anda mulai denganrρXN(0,1)aveY∼N(0,a2+ve)a2+ve=1|a| ≤1a=rr yang Anda inginkan; itu koefisien Anda, . Kemudian Anda mengetahui varians kesalahan yang Anda butuhkan, itu . (Jika perangkat lunak Anda mengharuskan Anda untuk menggunakan standar deviasi, mengambil akar kuadrat dari nilai tersebut.) Akhirnya, untuk setiap pseudorandom variate, , bahwa Anda telah dihasilkan, menghasilkan kesalahan variate pseudorandom, , dengan varians kesalahan yang sesuai , dan hitung variasi pseudorandom yang dikorelasikan, , dengan mengalikan dan menambahkan. a1−r2xieiveyi
Jika Anda ingin melakukan ini di R, kode berikut mungkin bekerja untuk Anda:
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
(Sunting: Saya lupa menyebutkan :) Seperti yang saya jelaskan, prosedur ini memberi Anda dua variabel berkorelasi normal standar. Jika Anda tidak ingin normals standar , tetapi ingin variabel memiliki beberapa cara khusus (bukan 0) dan SD (bukan 1), Anda dapat mengubahnya tanpa mempengaruhi korelasinya. Dengan demikian, Anda akan mengurangi mean yang diamati untuk memastikan bahwa rata-rata tepat , kalikan variabel dengan SD yang Anda inginkan dan kemudian tambahkan rata-rata yang Anda inginkan. Jika Anda ingin rata-rata yang diamati berfluktuasi secara normal di sekitar rata-rata yang diinginkan, Anda akan menambahkan perbedaan awal kembali. Pada dasarnya, ini adalah transformasi z-skor secara terbalik. Karena ini adalah transformasi linear, variabel yang diubah akan memiliki korelasi yang sama dengan variabel lain seperti sebelumnya. 0
Sekali lagi, ini, dalam bentuk yang paling sederhana, hanya memungkinkan Anda menghasilkan sepasang variabel berkorelasi (ini bisa ditingkatkan, tetapi menjadi cepat jelek), dan tentu saja bukan cara yang paling nyaman untuk menyelesaikan pekerjaan. Dalam R, Anda ingin menggunakan ? Mvrnorm dalam paket MASS , baik karena lebih mudah dan karena Anda dapat menghasilkan banyak variabel dengan matriks korelasi populasi yang diberikan. Meskipun demikian, saya pikir bermanfaat untuk menjalani proses ini untuk melihat bagaimana beberapa prinsip dasar berjalan dengan cara yang sederhana.