Tôi không biết về một phương pháp phổ quát để tạo các biến ngẫu nhiên tương quan với bất kỳ phân phối biên nào. Vì vậy, tôi sẽ đề xuất một phương pháp đặc biệt để tạo ra các cặp biến ngẫu nhiên được phân phối đồng đều với mối tương quan (Pearson) nhất định. Không mất tính tổng quát, tôi giả định rằng phân phối biên mong muốn là thống nhất tiêu chuẩn (nghĩa là hỗ trợ là ).[0,1]
Phương pháp đề xuất dựa trên các yếu tố sau:
a) Đối với các biến ngẫu nhiên đồng nhất tiêu chuẩn và U 2 với các hàm phân phối tương ứng F 1 và F 2 , chúng ta có F i ( U i ) = U i , với i = 1 , 2 . Do đó, theo định nghĩa , rho của Spearman là
ρ S ( U 1 , U 2 ) = c o r r ( FU1U2F1F2Fi(Ui)=Uii=1,2
Vì vậy, hệ số tương quan của Spearman rho và Pearson là bằng nhau (tuy nhiên các phiên bản mẫu có thể khác nhau).
ρS(U1,U2)=corr(F1(U1),F2(U2))=corr(U1,U2).
b) Nếu là các biến ngẫu nhiên có lề liên tục và copula Gaussian với hệ số tương quan (Pearson) ρ , thì rho của Spearman là
ρ S ( X 1 , X 2 ) = 6X1,X2ρ
Điều này giúp dễ dàng tạo các biến ngẫu nhiên có giá trị mong muốn của rear Spearman.
ρS(X1,X2)=6πarcsin(ρ2).
Cách tiếp cận là tạo dữ liệu từ copula Gaussian với hệ số tương quan phù hợp sao cho rho của Spearman tương ứng với tương quan mong muốn cho các biến ngẫu nhiên thống nhất.ρ
Thuật toán mô phỏng
Gọi biểu thị mức độ tương quan mong muốn và n số lượng cặp được tạo. Thuật toán là:rn
- Tính .ρ=2sin(rπ/6)
- Tạo một cặp biến ngẫu nhiên từ copula Gaussian (ví dụ, với cách tiếp cận này )
- Lặp lại bước 2 lần.n
Ví dụ
Đoạn mã sau đây là một ví dụ về việc triển khai thuật toán này bằng R với tương quan đích và n = 500 cặp.r=0.6n=500
## Initialization and parameters
set.seed(123)
r <- 0.6 # Target (Spearman) correlation
n <- 500 # Number of samples
## Functions
gen.gauss.cop <- function(r, n){
rho <- 2 * sin(r * pi/6) # Pearson correlation
P <- toeplitz(c(1, rho)) # Correlation matrix
d <- nrow(P) # Dimension
## Generate sample
U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
return(U)
}
## Data generation and visualization
U <- gen.gauss.cop(r = r, n = n)
pairs(U, diag.panel = function(x){
h <- hist(x, plot = FALSE)
rect(head(h$breaks, -1), 0, tail(h$breaks, -1), h$counts/max(h$counts))})
Trong hình bên dưới, các ô chéo hiển thị biểu đồ của các biến và U 2 và các ô ngoài đường chéo hiển thị các sơ đồ phân tán của U 1 và U 2 .
U1U2U1U2
Bằng cách xây dựng, các biến ngẫu nhiên có lề đồng nhất và hệ số tương quan (gần với) . Nhưng do ảnh hưởng của việc lấy mẫu, hệ số tương quan của dữ liệu mô phỏng không chính xác bằng r .rr
cor(U)[1, 2]
# [1] 0.5337697
Lưu ý rằng gen.gauss.cop
hàm nên hoạt động với nhiều hơn hai biến chỉ bằng cách chỉ định ma trận tương quan lớn hơn.
Nghiên cứu
mô phỏng Nghiên cứu mô phỏng sau đây lặp lại cho tương quan mục tiêu cho thấy rằng sự phân bố của hệ số tương quan hội tụ đến tương quan mong muốn khi kích thước mẫu n tăng.r=−0.5,0.1,0.6n
## Simulation
set.seed(921)
r <- 0.6 # Target correlation
n <- c(10, 50, 100, 500, 1000, 5000); names(n) <- n # Number of samples
S <- 1000 # Number of simulations
res <- sapply(n,
function(n, r, S){
replicate(S, cor(gen.gauss.cop(r, n))[1, 2])
},
r = r, S = S)
boxplot(res, xlab = "Sample size", ylab = "Correlation")
abline(h = r, col = "red")