[PYTHON] Mémo sur la façon de faire (approximer) deux variables corrélées, dont chacune suit une distribution arbitraire

Le point

--Je cherchais un moyen de créer une variable de probabilité X qui suit une distribution normale standard et une variable de probabilité Y qui suit une distribution χ2 avec un coefficient de corrélation arbitraire ρ. --Si X et Y suivent la distribution normale standard, vous pouvez les créer par la méthode suivante. --Utilisez la fonction numpy.random.multivariate_normal. --S'il s'agit d'une distribution normale standard multidimensionnelle, la matrice de variance-co-distribution est égale à la matrice de corrélation, donc covmtx = [[1, ρ], [ρ, 1]]

code

sample.py


# import numpy as np
# import scipy.stats as spstats

# generate X,Y ~ multinormal(mu = [0,0], cov = [[1,ρ],[ρ,1]])
rho_norm = 0.8 # correlation coeff for multinorm
mu = [0, 0] # mean of X, Y
cov = [
         [1, rho_norm], 
         [rho_norm, 1]
      ] # cov matrix

vals_norm = np.random.multivariate_normal(mu, cov, 100000)
x_norm = vals_norm[:,0]
y_norm = vals_norm[:,1]
# np.corrcoef(x_norm, y_norm) gives a rho value around rho_norm

# convert Y to Z ~ chi2(k)
k = 3 # parameter of chi2 dist
z_chi2 = spstats.chi2.ppf(spstats.norm.cdf(y_norm, loc = 0, scale = 1), df = k)

# x_norm ~ norm(mu = 0, var = 1) and z_chi2 ~ chi2(k = 3)
# np.corrcoef(x_norm, z_chi2) gives a rho value a bit smaller than rho_norm

résultat

Le diagramme de dispersion X, Y et la distribution périphérique générés avec un coefficient de corrélation de 0,8 ressemblent à ceci. image.png Donc, pour Z qui a été mordu par la transformation ci-dessus, le diagramme de dispersion avec X et la distribution périphérique ressemblent à ceci. image.png Pour Z (axe vertical), on voit que la distribution périphérique est convertie en distribution χ2 avec k = 3. Le coefficient de corrélation à ce moment (puisque la matrice de corrélation peut être obtenue, la composante [0,1]) est image.png La corrélation positive est maintenue, mais elle est inférieure au coefficient de corrélation (0,8) spécifié entre X et Y dans la distribution normale standard multidimensionnelle.

Cette fois, Y a été converti en distribution χ2, mais il peut être converti en n'importe quelle distribution. De plus, X peut être converti de la même manière.

point important

Avec cette méthode, il n'est pas possible de spécifier exactement le coefficient de corrélation après conversion. Je pense qu'il existe une méthode plus simple, mais je n'ai pas pu la trouver pendant un certain temps, alors je vais l'écrire ici. Quelqu'un peut-il me dire comment le faire plus facilement?

26/11 postscript: Il y avait ceci dans le commentaire original de matlab. Presque la même approche, mais décrite plus en détail. FMI (pour mon info)

Recommended Posts

Mémo sur la façon de faire (approximer) deux variables corrélées, dont chacune suit une distribution arbitraire
[Introduction aux data scientists] Bases de la probabilité et des statistiques ♬ Variable de probabilité / probabilité et distribution de probabilité
Notes sur la façon d'exécuter Cython sur OSX
Comment créer un environnement pour utiliser plusieurs versions de Python sur un Mac