转自:http://blog.csdn.net/wsywl/article/details/5859751

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计算而得(公式一):

由排行集合x、y计算而得(斯皮尔曼等级相关系数同时也被认为是经过排行的两个随即变量的皮尔逊相关系数,以下实际是计算x、y的皮尔逊相关系数)(公式二):

以下是一个计算集合中元素排行的例子(仅适用于斯皮尔曼等级相关系数的计算)

这里需要注意:当变量的两个值相同时,它们的排行是通过对它们位置进行平均而得到的。

2、适用范围

斯皮尔曼等级相关系数对数据条件的要求没有皮尔逊相关系数严格,只要两个变量的观测值是成对的等级评定资料,或者是由连续变量观测资料转化得到的等级资料,不论两个变量的总体分布形态、样本容量的大小如何,都可以用斯皮尔曼等级相关系数来进行研究。

3、Matlab实现

源程序一:

斯皮尔曼等级相关系数的Matlab实现(依据排行差分集合d计算,使用上面的公式一)

  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中已有的函数计算斯皮尔曼等级相关系数(使用上面的公式二)

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

注意:使用Matlab自带函数计算斯皮尔曼等级相关系数时,需要保证X、Y均为列向量;Matlab自带的函数是通过公式二计算序列的斯皮尔曼等级相关系数的。一般情况下,使用上面给出的源程序一是可以得到所要的结果的,但是当序列X或Y中出现具有相同值的元素时,源程序一给出的结果就会与Matlab中corr函数计算的结果不同,这是因为当序列X或Y中有相同的元素时,公式一和公式二计算的结果会有偏差。这里可以通过将源程序一中的以下三行

  1. fenzi = 6 * sum((Xrank - Yrank).^2);
  2. fenmu = N * (N^2 - 1);
  3. coeff = 1 - fenzi / fenmu;

改为

  1. coeff = corr(Xrank' , Yrank'); %皮尔逊相关系数

这样便可以使源程序一在计算包含相同元素值的变量(至少有一个变量的取值集合中存在相同的元素)间的斯皮尔曼等级相关系数时,得到与Matlab自带函数一样的结果。程序一经过修改过后同样可以用来计算一般变量(两个变量的取值集合中均不存在相同的元素)等级相关间的斯皮尔曼等级系数。

关于皮尔逊相关系数的计算可参考以下文章:

统计相关系数(1)——Pearson(皮尔逊)相关系数及MATLAB实现

4、参考内容

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

Spearman Rank(斯皮尔曼等级)相关系数及MATLAB实现的更多相关文章

  1. 学习笔记78—三大统计相关系数:Pearson、Spearman秩相关系数、kendall等级相关系数

    ****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...

  2. 三大统计相关系数:Pearson、Spearman秩相关系数、kendall等级相关系数

    统计相关系数简介 由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数. 相关系数:考察两个事物(在数据里我们称之为变量)之间的相关程度. 如果有两个变量:X.Y,最终计算出的相 ...

  3. Spearman Rank(斯皮尔曼等级)相关系数

    转自:http://blog.csdn.net/wsywl/article/details/5859751 1.简介 在统计学中,斯皮尔曼等级相关系数以Charles Spearman命名,并经常用希 ...

  4. Kendall's tau-b(肯德尔)等级相关系数

    Kendall's tau-b(肯德尔)等级相关系数:用于反映分类变量相关性的指标,适用于两个分类变量均为有序分类的情况.对相关的有序变量进行非参数相关检验:取值范围在-1-1之间,此检验适合于正方形 ...

  5. 基音周期提取2-基于线性相关系数的Matlab实现

    基音周期提取2-基于线性相关系数的Matlab实现 基音周期提取结果 图1 基音提取结果 算法说明 线性相关系数 也称"皮尔逊积矩相关系数"(Pearson product-mom ...

  6. spark MLlib 概念 1:相关系数( PPMCC or PCC or Pearson's r皮尔森相关系数) and Spearman's correlation(史匹曼等级相关系数)

    皮尔森相关系数定义: 协方差与标准差乘积的商. Pearson's correlation coefficient when applied to a population is commonly r ...

  7. Spearman(斯皮尔曼) 等级相关

    Spearman相关系数又称秩相关系数,是利用两变量的秩次大小作线性相关分析,对原始变量的分布不作要求,属于非参数统计方法,适用范围要广些.对于服从Pearson相关系数的数据亦可计算Spearman ...

  8. Pearson(皮尔逊)相关系数及MATLAB实现

    转自:http://blog.csdn.net/wsywl/article/details/5727327 由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数. 相关系数:考察 ...

  9. Spark Mllib里的如何对单个数据集用斯皮尔曼计算相关系数

    不多说,直接上干货! import org.apache.spark.mllib.stat.Statistics 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mlli ...

随机推荐

  1. jasper 常用知识点总结

    1.应用: 列头 "YYYY-MM" 格式转化为 "MM YYYY"格式, eg : Date1 = 2014-11 new java.text.SimpleD ...

  2. Linux正则表达式grep

    正则表达式是一种符号表示法,用于识别文本模式.Linux处理正则表达式的主要程序是grep.grep搜索与正则表达式匹配的行,并将结果输送至标准输出. 1. grep匹配模式 grep按下述方式接受选 ...

  3. Fatal error: Call-time pass-by-reference has been removed

    下面的代码报错:Fatal error: Call-time pass-by-reference has been removed function myFunc($arg) { do somethi ...

  4. 原生的强大DOM选择器querySelector

    在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...

  5. FMS 客户端带宽计算、带宽限制

    FMS 客户端带宽计算.带宽限制 1. 带宽计算 FMS内置了带宽检测的特性(被称作"native bandwidth detection"),要进行带宽检测,客户端只要在成功连接 ...

  6. Redis的安装和使用

    Redis 安装redis: 将将要安装redis文件夹放到一个盘中 通过命令行切换到放文件的地方 安装成功后,将文件夹中的扩展放入wamp/php/ext中,然后配置php.ini,重启服务器. 使 ...

  7. Java之反射机制

    一:基本概念:在Java运行时,对于任意一个类,能否知道这个类对应的属性和方法?对于一个对象,能否知道可以调用它的哪些方法?YES! 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言 ...

  8. [No00005D]如何高效利用GitHub

    原文地址:http://www.yangzhiping.com/tech/github.html 正是Github,让社会化编程成为现实.本文尝试谈谈GitHub的文化.技巧与影响. Q1:GitHu ...

  9. java 22 - 8 多线程之线程生命周期图解

  10. javascript特效——烟花燃放的效果[xyytit]

    春节临近,要做活动促销专题页面,百度了下,找到一些烟花燃放的特效,整理并添加了修改烟花各种参数的注释,便于大家修改使用,版权归原作者所有. 1. 示例效果:点击这里   下载源码:点击这里 2. Ht ...