Supposons que nous ayons
X 2 ∼ unif ( n , 0 , 1 ) ,
où est un échantillon aléatoire uniforme de taille n, et
La corrélation entre et est alors de .Z 0.4
Comment puis-je étendre cela à trois variables: , , ?X 2 X 3
Supposons que nous ayons
X 2 ∼ unif ( n , 0 , 1 ) ,
où est un échantillon aléatoire uniforme de taille n, et
La corrélation entre et est alors de .Z 0.4
Comment puis-je étendre cela à trois variables: , , ?X 2 X 3
Réponses:
La question contient plusieurs erreurs comme indiqué dans les commentaires - comme défini dans la question, Z n'est ni uniforme ni a la corrélation spécifiée.
le cardinal mentionne les copules, et c'est la manière la plus générale de procéder. Cependant, il existe plusieurs façons assez faciles d'obtenir des uniformes corrélés (qui peuvent être considérés comme de simples raccourcis vers différents types de copules).
Commençons donc par quelques façons d'obtenir une paire d'uniformes corrélés.
1) Si vous ajoutez deux uniformes, le résultat est triangulaire et non uniforme. Mais vous pouvez utiliser le cdf de la variable résultante comme transformation pour ramener le résultat à un uniforme. Bien sûr, le résultat n'est plus corrélé linéairement.
Voici une fonction R pour transformer un triangulaire symétrique sur (0,2) en uniforme standard
t2u = function(x) ifelse(x<1, x^2, 2-(2-x)^2)/2
Vérifions qu'il donne un uniforme
u1 = runif(30000)
u2 = runif(30000)
v1 = t2u(u1+u2)
Et il est en corrélation avec u1 et u2:
> cor(cbind(u1,u2,v1))
u1 u2 v1
u1 1.000000000 0.006311667 0.7035149
u2 0.006311667 1.000000000 0.7008528
v1 0.703514895 0.700852805 1.0000000
mais pas linéairement, en raison de la transformation monotone en uniformité
Avec cela comme outil, nous pouvons générer des variables supplémentaires pour obtenir trois uniformes équicorrélés:
u3 = runif(30000)
v2 = t2u(u1+u3)
v3 = t2u(u2+u3)
cor(cbind(v1,v2,v3))
v1 v2 v3
v1 1.0000000 0.4967572 0.4896972
v2 0.4967572 1.0000000 0.4934746
v3 0.4896972 0.4934746 1.0000000
La relation entre les variables v ressemble à ceci:
-
Une deuxième alternative est de générer en prenant un mélange . Au lieu de additionner les uniformes, prenez-les avec des probabilités fixes.
par exemple
z = ifelse(rbinom(30000,1,.7),u1,u2)
cor(cbind(u1,z))
u1 z
u1 1.0000000 0.7081533
z 0.7081533 1.0000000
Qui peut à nouveau être utilisé pour générer plusieurs uniformes corrélés.
-
Une troisième approche simple consiste à générer des normales corrélées et à les transformer en uniformité.
n1=rnorm(30000)
n2=rnorm(30000)
n3=rnorm(30000)
x=.6*n1+.8*n2
y=.6*n2+.8*n3
z=.6*n3+.8*n1
cor(cbind(x,y,z))
x y z
x 1.0000000 0.4763703 0.4792897
y 0.4763703 1.0000000 0.4769403
z 0.4792897 0.4769403 1.0000000
Alors maintenant, nous convertissons en uniforme:
w1 = pnorm(x)
w2 = pnorm(y)
w3 = pnorm(z)
cor(cbind(w1,w2,w3))
w1 w2 w3
w1 1.0000000 0.4606723 0.4623311
w2 0.4606723 1.0000000 0.4620257
w3 0.4623311 0.4620257 1.0000000
Une bonne chose à propos des méthodes 2 et 3 est que vous avez beaucoup de choix dans la façon dont les choses peuvent être corrélées (et elles n'ont pas besoin d'être équicorrélées comme les exemples ici).
Il existe bien sûr une grande variété d'autres approches, mais elles sont toutes rapides et faciles.
La partie délicate consiste à obtenir exactement la corrélation de population souhaitée; ce n'est pas aussi simple que lorsque vous voulez juste des Gaussiens corrélés. La réponse de Quantibex à Générer des paires de nombres aléatoires uniformément distribués et corrélés donne une approche qui modifie ma troisième méthode ici qui devrait donner la corrélation de population souhaitée.
Cela devrait vous aider à décomposer une série en ses composants de la même manière que vous décomposeriez un vecteur en ses composants orthogonaux.