R には、相関データを作成するために、サンプルの量、変数の量、および相関行列を取得する関数 (cm.rnorm.cor
パッケージの ) があります。CreditMetrics
Pythonに同等のものはありますか?
R には、相関データを作成するために、サンプルの量、変数の量、および相関行列を取得する関数 (cm.rnorm.cor
パッケージの ) があります。CreditMetrics
Pythonに同等のものはありますか?
共分散行列C
を にコレスキー分解しL L^T
、独立したランダム ベクトル を生成すると、は共分散 を持つランダム ベクトルになり
x
ます。Lx
C
import numpy as np
import matplotlib.pyplot as plt
linalg = np.linalg
np.random.seed(1)
num_samples = 1000
num_variables = 2
cov = [[0.3, 0.2], [0.2, 0.2]]
L = linalg.cholesky(cov)
# print(L.shape)
# (2, 2)
uncorrelated = np.random.standard_normal((num_variables, num_samples))
mean = [1, 1]
correlated = np.dot(L, uncorrelated) + np.array(mean).reshape(2, 1)
# print(correlated.shape)
# (2, 1000)
plt.scatter(correlated[0, :], correlated[1, :], c='green')
plt.show()
参考:コレスキー分解参照
特定の(ピアソン) 相関係数(例: 0.2)を持つ 2 つのシリーズX
およびを生成する場合:Y
rho = cov(X,Y) / sqrt(var(X)*var(Y))
共分散行列を次のように選択できます
cov = [[1, 0.2],
[0.2, 1]]
これにより、cov(X,Y) = 0.2
、分散、var(X)
およびvar(Y)
両方が 1 に等しくなります。したがって、rho
0.2 に等しくなります。
たとえば、以下では、相関系列のペアを生成X
しY
、 を 1000 回生成します。次に、相関係数のヒストグラムをプロットします。
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
linalg = np.linalg
np.random.seed(1)
num_samples = 1000
num_variables = 2
cov = [[1.0, 0.2], [0.2, 1.0]]
L = linalg.cholesky(cov)
rhos = []
for i in range(1000):
uncorrelated = np.random.standard_normal((num_variables, num_samples))
correlated = np.dot(L, uncorrelated)
X, Y = correlated
rho, pval = stats.pearsonr(X, Y)
rhos.append(rho)
plt.hist(rhos)
plt.show()
ご覧のとおり、相関係数は一般に 0.2 に近くなっていますが、特定のサンプルでは、相関係数が正確に 0.2 ではない可能性が高くなります。