Hasilkan dua sampel data berkorelasi dari distribusi acak normal standar setelah korelasi yang telah ditentukan .
Sebagai contoh, mari kita pilih korelasi r = 0,7 , dan kode matriks korelasi seperti:
(C <- matrix(c(1,0.7,0.7,1), nrow = 2))
[,1] [,2]
[1,] 1.0 0.7
[2,] 0.7 1.0
Kita dapat menggunakan mvtnorm
untuk menghasilkan sekarang dua sampel ini sebagai vektor acak bivariat:
set.seed(0)
SN <- rmvnorm(mean = c(0,0), sig = C, n = 1e5)
menghasilkan dua komponen vektor yang didistribusikan sebagai ~ dan dengan a . Kedua komponen dapat diekstrak sebagai berikut:N(0,1)cor(SN[,1],SN[,2])= 0.6996197 ~ 0.7
X1 <- SN[,1]; X2 <- SN[,2]
Berikut plot dengan garis regresi yang tumpang tindih:
Gunakan Probability Integral Transform di sini untuk mendapatkan vektor acak bivariat dengan distribusi marginal ~U(0,1) dan korelasi yang sama :
U <- pnorm(SN)
- jadi kami memasukkan ke pnorm
dalam SN
vektor untuk menemukanerf(SN) (atau Φ(SN)). Dalam prosesnya, kami melestarikan cor(U[,1], U[,2]) = 0.6816123 ~ 0.7
.
Sekali lagi kita dapat menguraikan vektor U1 <- U[,1]; U2 <- U[,2]
dan menghasilkan sebar dengan distribusi marjinal di tepi, jelas menunjukkan sifat seragam mereka:
Terapkan metode sampling transformasi terbalik di sini untuk akhirnya mendapatkan bivektor dari titik berkorelasi sama yang dimiliki keluarga distribusi mana pun yang kami tuju untuk mereproduksi.
Dari sini kita hanya dapat menghasilkan dua vektor yang terdistribusi secara normal dan dengan varian yang sama atau berbeda . Misalnya: Y1 <- qnorm(U1, mean = 8,sd = 10)
dan Y2 <- qnorm(U2, mean = -5, sd = 4)
, yang akan mempertahankan korelasi yang diinginkan cor(Y1,Y2) = 0.6996197 ~ 0.7
,.
Atau pilih distribusi yang berbeda. Jika distribusi yang dipilih sangat berbeda, korelasinya mungkin tidak tepat. Sebagai contoh, mari kita U1
ikuti atdistribusi dengan 3 df, dan U2
eksponensial dengan aλ= 1: Z1 <- qt(U1, df = 3)
dan Z2 <- qexp(U2, rate = 1)
The cor(Z1,Z2) [1] 0.5941299 < 0.7
. Berikut adalah histogram masing-masing:
Berikut adalah contoh kode untuk seluruh proses dan marginal normal:
Cor_samples <- function(r, n, mean1, mean2, sd1, sd2){
C <- matrix(c(1,r,r,1), nrow = 2)
require(mvtnorm)
SN <- rmvnorm(mean = c(0,0), sig = C, n = n)
U <- pnorm(SN)
U1 <- U[,1]
U2 <- U[,2]
Y1 <<- qnorm(U1, mean = mean1,sd = sd1)
Y2 <<- qnorm(U2, mean = mean2,sd = sd2)
sample_measures <<- as.data.frame(c(mean(Y1), mean(Y2), sd(Y1), sd(Y2), cor(Y1,Y2)), names<-c("mean Y1", "mean Y2", "SD Y1", "SD Y2", "Cor(Y1,Y2)"))
sample_measures
}
Sebagai perbandingan, saya telah mengumpulkan fungsi berdasarkan dekomposisi Cholesky:
Cholesky_samples <- function(r, n, mean1, mean2, sd1, sd2){
C <- matrix(c(1,r,r,1), nrow = 2)
L <- chol(C)
X1 <- rnorm(n)
X2 <- rnorm(n)
X <- rbind(X1,X2)
Y <- t(L)%*%X
Y1 <- Y[1,]
Y2 <- Y[2,]
N_1 <<- Y[1,] * sd1 + mean1
N_2 <<- Y[2,] * sd2 + mean2
sample_measures <<- as.data.frame(c(mean(N_1), mean(N_2), sd(N_1), sd(N_2), cor(N_1, N_2)),
names<-c("mean N_1", "mean N_2", "SD N_1", "SD N_2","cor(N_1,N_2)"))
sample_measures
}
Mencoba kedua metode untuk menghasilkan yang berkorelasi (katakanlah, r=0.7) sampel didistribusikan ~ N(97,23) dan N(32,8)kita dapatkan, pengaturan set.seed(99)
:
Menggunakan Seragam:
cor_samples(0.7, 1000, 97, 32, 23, 8)
c(mean(Y1), mean(Y2), sd(Y1), sd(Y2), cor(Y1, Y2))
mean Y1 96.5298821
mean Y2 32.1548306
SD Y1 22.8669448
SD Y2 8.1150780
cor(Y1,Y2) 0.7061308
dan Menggunakan Cholesky:
Cholesky_samples(0.7, 1000, 97, 32, 23, 8)
c(mean(N_1), mean(N_2), sd(N_1), sd(N_2), cor(N_1, N_2))
mean N_1 96.4457504
mean N_2 31.9979675
SD N_1 23.5255419
SD N_2 8.1459100
cor(N_1,N_2) 0.7282176