Herhangi bir marjinal dağılım ile ilişkili rasgele değişkenler oluşturmak için evrensel bir yöntem farkında değilim. Bu nedenle, belirli bir (Pearson) korelasyonu ile düzgün dağılmış rastgele değişken çiftleri oluşturmak için geçici bir yöntem önereceğim. Genellik kaybı olmadan, istenen marjinal dağılımın standart üniform olduğunu varsayıyorum (yani destek ).[0,1]
Önerilen yaklaşım aşağıdakilere dayanmaktadır:
a) İlgili dağıtım fonksiyonları olan standart tek tip ve rasgele değişkenleri içinU1U2 ve F 2 , elimizdeki F ı ( u ı ) = u ı için, i = 1 , 2 . Böylece, tanımı gereğiSpearman'ın rhodeğeri
ρ S ( U 1 , U 2 ) = c o r r ( F 1 (F1F2Fi(Ui)=Uii=1,2
Bu nedenle, Spearman'ın rho ve Pearson korelasyon katsayısı eşittir (ancak örnek versiyonlar farklı olabilir).
ρS(U1,U2)=corr(F1(U1),F2(U2))=corr(U1,U2).
b) Eğer , sürekli kenar ile rasgele değişkenlerdir Gauss bağ ile (Pearson) korelasyon katsayısı p'ye ve ardından Spearman rho olan
ρ S ( X 1 , x 2 ) = 6X1,X2ρ
Bu, Spearman'ın rho'sunun istenen değerine sahip rastgele değişkenler oluşturmayı kolaylaştırır.
ρS(X1,X2)=6πarcsin(ρ2).
Yaklaşım, Spearman'ın rho'nun homojen rasgele değişkenler için istenen korelasyona karşılık geleceği şekilde, uygun bir korelasyon katsayısı ile Gauss kopuladan veri üretmektir .ρ
Simülasyon algoritması
Let korelasyon istenilen düzeyde temsil etmektedir, ve n, çiftlerinin sayısı elde edilecek. Algoritma:rn
- hesaplayın .ρ=2sin(rπ/6)
- Gauss kopula'sından bir çift rasgele değişken oluşturun (örneğin, bu yaklaşımla )
- n
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))})
U1U2U1U2
rr
cor(U)[1, 2]
# [1] 0.5337697
gen.gauss.cop
Fonksiyonun, sadece daha büyük bir korelasyon matrisi belirterek ikiden fazla değişkenle çalışması gerektiğini unutmayın .
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")