斯皮尔曼等级相关系数一教学文稿

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Spearman Rank(斯皮尔曼等级)相关系数
1、简介
在统计学中,斯皮尔曼等级相关系数以Charles Spearman命名,并经常用希腊字母ρ(rho)表示其值。

斯皮尔曼等级相关系数用来估计两个变量X、Y之间的相关性,其中变量间的相关性可以使用单调函数来描述。

如果两个变量取值的两个集合中均不存在相同的两个元素,那么,当其中一个变量可以表示为另一个变量的很好的单调函数时(即两个变量的变化趋势相同),两个变量之间的ρ可以达到+1或-1。

假设两个随机变量分别为X、Y(也可以看做两个集合),它们的元素个数均为N,两个随即变量取的第i(1<=i<=N)个值分别用X i、Y i表示。

对X、Y进行排序(同时为升序或降序),得到两个元素排行集合x、y,其中元素x i、y i分别为X i在X中的排行以及Y i在Y中的排行。

将集合x、y中的元素对应相减得到一个排行差分集合d,其中d i=x i-y i,1<=i<=N。

随机变量X、Y之间的斯皮尔曼等级相关系数可以由x、y或者d计算得到,其计算方式如下所示:
由排行差分集合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) < X(j)
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) < Y(j)
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自带函数一样的结果。

程序一经过修改过后同样可以用来计算一般变量(两个变量的取值集合中均不存在相同的元素)等级相关间的斯皮尔曼等级系数。

相关文档
最新文档