Mir ist keine universelle Methode bekannt, um korrelierte Zufallsvariablen mit einer gegebenen Randverteilung zu erzeugen. Ich werde daher eine Ad-hoc-Methode vorschlagen, um Paare gleichmäßig verteilter Zufallsvariablen mit einer gegebenen (Pearson-) Korrelation zu generieren. Ohne Einschränkung der Allgemeinheit gehe ich davon aus, dass die gewünschte Randverteilung einheitlich ist (dh der Träger ist ).[0,1]
Der vorgeschlagene Ansatz beruht auf Folgendem:
a) Für standardmäßige einheitliche Zufallsvariablen und mit den jeweiligen Verteilungsfunktionen und gilt , für . Somit kann durch Definition Spearman-rho ist
Daher sind Spearmans Rho und Pearsons Korrelationskoeffizient gleich (Beispielversionen können sich jedoch unterscheiden).U1U2F1F2Fi(Ui)=Uii=1,2
ρS(U1,U2)=corr(F1(U1),F2(U2))=corr(U1,U2).
b) Wenn Zufallsvariablen mit stetigen Rändern und Gaußsche Kopula mit (Pearson) -Korrelationskoeffizient , dann ist Spearmans rho
Dies macht es einfach, Zufallsvariablen zu generieren, die einen gewünschten Wert von Spearmans Rho haben.X1,X2ρ
ρS(X1,X2)=6πarcsin(ρ2).
Der Ansatz besteht darin, Daten aus der Gaußschen Kopula mit einem geeigneten Korrelationskoeffizienten zu generieren, so dass das Spearman-Rho der gewünschten Korrelation für die einheitlichen Zufallsvariablen entspricht.ρ
Simulationsalgorithmus
Es sei der gewünschte Korrelationsgrad und die Anzahl der zu erzeugenden Paare. Der Algorithmus ist:rn
- Berechne .ρ=2sin(rπ/6)
- Generieren Sie ein Paar zufälliger Variablen aus der Gaußschen Copula (z. B. mit diesem Ansatz )
- Wiederholen Sie Schritt 2 Mal.n
Beispiel
Der folgende Code ist ein Beispiel für die Implementierung dieses Algorithmus unter Verwendung von R mit einer Zielkorrelation von und Paaren.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))})
In der folgenden Abbildung zeigen die Diagonaldiagramme Histogramme der Variablen und und die nicht diagonalen Diagramme Streudiagramme von und .
U1U2U1U2
Konstruktiv haben die Zufallsvariablen einheitliche Ränder und einen Korrelationskoeffizienten (nahe) . Aufgrund der Auswirkung der Abtastung ist der Korrelationskoeffizient der simulierten Daten jedoch nicht genau gleich .rr
cor(U)[1, 2]
# [1] 0.5337697
Beachten Sie, dass die gen.gauss.cop
Funktion mit mehr als zwei Variablen arbeiten sollte, indem Sie einfach eine größere Korrelationsmatrix angeben.
Simulationsstudie
Die folgende Simulationsstudie, die für die Zielkorrelation wiederholt legt nahe, dass die Verteilung des Korrelationskoeffizienten mit zunehmender Stichprobengröße gegen die gewünschte Korrelation konvergiert .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")