J'essaie de générer une séquence aléatoire corrélée avec une moyenne = , une variance = , un coefficient de corrélation = . Dans le code ci-dessous, j'utilise & comme écart-type et & comme moyen.1 0,8s1
s2
m1
m2
p = 0.8
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2
Cela me donne le correct corrcoef()
de 0,8 entre x
et y
. Ma question est de savoir comment puis-je générer une série signifie si je veux z
que cela soit également corrélé avec y
(avec la même corrélation ), mais pas avec . Existe-t-il une formule particulière que je dois connaître? J'en ai trouvé un mais je ne pouvais pas le comprendre.x
Réponses:
Il semble que vous vous demandiez comment générer des données avec une matrice de corrélation particulière.
Un fait est utile que si vous avez un vecteur aléatoire avec la matrice de covariance Σ , le vecteur aléatoire A x a moyenne A E ( x ) et covariance matrice Ω = A Σ A T . Donc, si vous commencez avec des données qui ont une moyenne de zéro, la multiplication par A ne changera pas cela, donc votre première exigence est facilement satisfaite.X Σ A x A E( x ) Ω = A Σ AT UNE
Disons que vous commencez avec (zéro) moyenne des données non corrélées (la matrice de covariance est diagonale) - puisque nous parlons de la matrice de corrélation, nous allons juste prendre . Vous pouvez transformer cela en données avec une matrice de covariance donnée en choisissant A pour être la racine carrée cholesky de Ω - alors A x aurait la matrice de covariance Ω souhaitée .Σ = I UNE Ω A x Ω
Dans votre exemple, vous semblez vouloir quelque chose comme ceci:
Malheureusement, cette matrice n'est pas définie positive, elle ne peut donc pas être une matrice de covariance - vous pouvez le vérifier en voyant que le déterminant est négatif. Peut-être, à la place
suffirait. Je ne sais pas comment calculer la racine carrée cholesky dans matlab (qui semble être ce que vous utilisez) mais
R
vous pouvez utiliser lachol()
fonction.Dans cet exemple, pour les deux énumérés ci-dessus, les multiples de matrice appropriés (respectivement) seraientΩ
Le
R
code utilisé pour y parvenir était:la source
chol
Si vous utilisez R, vous pouvez également utiliser la fonction mvrnorm du package MASS, en supposant que vous souhaitiez des variables normalement distribuées. L'implémentation est similaire à la description de Macro ci-dessus, mais utilise les vecteurs propres de la matrice de corrélation au lieu de la décomposition et de la mise à l'échelle cholesky avec une décomposition en valeurs singulières (si l'option empirique est définie sur true).
Notez que la matrice de corrélation doit être définie positive, mais la convertir avec la fonction nearPD du package Matrix dans R sera utile.
la source
la source