2013-04-15 11 views
5

Rには相関データを作成するためのサンプル量、変数量、および相関行列を取る関数(cm.rnorm.cor、パッケージCreditMetrics)があります。Python(3.3)で相関データを生成

Pythonには同等の機能はありますか?

+0

申し訳ありませんが、私の悪い、Python 3.3。 – PascalVKooten

+0

Whaaat ...サポートが最近追加されました!私に思い出させてくれてありがとう。 – PascalVKooten

+0

@Dualinity、ユーモアがありません。Blenderの素晴らしいパッケージの横に、Python(X、Y)を試してみることをお勧めします。これは、科学的開発のためのPythonパッケージのコレクション+ IPython + SpyderというGreat IDEです。 http://code.google.com/p/pythonxy/ – Oz123

答えて

9

numpy.random.multivariate_normalは、必要な機能です。

例:

import numpy as np 
import matplotlib.pyplot as plt 


num_samples = 400 

# The desired mean values of the sample. 
mu = np.array([5.0, 0.0, 10.0]) 

# The desired covariance matrix. 
r = np.array([ 
     [ 3.40, -2.75, -2.00], 
     [ -2.75, 5.50, 1.50], 
     [ -2.00, 1.50, 1.25] 
    ]) 

# Generate the random samples. 
y = np.random.multivariate_normal(mu, r, size=num_samples) 


# Plot various projections of the samples. 
plt.subplot(2,2,1) 
plt.plot(y[:,0], y[:,1], 'b.') 
plt.plot(mu[0], mu[1], 'ro') 
plt.ylabel('y[1]') 
plt.axis('equal') 
plt.grid(True) 

plt.subplot(2,2,3) 
plt.plot(y[:,0], y[:,2], 'b.') 
plt.plot(mu[0], mu[2], 'ro') 
plt.xlabel('y[0]') 
plt.ylabel('y[2]') 
plt.axis('equal') 
plt.grid(True) 

plt.subplot(2,2,4) 
plt.plot(y[:,1], y[:,2], 'b.') 
plt.plot(mu[1], mu[2], 'ro') 
plt.xlabel('y[1]') 
plt.axis('equal') 
plt.grid(True) 

plt.show() 

結果:

enter image description here

はscipyのダウンロードクックブックにもCorrelatedRandomSamples参照してください。

5

あなたはL L^Tに共分散行列Cをコレスキー分解し、 独立したランダムベクトル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() 

enter image description here

参考:あなたは2つのシリーズ、XYを生成する場合、特定の(Pearson) correlation coefficient(例えば0.2)で、Cholesky decomposition


を参照してください:

rho = cov(X,Y)/sqrt(var(X)*var(Y)) 

あなたは、共分散行列が

cov = [[1, 0.2], 
     [0.2, 1]] 
これは cov(X,Y) = 0.2を行い

、および分散、var(X)と1に等しいの両方var(Y)のでrhoが0.2に等しくなるように選択することができます。

たとえば、以下の例では、相関した一連のペア(XおよびY)を1000回生成します。あなたが見ることができるように、相関係数が0.2に近い一般的ですが、任意の与えられた試料のために、相関が最も可能性の高い、正確に0.2ではありません

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() 

enter image description here

:その後、我々は相関係数のヒストグラムをプロット。

+0

データに正確に0.2の相関があるようにする方法を知っていますか(小さな公差のように)? – PascalVKooten

+0

これは既に正確ですか? – PascalVKooten

+0

フードの中で 'numpy.random.multivariate_normal'とは何ですか?なぜなら私は前者をコレスキー的アプローチと比較して、後者は特に数千のようなより大きな次元のデータの方がはるかに高速であることが分かったからです。コレスキーアプローチは、特定の種類の共分散行列に対してのみ機能しますか?私のcov-matrixは対角線にすぎないか、非常にまばらです。 – Jason

関連する問題