+1 à @ user11852 et @ jem77bfp, ce sont de bonnes réponses. Permettez-moi d’aborder la question sous un angle différent, non pas parce que je pense que c’est nécessairement meilleur dans la pratique , mais parce que je pense que c’est instructif. Voici quelques faits pertinents que nous connaissons déjà:
- est la pente de la droite de régression lorsque X et Y sont tous deuxnormalisés, c'est-à-dire N ( 0 , 1 ) , rXYN( 0 , 1 )
est la proportion de la variance dans Y attribuable à la variance dans X , r2YX
(aussi, à partir des règles pour les écarts ):
- la variance d'une variable aléatoire multipliée par une constante est la constante carré multipliée par la variance initiale:
Var [ un X] = a2Var [ X]
- variances add , c’est-à-dire que la variance de la somme de deux variables aléatoires (en supposant qu’elles soient indépendantes) est la somme des deux variances:
Var [ X+ ε ] = Var [ X] + Var [ ε ]
Nous pouvons maintenant combiner ces quatre faits pour créer deux variables normales standard dont les populations auront une corrélation donnée, (plus exactement, ρ ), bien que les échantillons que vous générez auront des corrélations d’échantillon variables. L’idée est de créer une variable pseudo-aléatoire, X , qui est normale normale, N ( 0 , 1 ) , puis de trouver un coefficient, a , et une variance d’erreur, v e , tels que Y ∼ N ( 0 , a 2 + v e ) , où unrρXN( 0 , 1 )uneveY∼ N( 0 , un2+ ve) . (Notez que | a | doit être ≤ 1 pour que cela fonctionne et que, en outre, a = r .) Ainsi, vous commencez avec le r que vous voulez; c'est votre coefficient, a . Ensuite, vous déterminez la variance d'erreur dont vous aurez besoin, il s'agit de 1 - r 2 . (Si votre logiciel nécessite l'utilisation de l'écart type, prenez la racine carrée de cette valeur.) Enfin, pour chaque variable pseudo-aléatoireque vous avez générée, x i , générez une variable d'erreur pseudo-aléatoire, e iune2+ ve= 1| a | ≤ 1a = rrune1 - r2Xjeeje, avec la variance d'erreur appropriée , et calculez la variable pseudo-aléatoire corrélée, y i , en multipliant et en ajoutant. veyje
Si vous voulez faire cela dans R, le code suivant peut fonctionner pour vous:
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: j'ai oublié de mentionner :) Comme je l'ai décrit, cette procédure vous donne deux variables corrélées normales standard. Si vous ne voulez pas standards Normales, mais que vous voulez les variables d'avoir des moyens de spécifiques (non 0) et (pas 1 SDs), vous pouvez les transformer sans affecter la corrélation. Ainsi, vous soustrairez la moyenne observée pour vous assurer que la moyenne est exactement égale à , multipliez la variable par le SD que vous voulez et ajoutez ensuite la moyenne de votre choix. Si vous souhaitez que la moyenne observée fluctue normalement autour de la moyenne souhaitée, vous devez rajouter la différence initiale. Il s’agit essentiellement d’une transformation z-score inversée. Puisqu'il s'agit d'une transformation linéaire, la variable transformée aura la même corrélation avec l'autre variable qu'avant. 0
Encore une fois, ceci, dans sa forme la plus simple, ne vous permet que de générer une paire de variables corrélées (cela peut être étendu, mais devient très vite), et ce n’est certainement pas le moyen le plus pratique d’accomplir votre travail. Dans R, vous voudriez utiliser ? Mvrnorm dans le package MASS , à la fois parce que c'est plus facile et parce que vous pouvez générer de nombreuses variables avec une matrice de corrélation de population donnée. Néanmoins, je pense que cela vaut la peine d'avoir parcouru ce processus pour voir comment certains principes de base s'appliquent de manière simple.