轉自:http://blog.csdn.net/wsywl/article/details/5859751
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計算而得(公式一):
由排行集合x、y計算而得(斯皮爾曼等級相關系數同時也被認為是經過排行的兩個隨即變量的皮爾遜相關系數,以下實際是計算x、y的皮爾遜相關系數)(公式二):
以下是一個計算集合中元素排行的例子(僅適用於斯皮爾曼等級相關系數的計算)
這里需要注意:當變量的兩個值相同時,它們的排行是通過對它們位置進行平均而得到的。
2、適用范圍
斯皮爾曼等級相關系數對數據條件的要求沒有皮爾遜相關系數嚴格,只要兩個變量的觀測值是成對的等級評定資料,或者是由連續變量觀測資料轉化得到的等級資料,不論兩個變量的總體分布形態、樣本容量的大小如何,都可以用斯皮爾曼等級相關系數來進行研究。
3、Matlab實現
源程序一:
斯皮爾曼等級相關系數的Matlab實現(依據排行差分集合d計算,使用上面的公式一)
- function coeff = mySpearman(X , Y)
- % 本函數用於實現斯皮爾曼等級相關系數的計算操作
- %
- % 輸入:
- % X:輸入的數值序列
- % Y:輸入的數值序列
- %
- % 輸出:
- % coeff:兩個輸入數值序列X,Y的相關系數
- if length(X) ~= length(Y)
- error('兩個數值數列的維數不相等');
- return;
- end
- N = length(X); %得到序列的長度
- Xrank = zeros(1 , N); %存儲X中各元素的排行
- Yrank = zeros(1 , N); %存儲Y中各元素的排行
- %計算Xrank中的各個值
- for i = 1 : N
- cont1 = 1; %記錄大於特定元素的元素個數
- cont2 = -1; %記錄與特定元素相同的元素個數
- for j = 1 : N
- if X(i) < X(j)
- cont1 = cont1 + 1;
- elseif X(i) == X(j)
- cont2 = cont2 + 1;
- end
- end
- Xrank(i) = cont1 + mean([0 : cont2]);
- end
- %計算Yrank中的各個值
- for i = 1 : N
- cont1 = 1; %記錄大於特定元素的元素個數
- cont2 = -1; %記錄與特定元素相同的元素個數
- for j = 1 : N
- if Y(i) < Y(j)
- cont1 = cont1 + 1;
- elseif Y(i) == Y(j)
- cont2 = cont2 + 1;
- end
- end
- Yrank(i) = cont1 + mean([0 : cont2]);
- end
- %利用差分等級(或排行)序列計算斯皮爾曼等級相關系數
- fenzi = 6 * sum((Xrank - Yrank).^2);
- fenmu = N * (N^2 - 1);
- coeff = 1 - fenzi / fenmu;
- 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
3、Matlab實現
源程序一:
斯皮爾曼等級相關系數的Matlab實現(依據排行差分集合d計算,使用上面的公式一)
源程序二:
使用Matlab中已有的函數計算斯皮爾曼等級相關系數(使用上面的公式二)
注意:使用Matlab自帶函數計算斯皮爾曼等級相關系數時,需要保證X、Y均為列向量;Matlab自帶的函數是通過公式二計算序列的斯皮爾曼等級相關系數的。一般情況下,使用上面給出的源程序一是可以得到所要的結果的,但是當序列X或Y中出現具有相同值的元素時,源程序一給出的結果就會與Matlab中corr函數計算的結果不同,這是因為當序列X或Y中有相同的元素時,公式一和公式二計算的結果會有偏差。這里可以通過將源程序一中的以下三行
改為
這樣便可以使源程序一在計算包含相同元素值的變量(至少有一個變量的取值集合中存在相同的元素)間的斯皮爾曼等級相關系數時,得到與Matlab自帶函數一樣的結果。程序一經過修改過后同樣可以用來計算一般變量(兩個變量的取值集合中均不存在相同的元素)等級相關間的斯皮爾曼等級系數。
關於皮爾遜相關系數的計算可參考以下文章:
統計相關系數(1)——Pearson(皮爾遜)相關系數及MATLAB實現
4、參考內容
(1)、http://en.wikipedia.org/wiki/Spearman's_rank_correlation_coefficient
(2)、http://wiki.mbalib.com/wiki/%E6%96%AF%E7%9A%AE%E5%B0%94%E6%9B%BC%E7%AD%89%E7%BA%A7%E7%9B%B8%E5%85%B3
---------------------
作者:wsywl
來源:CSDN
原文:https://blog.csdn.net/wsywl/article/details/5859751
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!