Si j'ai un vecteur de

8

Mon but ultime est de pouvoir générer un vecteur de taille Ndes variables aléatoires de Bernoulli corrélées. Une façon de le faire est d'utiliser l'approche Coupla gaussienne. Cependant, l'approche Coupla gaussienne me laisse juste un vecteur:

(p1,,pN)[0,1]N

Supposons que j'ai généré telle sorte que la corrélation commune entre eux soit(p1,,pN)ρ. Maintenant, comment puis-je les transformer en un nouveau vecteur de0 ou 1c'est? En d'autres termes, je voudrais:

(X1,,XN){0,1}N

mais avec la même corrélation ρ.

Une approche à laquelle j'ai pensé était d'attribuer une règle de coupure stricte telle que si pje<0,5, puis laissez Xje=0 et si pje0,5, puis laissez Xje=1.

Cela semble bien fonctionner dans les simulations en ce sens qu'il conserve la structure de corrélation mais il est très arbitraire pour moi quelle valeur de coupure devrait être choisie en dehors de 0,5.

Une autre façon est de traiter chacun Xje comme variable aléatoire de Bernoulli avec probabilité de succès pjeet en goûter. Cependant, cette approche semble entraîner une perte de corrélation et au lieu deρ, Je peux avoir ρ2 ou ρ3.

Quelqu'un a-t-il des idées ou des commentaires à ce sujet? Je vous remercie.

user321627
la source
3
Vous avez N variables. Pourquoi parlez-vous seulement d'un seul rho et non d'une matrice de rhos?
ttnphns
4
Voir cette question mathoverflow
Jakub Bartczuk

Réponses:

3

Je ne comprends pas assez la copule gaussienne pour savoir quel est le problème. Mais j'ai trouvé un moyen de générer des vecteurs Bernoulli corrélés.

Suivant https://mathoverflow.net/a/19436/105908 si nous prenons un ensemble de vecteurs fixesv1...vn et un vecteur aléatoire sur la sphère unitaire u, nous pouvons transformer u en binaire XXje=(uvje>0). Dans cette configuration,cor(Xje,Xj)=π-2θ(je,j)πθ(je,j) est l'angle entre vje et vj.

Comment trouver une matrice appropriée V=|v1...vn| pour produire une matrice de corrélation souhaitée R? La condition d'angle se traduit parVVT=cos(-πR-π2) et ainsi nous pouvons trouver V avec décomposition Cholesky.

Un exemple de code dans R suit:

#Get a simple correlation matrix 
N = 3
cor_matrix <- matrix(c(1,0.5,0.8,0.5,1,0.3,0.8,0.3,1), N, N)

#Calculate the vectors with desired angles
vector_matrix <- chol(cos( (pi * cor_matrix - pi) * -0.5))

#You can generate random unit vectors by normalizing a vector 
#of normally distributed variables, note however that the normalization
#does not affect the sign of the dot product and so we ignore it
num_samples <- 10000
normal_rand <- matrix(rnorm(num_samples * N), num_samples, N)

#Generate the target variables
B <- (normal_rand %*% vector_matrix) > 0

#See for yourself that it works
cor(B)  
cor(B) - cor_matrix 

Merci @ jakub-bartczuk pour le lien vers la question MO - je ne trouverais pas cela tout seul.


Le code ci-dessus a une grande limitation: les distributions marginales sont fixées à XjeBernoullje(0,5). Je ne sais pas actuellement comment étendre cette approche pour correspondre à la fois aux corrélations et aux distributions marginales. Une autre réponse a une approche pour le cas général, mais elle perd beaucoup de simplicité (elle implique une intégration numérique). Il existe également un article intitulé Generating Spike Trains with Specified Correlation Coefficients et le paquet Matlab qui l' accompagne où l'échantillonnage implique de «trouver» numériquement le zéro unique d'une fonction monotone par bissection.

Martin Modrák
la source
Merci, c'est super! Puis-je demander comment vous avez obtenu que la condition d'angle soitVVT=cos(-πR-π2)? Merci!
user321627
1
@ user321627 Vous commencez par Rje,j=π-2θ(je,j)π et la relation entre le produit scalaire et l'angle θ(je,j)=unerccos(vje.vj|vje|.|vj|)De là, c'est une algèbre linéaire relativement simple que je suis trop paresseux pour écrire sur ordinateur :-)
Martin Modrák