[PYTHON] Memo darüber, wie zwei korrelierte Variablen (ungefähr) erstellt werden, von denen jede einer beliebigen Verteilung folgt

Der Punkt

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

Ergebnis

Das mit einem Korrelationskoeffizienten von 0,8 erzeugte X-, Y-Streudiagramm und die periphere Verteilung sehen folgendermaßen aus. image.png Für Z, das von der obigen Transformation gebissen wurde, sehen das Streudiagramm mit X und die periphere Verteilung folgendermaßen aus. image.png Für Z (vertikale Achse) ist ersichtlich, dass die periphere Verteilung mit k = 3 in die χ2-Verteilung umgewandelt wird. Der Korrelationskoeffizient zu diesem Zeitpunkt (da die Korrelationsmatrix erhalten werden kann, ist die [0,1] -Komponente) image.png Die positive Korrelation bleibt erhalten, ist jedoch kleiner als der Korrelationskoeffizient (0,8), der zwischen X und Y in der mehrdimensionalen Standardnormalverteilung angegeben ist.

Dieses Mal wurde Y in eine χ2-Verteilung konvertiert, kann jedoch in eine beliebige Verteilung konvertiert werden. Auf die gleiche Weise kann auch X konvertiert werden.

wichtiger Punkt

Mit dieser Methode ist es nicht möglich, den Korrelationskoeffizienten nach der Konvertierung genau anzugeben. Ich denke, es gibt eine einfachere Methode, aber ich konnte sie eine Weile nicht finden, also schreibe ich sie hier auf. Kann mir bitte jemand sagen, wie es einfacher geht?

11/26 postscript: Der Originalkommentar von matlab enthielt this. Fast der gleiche Ansatz, aber detaillierter beschrieben. FMI (für meine Info)

Recommended Posts

Memo darüber, wie zwei korrelierte Variablen (ungefähr) erstellt werden, von denen jede einer beliebigen Verteilung folgt
[Einführung in Datenwissenschaftler] Grundlagen der Wahrscheinlichkeit und Statistik ♬ Wahrscheinlichkeits- / Wahrscheinlichkeitsvariable und Wahrscheinlichkeitsverteilung
Hinweise zum Ausführen von Cython unter OSX
So erstellen Sie eine Umgebung für die Verwendung mehrerer Python-Versionen auf einem Mac