天天看點

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

原文位址:http://blog.sina.com.cn/s/blog_4a0824490100ync4.html

Pearson相關系數用來衡量兩個資料集合是否在一條線上面。其計算公式為:

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

一個具體的計算的例子:

X Y

1 2

2 5

3 6
      
【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

而利用matlab計算:函數 corrcoef

例如:

help corrcoef

x =randn(30,4);    % Uncorrelated data

x(:,4) =sum(x,2);   %Introduce correlation.

[r,p] = corrcoef(x)  % Compute samplecorrelation and p-values.

[i,j] = find(p<0.05);  %Find significant correlations.

[i,j]               % Display their (row,col) indices.

r =

   1.0000  -0.3566   0.1929   0.3457

  -0.3566   1.0000  -0.1429   0.4461

   0.1929  -0.1429   1.0000   0.5183

   0.3457   0.4461   0.5183   1.0000

p =

   1.0000   0.0531   0.3072   0.0613

   0.0531   1.0000   0.4511   0.0135

   0.3072   0.4511   1.0000   0.0033

   0.0613   0.0135   0.0033   1.0000

ans =

    4    2

    4    3

    2    4

    3    4

r(i,j)就表示x(:,i)和x(:,j)的相關系數.

相關系數r的值介于–1與+1之間,即–1≤r≤+1。其性質如下:

當r>0時,表示兩變量正相關,r<0時,兩變量為負相關。

當|r|=1時,表示兩變量為完全線性相關,即為函數關系。

當r=0時,表示兩變量間無線性相關關系。

當0<|r|<1時,表示兩變量存在一定程度的線性相關。且|r|越接近1,兩變量間線性關系越密切;|r|越接近于0,表示兩變量的線性相關越弱。

一般可按三級劃分:|r|<0.4為低度線性相關;0.4≤|r|<0.7為顯著性相關;0.7≤|r|<1為高度線性相關。

=================================================================================

由于使用的統計相關系數比較頻繁,是以這裡就利用幾篇文章簡單介紹一下這些系數。

相關系數:考察兩個事物(在資料裡我們稱之為變量)之間的相關程度。

如果有兩個變量:X、Y,最終計算出的相關系數的含義可以有如下了解:

(1)、當相關系數為0時,X和Y兩變量無關系。

(2)、當X的值增大(減小),Y值增大(減小),兩個變量為正相關,相關系數在0.00與1.00之間。

(3)、當X的值增大(減小),Y值減小(增大),兩個變量為負相關,相關系數在-1.00與0.00之間。

相關系數的絕對值越大,相關性越強,相關系數越接近于1或-1,相關度越強,相關系數越接近于0,相關度越弱。

通常情況下通過以下取值範圍判斷變量的相關強度:

相關系數    0.8-1.0     極強相關

                0.6-0.8    強相關

                0.4-0.6    中等程度相關

                0.2-0.4    弱相關

                0.0-0.2    極弱相關或無相關

Pearson(皮爾遜)相關系數

1、簡介

皮爾遜相關也稱為積差相關(或積矩相關)是英國統計學家皮爾遜于20世紀提出的一種計算直線相關的方法。

假設有兩個變量X、Y,那麼兩變量間的皮爾遜相關系數可通過以下公式計算:

公式一:

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

公式二:

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

公式三:

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

公式四:

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

以上列出的四個公式等價,其中E是數學期望,cov表示協方差,N表示變量取值的個數。

2、适用範圍

當兩個變量的标準差都不為零時,相關系數才有定義,皮爾遜相關系數适用于:

(1)、兩個變量之間是線性關系,都是連續資料。

(2)、兩個變量的總體是正态分布,或接近正态的單峰分布。

(3)、兩個變量的觀測值是成對的,每對觀測值之間互相獨立。

3、Matlab實作

皮爾遜相關系數的Matlab實作(依據公式四實作):

function coeff = myPearson(X , Y)  

  1. % 本函數實作了皮爾遜相關系數的計算操作  
  2. %  
  3. % 輸入:  
  4. %   X:輸入的數值序列  
  5. %   Y:輸入的數值序列  
  6. %  
  7. % 輸出:  
  8. %   coeff:兩個輸入數值序列X,Y的相關系數  
  9. %  
  10. if length(X) ~= length(Y)  
  11.     error('兩個數值數列的維數不相等');  
  12.     return;  
  13. end  
  14. fenzi = sum(X .* Y) - (sum(X) * sum(Y)) / length(X);  
  15. fenmu = sqrt((sum(X .^2) - sum(X)^2 / length(X)) * (sum(Y .^2) - sum(Y)^2 / length(X)));  
  16. coeff = fenzi / fenmu;  
  17. end %函數myPearson結束  

 也可以使用Matlab中已有的函數計算皮爾遜相關系數:

coeff = corr(X , Y);  

4、參考内容

http://zh.wikipedia.org/zh-cn/相關

=================================================================================

Spearman Rank(斯皮爾曼等級)相關系數

1、簡介

在統計學中,斯皮爾曼等級相關系數以Charles Spearman命名,并經常用希臘字母ρ(rho)表示其值。斯皮爾曼等級相關系數用來估計兩個變量X、Y之間的相關性,其中變量間的相關性可以使用單調函數來描述。如果兩個變量取值的兩個集合中均不存在相同的兩個元素,那麼,當其中一個變量可以表示為另一個變量的很好的單調函數時(即兩個變量的變化趨勢相同),兩個變量之間的ρ可以達到+1或-1。

假設兩個随機變量分别為X、Y(也可以看做兩個集合),它們的元素個數均為N,兩個随即變量取的第i(1<=i<=N)個值分别用Xi、Yi表示。對X、Y進行排序(同時為升序或降序),得到兩個元素排行集合x、y,其中元素xi、yi分别為Xi在X中的排行以及Yi在Y中的排行。将集合x、y中的元素對應相減得到一個排行差分集合d,其中di=xi-yi,1<=i<=N。随機變量X、Y之間的斯皮爾曼等級相關系數可以由x、y或者d計算得到,其計算方式如下所示:

由排行差分集合d計算而得(公式一):

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

由排行集合x、y計算而得(斯皮爾曼等級相關系數同時也被認為是經過排行的兩個随即變量的皮爾遜相關系數,以下實際是計算x、y的皮爾遜相關系數)(公式二):

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

以下是一個計算集合中元素排行的例子(僅适用于斯皮爾曼等級相關系數的計算)

【matlab】matlab相關系數計算公式(Pearson和Spearman,以及Kendall Rank)Spearman Rank(斯皮爾曼等級)相關系數

這裡需要注意:當變量的兩個值相同時,它們的排行是通過對它們位置進行平均而得到的。

2、适用範圍

斯皮爾曼等級相關系數對資料條件的要求沒有皮爾遜相關系數嚴格,隻要兩個變量的觀測值是成對的等級評定資料,或者是由連續變量觀測資料轉化得到的等級資料,不論兩個變量的總體分布形态、樣本容量的大小如何,都可以用斯皮爾曼等級相關系數來進行研究。

3、Matlab實作

源程式一:

斯皮爾曼等級相關系數的Matlab實作(依據排行差分集合d計算,使用上面的公式一)

viewplaincopy toclipboardprint?

  1. function coeff = mySpearman(X , Y)  
  2. % 本函數用于實作斯皮爾曼等級相關系數的計算操作  
  3. %  
  4. % 輸入:  
  5. %   X:輸入的數值序列  
  6. %   Y:輸入的數值序列  
  7. %  
  8. % 輸出:  
  9. %   coeff:兩個輸入數值序列X,Y的相關系數  
  10. if length(X) ~= length(Y)  
  11.     error('兩個數值數列的維數不相等');  
  12.     return;  
  13. end  
  14. N = length(X); %得到序列的長度  
  15. Xrank = zeros(1 , N); %存儲X中各元素的排行  
  16. Yrank = zeros(1 , N); %存儲Y中各元素的排行  
  17. %計算Xrank中的各個值  
  18. for i = 1 : N  
  19.     cont1 = 1; %記錄大于特定元素的元素個數  
  20.     cont2 = -1; %記錄與特定元素相同的元素個數  
  21.     for j = 1 : N  
  22.         if X(i) < X(j)  
  23.             cont1 = cont1 + 1;  
  24.         elseif X(i) == X(j)  
  25.             cont2 = cont2 + 1;  
  26.         end  
  27.     end  
  28.     Xrank(i) = cont1 + mean([0 : cont2]);  
  29. end  
  30. %計算Yrank中的各個值  
  31. for i = 1 : N  
  32.     cont1 = 1; %記錄大于特定元素的元素個數  
  33.     cont2 = -1; %記錄與特定元素相同的元素個數  
  34.     for j = 1 : N  
  35.         if Y(i) < Y(j)  
  36.             cont1 = cont1 + 1;  
  37.         elseif Y(i) == Y(j)  
  38.             cont2 = cont2 + 1;  
  39.         end  
  40.     end  
  41.     Yrank(i) = cont1 + mean([0 : cont2]);  
  42. end  
  43. %利用差分等級(或排行)序列計算斯皮爾曼等級相關系數  
  44. fenzi = 6 * sum((Xrank - Yrank).^2);  
  45. fenmu = N * (N^2 - 1);  
  46. coeff = 1 - fenzi / fenmu;  
  47. end %函數mySpearman結束  

源程式二:

使用Matlab中已有的函數計算斯皮爾曼等級相關系數(使用上面的公式二)

coeff = corr(X , Y , 'type' , 'Spearman');  

注意:使用Matlab自帶函數計算斯皮爾曼等級相關系數時,需要保證X、Y均為列向量;Matlab自帶的函數是通過公式二計算序列的斯皮爾曼等級相關系數的。一般情況下,使用上面給出的源程式一是可以得到所要的結果的,但是當序列X或Y中出現具有相同值的元素時,源程式一給出的結果就會與Matlab中corr函數計算的結果不同,這是因為當序列X或Y中有相同的元素時,公式一和公式二計算的結果會有偏差。這裡可以通過将源程式一中的以下三行

fenzi = 6 * sum((Xrank - Yrank).^2);  

fenmu = N * (N^2 - 1);  

coeff = 1 - fenzi / fenmu;  

改為

coeff = corr(Xrank' , Yrank'); %皮爾遜相關系數  

這樣便可以使源程式一在計算包含相同元素值的變量(至少有一個變量的取值集合中存在相同的元素)間的斯皮爾曼等級相關系數時,得到與Matlab自帶函數一樣的結果。程式一經過修改過後同樣可以用來計算一般變量(兩個變量的取值集合中均不存在相同的元素)等級相關間的斯皮爾曼等級系數。

關于皮爾遜相關系數的計算可參考以下文章:

統計相關系數(1)——Pearson(皮爾遜)相關系數及MATLAB實作

4、參考内容

(1)、http://en.wikipedia.org/wiki/Spearman's_rank_correlation_coefficient

(2)、http://wiki.mbalib.com/wiki/斯皮爾曼等級相關

================================================================================

Kendall Rank肯德爾等級相關系數

具體見:http://blog.csdn.net/wsywl/article/details/5889419

繼續閱讀