J'ai deux vecteurs:
A_1 =
10
200
7
150
A_2 =
0.001
0.450
0.0007
0.200
Je voudrais savoir s'il existe une corrélation entre ces deux vecteurs.
Je pourrais soustraire à chaque valeur la moyenne du vecteur et que:
A_1' * A_2
Y a-t-il de meilleures façons?
Donné:
A_1 = [10 200 7 150]';
A_2 = [0.001 0.450 0.007 0.200]';
(Comme d'autres l'ont déjà souligné) Il existe des outils pour calculer simplement la corrélation, le plus évidemment corr
:
corr(A_1, A_2); %Returns 0.956766573975184 (Requires stats toolbox)
Vous pouvez également utiliser la fonction corrcoef
de base de Matlab, comme ceci:
M = corrcoef([A_1 A_2]): %Returns [1 0.956766573975185; 0.956766573975185 1];
M(2,1); %Returns 0.956766573975184
Qui est étroitement liée à la fonction cov
:
cov([condition(A_1) condition(A_2)]);
Comme vous y êtes presque arrivé dans votre question d'origine, vous pouvez mettre à l'échelle et ajuster les vecteurs vous-même si vous le souhaitez, ce qui donne une meilleure compréhension de ce qui se passe. Créez d'abord une fonction de condition qui soustrait la moyenne et divise par l'écart-type:
condition = @(x) (x-mean(x))./std(x); %Function to subtract mean AND normalize standard deviation
Ensuite, la corrélation semble être (A_1 * A_2)/(A_1 ^ 2), comme ceci:
(condition(A_1)' * condition(A_2)) / sum(condition(A_1).^2); %Returns 0.956766573975185
Par symétrie, cela devrait également fonctionner
(condition(A_1)' * condition(A_2)) / sum(condition(A_2).^2); %Returns 0.956766573975185
Et c'est le cas.
Je crois, mais je n'ai pas l'énergie pour confirmer pour le moment, que les mêmes calculs peuvent être utilisés pour calculer les termes de corrélation et de corrélation croisée lorsqu'ils traitent avec des entrées multi-dimensiotnales, tant que l'on prend soin de manipuler les dimensions et les orientations de les tableaux d'entrée.
Essayez xcorr
, c'est une fonction intégrée dans MATLAB pour la corrélation croisée:
c = xcorr(A_1, A_2);
Cependant, notez qu'il nécessite l'installation de Signal Processing Toolbox . Sinon, vous pouvez plutôt rechercher la commande corrcoef
.
Pour les corrélations, vous pouvez simplement utiliser la fonction corr (boîte à outils statistiques)
corr(A_1(:), A_2(:))
Notez que vous pouvez également simplement utiliser
corr(A_1, A_2)
Mais l'indexation linéaire garantit que vos vecteurs n'ont pas besoin d'être transposés.
Pour effectuer une régression linéaire entre deux vecteurs x
et y
, procédez comme suit:
[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
Pour x=[10;200;7;150]
et y=[0.001;0.45;0.0007;0.2]
Je reçois rsq = 0.9181
.
URL de référence: http://www.mathworks.com/help/matlab/data_analysis/linear-regression.html