私は2つのベクトルを持っています:
A_1 =
10
200
7
150
A_2 =
0.001
0.450
0.0007
0.200
これら2つのベクトルの間に相関関係があるかどうか知りたいです。
ベクトルの平均を各値に減算することができます。
A_1' * A_2
より良い方法はありますか?
私は2つのベクトルを持っています:
A_1 =
10
200
7
150
A_2 =
0.001
0.450
0.0007
0.200
これら2つのベクトルの間に相関関係があるかどうか知りたいです。
ベクトルの平均を各値に減算することができます。
A_1' * A_2
より良い方法はありますか?
与えられた:
A_1 = [10 200 7 150]';
A_2 = [0.001 0.450 0.007 0.200]';
(他の人がすでに指摘しているように)相関を単純に計算するツールがありますが、最も明白なのはcorr
:
corr(A_1, A_2); %Returns 0.956766573975184 (Requires stats toolbox)
次のように、基本のMatlabのcorrcoef
関数を使用することもできます。
M = corrcoef([A_1 A_2]): %Returns [1 0.956766573975185; 0.956766573975185 1];
M(2,1); %Returns 0.956766573975184
これは機能と密接に関連していcov
ます:
cov([condition(A_1) condition(A_2)]);
元の質問にほぼ到達したので、必要に応じてベクトルを自分でスケーリングおよび調整できます。これにより、何が起こっているのかを少しよく理解できます。まず、平均を減算し、標準偏差で除算する条件関数を作成します。
condition = @(x) (x-mean(x))./std(x); %Function to subtract mean AND normalize standard deviation
次に、相関は次のように(A_1 * A_2)/(A_1 ^ 2)のように見えます。
(condition(A_1)' * condition(A_2)) / sum(condition(A_1).^2); %Returns 0.956766573975185
対称性により、これも機能するはずです
(condition(A_1)' * condition(A_2)) / sum(condition(A_2).^2); %Returns 0.956766573975185
そして、そうです。
多次元入力を処理するときに、同じ数学を使用して相関項と相互相関項を計算できると信じていますが、現時点で確認するエネルギーはありません。入力配列。
試してみてくださいxcorr
。これは、相互相関のためのMATLABの組み込み関数です。
c = xcorr(A_1, A_2);
ただし、SignalProcessingToolboxがインストールされている必要があることに注意してください。corrcoef
そうでない場合は、代わりにコマンドを調べることができます。
相関関係については、corr関数(統計ツールボックス)を使用できます。
corr(A_1(:), A_2(:))
ただ使用することもできることに注意してください
corr(A_1, A_2)
ただし、線形インデックスは、ベクトルを転置する必要がないことを保証します。
2つのベクトル間で線形回帰を実行し、次の手順x
にy
従います。
[p,err] = polyfit(x,y,1); % First order polynomial
y_fit = polyval(p,x,err); % Values on a line
y_dif = y - y_fit; % y value difference (residuals)
SSdif = sum(y_dif.^2); % Sum square of difference
SStot = (length(y)-1)*var(y); % Sum square of y taken from variance
rsq = 1-SSdif/SStot; % Correlation 'r' value. If 1.0 the correlelation is perfect
x=[10;200;7;150]
と私はy=[0.001;0.45;0.0007;0.2]
得るrsq = 0.9181
。
参照URL: http: //www.mathworks.com/help/matlab/data_analysis/linear-regression.html