Générer trois variables aléatoires corrélées uniformément distribuées

15

Supposons que nous ayons

X 2unif ( n , 0 , 1 ) ,

X1unif(n,0,1),
X2unif(n,0,1),

où est un échantillon aléatoire uniforme de taille n, etunif(n,0,1)

Oui=X1,

Z=0,4X1+1-0,4X2.

La corrélation entre et est alors de .Z 0.4OuiZ0.4

Comment puis-je étendre cela à trois variables: , , ?X 2 X 3X1X2X3

user9292
la source
J'ai modifié votre question pour en faciliter la lecture. Veuillez vérifier que tout est OK. Concernant votre question, dans quel sens prolongeriez-vous votre procédure? La corrélation est définie pour deux variables aléatoires, il n'est donc pas clair pour moi de comprendre ce que vous voulez dire.
ocram
3
Z n'est pas uniforme, donc si vous essayez de généraliser ce résultat, il ne semble pas que vous essayez de générer trois RV uniformes corrélés. Vous vous demandez comment calculer la corrélation entre et ? X1aX1+bX2+cX3
MånsT
Supposons que nous ayons , , et , . Alors, quels sont et ? X1X2X3  unif(n,0,1)Y=f(X2,X3)Z=f(X1,X2,X3)YZ
user9292
6
{Distributions of correlated uniforms}{Copulas}
cardinal
4
Pourquoi n n'entre-t-il pas dans la discussion? Si X1 et X2 sont des variables aléatoires univariées, ne sont-elles pas simplement uniformes sur [0,1]?
Michael R. Chernick

Réponses:

12

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)

entrez la description de l'image ici

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é

entrez la description de l'image ici

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:

entrez la description de l'image ici

-

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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.

Glen_b -Reinstate Monica
la source
Glen_b. Merci, réponse très belle et intéressante!
user9292
Je ne comprends pas d'où viennent les 0.6 et 0.8 de votre troisième approche.
manuel
ρρNi+1ρ2NjNiNjρNi1ρ2NjXYZ
2

X1,X2ZX1 0.40.4YY=0.4X1+1(0.4)2X2

ρcos23cos0

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.

Dmitry Rubanovich
la source