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
Das mit einem Korrelationskoeffizienten von 0,8 erzeugte X-, Y-Streudiagramm und die periphere Verteilung sehen folgendermaßen aus. Für Z, das von der obigen Transformation gebissen wurde, sehen das Streudiagramm mit X und die periphere Verteilung folgendermaßen aus. 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) 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.
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