CorrCoef

Calculer le coefficient de corrélation de Pearson (coefficient de corrélation linéaire).

matrix matrix::CorrCoef(
  const bool    rowvar=true  // vecteurs ligne ou colonne d'observations
);
 
scalar vector::CorrCoef(
  const vector&  b           // deuxième vecteur
);
 

Valeur de Retour

Coefficients de corrélation produit-moment de Pearson.

Note

Le coefficient de corrélation est dans la plage [-1, 1].

En raison de l'arrondi en virgule flottante, le tableau résultant peut ne pas être hermitien, les éléments diagonaux peuvent ne pas être 1 et les éléments peuvent ne pas satisfaire l'inégalité abs(a) <= 1. Les parties réelles et imaginaires sont coupées à l'intervalle [-1, 1] dans une tentative d'améliorer cette situation mais n'est pas d'une grande aide dans le cas complexe.

Un algorithme simple pour calculer le coefficient de corrélation de deux vecteurs en utilisant MQL5 :

double VectorCorrelation(const vectorvector_x,const vectorvector_y)
  {
   ulong n=vector_x.Size()<vector_y.Size() ? vector_x.Size() : vector_y.Size();
   if(n<=1)
      return(0);
 
   ulong  i;
   double xmean=0;
   double ymean=0;
   for(i=0i<ni++)
     {
      if(!MathIsValidNumber(vector_x[i]))
         return(0);
      if(!MathIsValidNumber(vector_y[i]))
         return(0);
      xmean+=vector_x[i];
      ymean+=vector_y[i];
     }
   xmean/=(double)n;
   ymean/=(double)n;
 
   double s=0;
   double xv=0;
   double yv=0;
   double t1=0;
   double t2=0;
//--- calcul
   s=0;
   for(i=0i<ni++)
     {
      t1=vector_x[i]-xmean;
      t2=vector_y[i]-ymean;
      xv+=t1*t1;
      yv+=t2*t2;
      s+=t1*t2;
     }
//--- vérification
   if(xv==0 || yv==0)
      return(0);
//--- retourne le résultat
   return(s/(MathSqrt(xv)*MathSqrt(yv)));
  }

 

Exemple en MQL5 :

   vectorf vector_a={1,2,3,4,5};
   vectorf vector_b={0,1,0.5,2,2.5};
   Print("corrélation des vecteurs ",vector_a.CorrCoef(vector_b));
//---
   matrixf matrix_a={{1,2,3,4,5},
                    {0,1,0.5,2,2.5}};
corrélation des lignes de la matrice   Print("matrix rows correlation\n",matrix_a.CorrCoef());
   matrixf matrix_a2=matrix_a.Transpose();
   Print("corrélation des colonnes transposées de la matrice\n",matrix_a2.CorrCoef(false));
   matrixf matrix_a3={{1.0f2.0f3.0f4.0f5.0f},
                      {0.0f1.0f0.5f2.0f2.5f},
                      {0.1f1.0f2.0f1.0f0.3f}};
   Print("corrélation des lignes\n",matrix_a3.CorrCoef());
   Print("corrélation des colonnes\n",matrix_a3.CorrCoef(false));
 
  /*
   corrélation des vecteurs 0.9149913787841797
   corrélation des lignes de la matrice
   [[1,0.91499138]
    [0.91499138,1]]
   corrélation  des colonnes transposées  de la matrice
   [[1,0.91499138]
    [0.91499138,1]]
   corrélation des lignes
   [[1,0.91499138,0.08474271]
    [0.91499138,1,-0.17123166]
    [0.08474271,-0.17123166,1]]
   corrélation des colonnes
   [[1,0.99587059,0.85375023,0.91129309,0.83773589]
    [0.99587059,1,0.80295509,0.94491106,0.88385159]
    [0.85375023,0.80295509,1,0.56362146,0.43088508]
    [0.91129309,0.94491106,0.56362146,1,0.98827404]
    [0.83773589,0.88385159,0.43088508,0.98827404,1]]
   */

 

Exemple en Python :

import numpy as np
va=[1,2,3,4,5]
vb=[0,1,0.5,2,2.5]
print("corrélation des vecteurs")
print(np.corrcoef(va,vb))
 
ma=np.zeros((2,5))
ma[0,:]=va
ma[1,:]=vb
print("corrélation des lignes de la matrice")
print(np.corrcoef(ma))
print("corrélation des colonnes transposées de la matrice")
print(np.corrcoef(np.transpose(ma),rowvar=False))
print("")
 
ma1=[[1,2,3,4,5],[0,1,0.5,2,2.5],[0.1,1,0.2,1,0.3]]
print("corrélation des lignes\n",np.corrcoef(ma1))
print("corrélation des colonnes\n",np.corrcoef(ma1,rowvar=False))
 
corrélation des colonnes transposées de la matrice
[[1.         0.91499142]
 [0.91499142 1.        ]]
 
corrélation des lignes
 [[1.         0.91499142 0.1424941 ]
 [0.91499142 1.         0.39657517]
 [0.1424941  0.39657517 1.        ]]
corrélation des colonnes
 [[1.         0.99587059 0.98226063 0.91129318 0.83773586]
 [0.99587059 1.         0.99522839 0.94491118 0.88385151]
 [0.98226063 0.99522839 1.         0.97234063 0.92527551]
 [0.91129318 0.94491118 0.97234063 1.         0.98827406]
 [0.83773586 0.88385151 0.92527551 0.98827406 1.        ]]