[Bei den letzten Fragen habe ich mich mit der Erzeugung von Zufallsvektoren in R befasst und wollte diese "Forschung" als unabhängige Frage und Antwort zu einem bestimmten Punkt teilen.]
Erzeugen von Zufallsdaten mit Korrelation kann unter Verwendung der Cholesky - Zerlegung der Korrelationsmatrix durchgeführt wird hier , wie auf dem Stand der Beiträge reflektierte hier und hier .
Die Frage, die ich ansprechen möchte, ist, wie die Gleichverteilung verwendet werden kann, um korrelierte Zufallszahlen aus verschiedenen Randverteilungen in R zu generieren .
r
correlation
sampling
random-variable
random-generation
Antoni Parellada
quelle
quelle
Antworten:
Da ist die Frage
und nicht nur normale Zufallsvariablen, die obige Antwort erzeugt keine Simulationen mit der beabsichtigten Korrelation für ein beliebiges Paar von Randverteilungen in .R.
Der Grund ist , dass für die meisten cdfs und G Y , cor ( X , Y ) ≠ cor ( G - 1 X ( Φ ( X ) , G - 1 Y ( Φ ( Y ) ) , wenn ( X , Y ) ∼ N 2 ( 0 , Σ ) , wobei Φ das normale Standard-cdf bezeichnet.GX. GY.
Nämlich ist hier ein Gegenbeispiel mit einem Exp (1) und eine Gamma (.2,1) als mein Paar Randverteilungen in .R.
Ein weiteres offensichtliches Gegenbeispiel ist, wenn das Cauchy-cdf ist. In diesem Fall ist die Korrelation nicht definiert.GX.
Um ein breiteres Bild zu geben, hier ein R-Code, bei dem sowohl als auch G Y beliebig sind:GX. GY.
Das Herumspielen mit verschiedenen cdfs führte mich dazu, diesen Sonderfall einer -Verteilung für G X und einer logarithmischen Normalverteilung für G Y herauszustellen :χ23 GX. GY.
Dies zeigt, wie weit die Korrelation von der Diagonale entfernt sein kann.
quelle
Ich habe das
correlate
Paket geschrieben. Die Leute sagten, es sei vielversprechend (verdient eine Veröffentlichung im Journal of Statistical Software), aber ich habe das Papier nie dafür geschrieben, weil ich mich entschieden habe, keine akademische Karriere zu verfolgen.Ich glaube, das nicht gewartete
correlate
Paket ist immer noch auf CRAN.Wenn Sie es installieren, können Sie Folgendes tun:
Das Ergebnis ist, dass neue Daten eine Korrelation von 0,5 haben, ohne die univariaten Verteilungen von
a
und zu ändernb
(dieselben Werte sind vorhanden, sie werden nur verschoben, bis die multivariate 0,5-Korrelation erreicht ist.Ich werde hier auf Fragen antworten, entschuldige die fehlende Dokumentation.
quelle
Generieren Sie zwei Stichproben korrelierter Daten aus einer normalen Standard-Zufallsverteilung nach einer vorgegebenen Korrelation .
Als Beispiel wählen wir eine Korrelation r = 0,7 und codieren eine Korrelationsmatrix wie:
(C <- matrix(c(1,0.7,0.7,1), nrow = 2)) [,1] [,2] [1,] 1.0 0.7 [2,] 0.7 1.0
Wir können
mvtnorm
jetzt diese beiden Stichproben als bivariaten Zufallsvektor generieren:set.seed(0)
SN <- rmvnorm(mean = c(0,0), sig = C, n = 1e5)
cor(SN[,1],SN[,2])= 0.6996197 ~ 0.7
X1 <- SN[,1]; X2 <- SN[,2]
Hier ist die Darstellung mit der überlappenden Regressionslinie:
U <- pnorm(SN)
pnorm
SN
cor(U[,1], U[,2]) = 0.6816123 ~ 0.7
Wieder können wir den Vektor zerlegen
U1 <- U[,1]; U2 <- U[,2]
und ein Streudiagramm mit Randverteilungen an den Rändern erzeugen, das ihre einheitliche Natur deutlich zeigt:Anwenden der inversen Transformationsverfahren Abtasten hier , um schließlich den Bivektor von gleich korrelierten Punkte zu erhalten , die zu je nachdem , welche Verteilung Familie wir uns vorgenommen haben zu reproduzieren.
Von hier aus können wir nur zwei Vektoren erzeugen, die normal und mit gleichen oder unterschiedlichen Varianzen verteilt sind . Zum Beispiel:
Y1 <- qnorm(U1, mean = 8,sd = 10)
undY2 <- qnorm(U2, mean = -5, sd = 4)
, wodurch die gewünschte Korrelation aufrechterhalten wird ,cor(Y1,Y2) = 0.6996197 ~ 0.7
.U1
U2
Z1 <- qt(U1, df = 3)
Z2 <- qexp(U2, rate = 1)
cor(Z1,Z2) [1] 0.5941299 < 0.7
Hier ist ein Beispiel für Code für den gesamten Prozess und normale Ränder:
Zum Vergleich habe ich eine Funktion zusammengestellt, die auf der Cholesky-Zerlegung basiert:
set.seed(99)
Verwenden der Uniform:
und Verwenden des Cholesky:
quelle