Spearman Rank(斯皮尔曼等级)相关系数
1、简介
在统计学中,斯皮尔曼等级相关系数以Charles Spearman命名,并经常用希腊字母ρ(rho )表示其值。斯皮尔曼等级相关系数用来估计两个变量X 、Y 之间的相关性,其中变量间的相关性可以使用单调函数来描述。如果两个变量取值的两个集合中均不存在相同的两个元素,那么,当其中一个变量可以表示为另一个变量的很好的单调函数时(即两个变量的变化趋势相同),两个变量之间的ρ可以达到+1或-1。
假设两个随机变量分别为X 、Y (也可以看做两个集合),它们的元素个数均为N ,两个随即变量取的第i (1
由排行差分集合d 计算而得(公式一):
由排行集合x 、y 计算而得(斯皮尔曼等级相关系数同时也被认为是经过排行的两个随即变量的皮尔逊相关系数,以下实际是计算x 、y 的皮尔逊相关系数)(公式二):
以下是一个计算集合中元素排行的例子(仅适用于斯皮尔曼等级相关系数的计算)
这里需要注意:当变量的两个值相同时,它们的排行是通过对它们位置进行平均而得到的。
2、适用范围
斯皮尔曼等级相关系数对数据条件的要求没有皮尔逊相关系数严格,只要两个变量的观测值是成对的等级评定资料,或者是由连续变量观测资料转化得到的等级资料,不论两个变量的总体分布形态、样本容量的大小如何,都可以用斯皮尔曼等级相关系数来进行研究。
3、Matlab 实现
源程序一:
斯皮尔曼等级相关系数的Matlab 实现(依据排行差分集合d 计算,使用上面的公式一)
[cpp] view plaincopy 1. function coeff = mySpearman(X , Y)
2. % 本函数用于实现斯皮尔曼等级相关系数的计算操作
3. %
4. % 输入:
5. % X:输入的数值序列
6. % Y:输入的数值序列
7. %
8. % 输出:
9. % coeff:两个输入数值序列X ,Y 的相关系数
10.
11.
12. if length(X) ~= length(Y)
13. error(' 两个数值数列的维数不相等' );
14. return ;
15. end
16.
17. N = length(X); %得到序列的长度
18. Xrank = zeros(1 , N); %存储X 中各元素的排行
19. Yrank = zeros(1 , N); %存储Y 中各元素的排行
20.
21. %计算Xrank 中的各个值
22. for i = 1 : N
23. cont1 = 1; %记录大于特定元素的元素个数
24. cont2 = -1; %记录与特定元素相同的元素个数
25. for j = 1 : N
26. if X(i)
27. cont1 = cont1 + 1;
28. elseif X(i) == X(j)
29. cont2 = cont2 + 1;
30. end
31. end
32. Xrank(i) = cont1 + mean([0 : cont2]);
33. end
34.
35. %计算Yrank 中的各个值
36. for i = 1 : N
37. cont1 = 1; %记录大于特定元素的元素个数
38. cont2 = -1; %记录与特定元素相同的元素个数
39. for j = 1 : N
40. if Y(i)
41. cont1 = cont1 + 1;
42. elseif Y(i) == Y(j)
43. cont2 = cont2 + 1;
44. end
45. end
46. Yrank(i) = cont1 + mean([0 : cont2]);
47. end
48.
49. %利用差分等级(或排行) 序列计算斯皮尔曼等级相关系数
50. fenzi = 6 * sum((Xrank - Yrank).^2);
51. fenmu = N * (N^2 - 1);
52. coeff = 1 - fenzi / fenmu;
53.
54. end %函数mySpearman 结束
源程序二:
使用Matlab 中已有的函数计算斯皮尔曼等级相关系数(使用上面的公式二)
[cpp] view plaincopy 1. coeff = corr(X , Y , 'type' , 'Spearman' ); 注意:使用Matlab 自带函数计算斯皮尔曼等级相关系数时,需要保证X 、Y 均为列向量;Matlab 自带的函数是通过公式二计算序列的斯皮尔曼等级相关系数的。一般情况下,使用上面给出的源程序一是可以得到所要的结果的,但是当序列X 或Y 中出现具有相同值的元素时,源程序一给出的结果就会与Matlab 中corr 函数计算的结果不同,这是因为当序列X 或Y 中有相同的元素时,公式一和公式二计算的结果会有偏差。这里可以通过将源程序一中的以下三行
[cpp] view plaincopy
1. fenzi = 6 * sum((Xrank - Yrank).^2);
2. fenmu = N * (N^2 - 1);
3. coeff = 1 - fenzi / fenmu;
改为
[cpp] view plaincopy
1. coeff = corr(Xrank' , Yrank'); %皮尔逊相关系数
这样便可以使源程序一在计算包含相同元素值的变量(至少有一个变量的取值集合中存在相同的元素)间的斯皮尔曼等级相关系数时,得到与Matlab 自带函数一样的结果。程序一经过修改过后同样可以用来计算一般变量(两个变量的取值集合中均不存在相同的元素)等级相关间的斯皮尔曼等级系数。
Spearman Rank(斯皮尔曼等级)相关系数
1、简介
在统计学中,斯皮尔曼等级相关系数以Charles Spearman命名,并经常用希腊字母ρ(rho )表示其值。斯皮尔曼等级相关系数用来估计两个变量X 、Y 之间的相关性,其中变量间的相关性可以使用单调函数来描述。如果两个变量取值的两个集合中均不存在相同的两个元素,那么,当其中一个变量可以表示为另一个变量的很好的单调函数时(即两个变量的变化趋势相同),两个变量之间的ρ可以达到+1或-1。
假设两个随机变量分别为X 、Y (也可以看做两个集合),它们的元素个数均为N ,两个随即变量取的第i (1
由排行差分集合d 计算而得(公式一):
由排行集合x 、y 计算而得(斯皮尔曼等级相关系数同时也被认为是经过排行的两个随即变量的皮尔逊相关系数,以下实际是计算x 、y 的皮尔逊相关系数)(公式二):
以下是一个计算集合中元素排行的例子(仅适用于斯皮尔曼等级相关系数的计算)
这里需要注意:当变量的两个值相同时,它们的排行是通过对它们位置进行平均而得到的。
2、适用范围
斯皮尔曼等级相关系数对数据条件的要求没有皮尔逊相关系数严格,只要两个变量的观测值是成对的等级评定资料,或者是由连续变量观测资料转化得到的等级资料,不论两个变量的总体分布形态、样本容量的大小如何,都可以用斯皮尔曼等级相关系数来进行研究。
3、Matlab 实现
源程序一:
斯皮尔曼等级相关系数的Matlab 实现(依据排行差分集合d 计算,使用上面的公式一)
[cpp] view plaincopy 1. function coeff = mySpearman(X , Y)
2. % 本函数用于实现斯皮尔曼等级相关系数的计算操作
3. %
4. % 输入:
5. % X:输入的数值序列
6. % Y:输入的数值序列
7. %
8. % 输出:
9. % coeff:两个输入数值序列X ,Y 的相关系数
10.
11.
12. if length(X) ~= length(Y)
13. error(' 两个数值数列的维数不相等' );
14. return ;
15. end
16.
17. N = length(X); %得到序列的长度
18. Xrank = zeros(1 , N); %存储X 中各元素的排行
19. Yrank = zeros(1 , N); %存储Y 中各元素的排行
20.
21. %计算Xrank 中的各个值
22. for i = 1 : N
23. cont1 = 1; %记录大于特定元素的元素个数
24. cont2 = -1; %记录与特定元素相同的元素个数
25. for j = 1 : N
26. if X(i)
27. cont1 = cont1 + 1;
28. elseif X(i) == X(j)
29. cont2 = cont2 + 1;
30. end
31. end
32. Xrank(i) = cont1 + mean([0 : cont2]);
33. end
34.
35. %计算Yrank 中的各个值
36. for i = 1 : N
37. cont1 = 1; %记录大于特定元素的元素个数
38. cont2 = -1; %记录与特定元素相同的元素个数
39. for j = 1 : N
40. if Y(i)
41. cont1 = cont1 + 1;
42. elseif Y(i) == Y(j)
43. cont2 = cont2 + 1;
44. end
45. end
46. Yrank(i) = cont1 + mean([0 : cont2]);
47. end
48.
49. %利用差分等级(或排行) 序列计算斯皮尔曼等级相关系数
50. fenzi = 6 * sum((Xrank - Yrank).^2);
51. fenmu = N * (N^2 - 1);
52. coeff = 1 - fenzi / fenmu;
53.
54. end %函数mySpearman 结束
源程序二:
使用Matlab 中已有的函数计算斯皮尔曼等级相关系数(使用上面的公式二)
[cpp] view plaincopy 1. coeff = corr(X , Y , 'type' , 'Spearman' ); 注意:使用Matlab 自带函数计算斯皮尔曼等级相关系数时,需要保证X 、Y 均为列向量;Matlab 自带的函数是通过公式二计算序列的斯皮尔曼等级相关系数的。一般情况下,使用上面给出的源程序一是可以得到所要的结果的,但是当序列X 或Y 中出现具有相同值的元素时,源程序一给出的结果就会与Matlab 中corr 函数计算的结果不同,这是因为当序列X 或Y 中有相同的元素时,公式一和公式二计算的结果会有偏差。这里可以通过将源程序一中的以下三行
[cpp] view plaincopy
1. fenzi = 6 * sum((Xrank - Yrank).^2);
2. fenmu = N * (N^2 - 1);
3. coeff = 1 - fenzi / fenmu;
改为
[cpp] view plaincopy
1. coeff = corr(Xrank' , Yrank'); %皮尔逊相关系数
这样便可以使源程序一在计算包含相同元素值的变量(至少有一个变量的取值集合中存在相同的元素)间的斯皮尔曼等级相关系数时,得到与Matlab 自带函数一样的结果。程序一经过修改过后同样可以用来计算一般变量(两个变量的取值集合中均不存在相同的元素)等级相关间的斯皮尔曼等级系数。