Erzeugen Sie Paare von Zufallszahlen, die gleichmäßig verteilt und korreliert sind


14

Ich möchte Zufallszahlenpaare mit einer bestimmten Korrelation erzeugen. Der übliche Ansatz, eine Linearkombination zweier Normalvariablen zu verwenden, ist hier jedoch nicht gültig, da eine Linearkombination gleichförmiger Variablen keine gleichmäßig verteilte Variable mehr ist. Ich brauche die beiden Variablen, um einheitlich zu sein.

Irgendeine Idee, wie Paare von einheitlichen Variablen mit einer gegebenen Korrelation erzeugt werden können?


6
Eng verbunden: stats.stackexchange.com/questions/30526 . Sie möchten auch das Copula- Tag überprüfen - klicken Sie einfach auf den Link hier. Eine schnelle und schmutzige Technik besteht darin, einheitlich und wenn und . Die Korrelation ist , wobei den Trick macht. Aber Copulas geben Ihnen mehr Kontrolle .... [ 0 , 1 ] Y = X X α Y = 1 + α - X ρ = 2 ( α - 1 ) 3 + 1 α = 1 - ( ( 1 - ρ ) / 2 ) 1 / 3X[0,1]Y=XXαY=1+αXρ=2(α1)3+1α=1((1ρ)/2)1/3
Whuber

Vielen Dank für den Kommentar, aber ja, ich denke, diese Methode ist wirklich "schmutzig"
Onturenio

1
Ich hatte die Hoffnung, dass Sie bei diesem Ansatz erkennen, dass Sie zusätzliche Kriterien für die Eigenschaften Ihrer Zufallszahlenpaare angeben können (und sollten). Wenn dies "schmutzig" ist, was ist dann genau mit der Lösung falsch? Sagen Sie uns, damit wir angemessenere Antworten für Ihre Situation liefern können.
Whuber

Diese Frage wurde übrigens in der Antwort auf eine eng verwandte Frage beantwortet: Wie werden Paare von Wohnmobilen mit einer linearen Regressionsbeziehung erzeugt? Da die Steigung der linearen Regression auf einfach zu berechnende Weise mit dem Korrelationskoeffizienten zusammenhängt und alle möglichen Steigungen erzeugt werden können, können Sie genau das erzeugen, was Sie wollen. Siehe stats.stackexchange.com/questions/257779/… .
whuber

1
Siehe auch stats.stackexchange.com/questions/31771 , das die Verallgemeinerung auf drei zufällige Uniformen beantwortet.
whuber

Antworten:


16

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

  1. Berechne .ρ=2sin(rπ/6)
  2. Generieren Sie ein Paar zufälliger Variablen aus der Gaußschen Copula (z. B. mit diesem Ansatz )
  3. 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 . U1U2U1U2enter image description here

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.copFunktion 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")

enter image description here enter image description here enter image description here


3
Die allgemeine Methode zur Erzeugung korrelierter multivariater Verteilungen mit gegebenen Randverteilungen wird als Kopula bezeichnet .
Whuber

@whuber, die Verwendung von Copula ermöglicht es, eine Abhängigkeitsstruktur zwischen Zufallsvariablen anzugeben. Das Problem ist, dass die (Personen-) Korrelation sowohl von der Abhängigkeitsstruktur als auch von den Rändern beeinflusst wird. Daher erfordert jede Auswahl von Rändern eine entsprechende Auswahl von Copula-Parametern, ganz zu schweigen davon, dass einige Korrelationsebenen für bestimmte Ränder einfach nicht erreicht werden können ( siehe hier ). Wenn Sie eine Methode kennen, mit der Sie den Grad der Korrelation für eine beliebige Auswahl von Rändern steuern können, würde ich gerne davon erfahren.
QuantIbex

Vielen Dank @QuantIbex. Aber ich erhalte nicht , warum „a) impliziert , dass Spearman rho und (Pearson) Korrelationskoeffizient für Zufallsvariablen mit Standard einheitlichen Rand sind etwa in großer Probe gleich“
Onturenio

2
Quantlbex, alles was Sie brauchen, ist einen kontinuierlichen Pfad der Copulas von der unteren zur oberen Frechet-Hoeffding-Grenze zu erstellen. Bei identischen Rändern ist der Korrelationskoeffizient eine stetige Funktion von diesem Pfad in das Intervall . Mein "schnelles und schmutziges" Beispiel in einem Kommentar zu dieser Frage ist ein solcher Pfad, aber es gibt natürlich noch viele andere: Copulas bieten Ihnen die umfassendste und allgemeinste Möglichkeit, solche Pfade zu erstellen und zu beschreiben. Dies zeigt, dass die ursprüngliche Frage (grob) unterbestimmt ist: Sie sollte zusätzliche Kriterien für die Lösung festlegen. [1,1]
Whuber

1
@Quantibex Ich habe mir erlaubt, einen Satz hinzuzufügen, der darauf hinweist, dass Ihre gen.gauss.copFunktion für mehr als zwei Variablen mit einem (trivialen) Tweak funktioniert. Wenn Sie den Zusatz nicht mögen oder ihn anders ausdrücken möchten, setzen Sie ihn bitte zurück oder ändern Sie ihn nach Bedarf.
Glen_b

0

Intuitiv ist U ( 0 , 1 ) , da u 1 equals w 1 [welche U ( 0 , 1 ) ] , wenn I = 1 , und u 1 equals w 2 [welche U ( 0 , 1 ) ] , wenn I = 0 , so u 1 ist U ( 0 , 1 )u1U(0,1)u1w1U(0,1)I=1u1w2U(0,1)I=0u1U(0,1)in beiden Fällen. Das selbe für . Zur Korrelation:u2

E(u1u2)=E[Iw1+(1I)w2][Iw1+(1I)w3]

I(I1)=0I2=I(1I)2=(1I)I01Iw

E(u1u2)=E(I)E(w12)+E(1I)E(w2)E(w3) =pE(w12)+(1p)/4

V(w1)=1/12E(w12)=1/3E(u1u2)=p/12+1/4cov(u1u2)=p/12V(u1)=V(u2)=1/12cor(u1,u2)=p


0

(u1,u2)=Iw1+(1I)(w2,w3)w1,w2,w3U(0,1)Ipu1u2U(0,1)pk

(u1,u2)=I(w1,1w1)+(1I)(w2,w3), and the correlation will be p.


Can you add a short proof of why this works?
The Laconic

if your want to be computationally efficient, u1=w1 also produces the same correlation (both positive and negative cases)
Anvit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.