+1 an @ user11852 und @ jem77bfp, das sind gute Antworten. Lassen Sie mich dies aus einer anderen Perspektive betrachten, nicht weil ich denke, dass es in der Praxis unbedingt besser ist , sondern weil ich es für lehrreich halte. Hier sind einige relevante Fakten, die wir bereits kennen:
- X Y N ( 0 , 1 )r ist die Steigung der Regressionslinie , wenn beide und sind standardisiert , dh , XYN(0,1)
Y Xr2 ist der Anteil der Varianz in der auf die Varianz in , YX
(auch aus den Regeln für Abweichungen ):
- Die Varianz einer Zufallsvariablen multipliziert mit einer Konstanten ist das Quadrat der ursprünglichen Varianz:
Var[aX]=a2Var[X]
- Varianzen addieren , dh die Varianz der Summe zweier Zufallsvariablen (sofern sie unabhängig sind) ist die Summe der beiden Varianzen:
Var[X+ε]=Var[X]+Var[ε]
Jetzt können wir diese vier Fakten kombinieren, um zwei normale Standardvariablen zu erstellen, deren Populationen eine bestimmte Korrelation haben, (genauer gesagt ), obwohl die von Ihnen generierten Stichproben unterschiedliche Stichproben-Korrelationen haben. Die Idee ist, eine Pseudozufallsvariable zu erstellen , die normal ist, , und dann einen Koeffizienten und eine Fehlervarianz , so dass , wobei . (Beachten Sie, dass muss, damit dies funktioniert, und dass außerdem .) Sie beginnen also mit demρ X N ( 0 , 1 ) a v e Y ~ N ( 0 , a 2 + v e ) a 2 + v e = 1 | a | ≤ 1 a = r r a 1 - r 2 x i e i v e y irρXN(0,1)aveY∼N(0,a2+ve)a2+ve=1|a| ≤1a=rr das du willst; das ist dein Koeffizient, . Dann ermitteln Sie die benötigte Fehlervarianz: . (Wenn Ihre Software die Verwendung der Standardabweichung erfordert, nehmen Sie die Quadratwurzel dieses Werts.) Generieren Sie schließlich für jede von Ihnen generierte Pseudozufallsvariable eine Pseudozufallsvariable mit der entsprechenden Fehlervarianz . und die korrelierte Pseudozufallsvariable durch Multiplizieren und Addieren zu berechnen . a1−r2xieiveyi
Wenn Sie dies in R tun möchten, könnte der folgende Code für Sie funktionieren:
correlatedValue = function(x, r){
r2 = r**2
ve = 1-r2
SD = sqrt(ve)
e = rnorm(length(x), mean=0, sd=SD)
y = r*x + e
return(y)
}
set.seed(5)
x = rnorm(10000)
y = correlatedValue(x=x, r=.5)
cor(x,y)
[1] 0.4945964
(Edit: Ich habe vergessen zu erwähnen :) Wie ich es beschrieben habe, liefert diese Prozedur zwei normale korrelierte Standardvariablen. Wenn Sie keine Standardnormalen möchten , aber möchten, dass die Variablen bestimmte Mittelwerte (nicht 0) und SDs (nicht 1) haben, können Sie sie transformieren, ohne die Korrelation zu beeinträchtigen. Sie subtrahieren also den beobachteten Mittelwert, um sicherzustellen, dass der Mittelwert genau ist. Multiplizieren Sie die Variable mit der gewünschten SD und addieren Sie dann den gewünschten Mittelwert. Wenn Sie möchten, dass der beobachtete Mittelwert normal um den gewünschten Mittelwert schwankt, würden Sie die anfängliche Differenz zurückaddieren. Dies ist im Wesentlichen eine umgekehrte Z-Score-Transformation. Da es sich um eine lineare Transformation handelt, hat die transformierte Variable dieselbe Korrelation mit der anderen Variablen wie zuvor. 0
Auch hier können Sie in der einfachsten Form nur ein Paar korrelierter Variablen generieren (dies könnte skaliert werden, wird aber schnell hässlich) und ist sicherlich nicht die bequemste Methode, um die Aufgabe zu erledigen. In R möchten Sie ? Mvrnorm im MASS- Paket verwenden, da dies einfacher ist und Sie mit einer bestimmten Populationskorrelationsmatrix viele Variablen generieren können. Dennoch finde ich es lohnend, diesen Prozess durchlaufen zu haben, um zu sehen, wie sich einige Grundprinzipien auf einfache Weise auswirken.