计算Spearman等级相关系数的VBA函数

原创 2016年06月01日 09:31:48

公式:

ρ=16i=1nΔri2n3n

其中n是每组数据的个数;Δri 是对应的第i对数据在各自数组中的次序之差;

因为次序r的定义有不同可能,所以,得到的ρ可能有差异。

以下代码适用于Excel不同版本(老版本只提供了rank,不能取平均,2007以后功能得到了加强,有多选择),

Function Spearman(Rng1 As Range, Rng2 As Range) As Double
    Dim WF As WorksheetFunction
    Dim dSquared() As Long
    Dim r As Long
    Set WF = WorksheetFunction
    ReDim Preserve dSquared(1 To Rng1.Cells.Count)

    If Rng1.Columns.Count < 2 Then
      For r = LBound(dSquared) To UBound(dSquared)
         dSquared(r) = (WF.Rank(Rng1.Cells(r, 1), Rng1) - WF.Rank(Rng2.Cells(r, 1), Rng2)) ^ 2
      Next r
    Else
      For r = LBound(dSquared) To UBound(dSquared)
         dSquared(r) = (WF.Rank(Rng1.Cells(1, r), Rng1) - WF.Rank(Rng2.Cells(1, r), Rng2)) ^ 2
      Next r
    End If

    Spearman = 1 - ((6 * WF.Sum(dSquared)) / ((Rng1.Cells.Count ^ 3) - Rng1.Cells.Count))
End Function

Function SpearmanAvg(Rng1 As Range, Rng2 As Range) As Double

    Dim WF As WorksheetFunction
    Dim dSquared() As Double
    Dim r As Long
    Set WF = WorksheetFunction

    ReDim Preserve dSquared(1 To Rng1.Cells.Count)

    If Rng1.Columns.Count < 2 Then
        For r = LBound(dSquared) To UBound(dSquared)
            dSquared(r) = (WF.Rank_Avg(Rng1.Cells(r, 1), Rng1) - WF.Rank_Avg(Rng2.Cells(r, 1), Rng2)) ^ 2
        Next r
    Else
        For r = LBound(dSquared) To UBound(dSquared)
            dSquared(r) = (WF.Rank_Avg(Rng1.Cells(1, r), Rng1) - WF.Rank_Avg(Rng2.Cells(1, r), Rng2)) ^ 2
        Next r
    End If

    SpearmanAvg = 1 - ((6 * WF.Sum(dSquared)) / ((Rng1.Cells.Count ^ 3) - Rng1.Cells.Count))
End Function

Function SpearmanEq(Rng1 As Range, Rng2 As Range) As Double
    Dim WF As WorksheetFunction
    Dim dSquared() As Long
    Dim r As Long
    Set WF = WorksheetFunction
    ReDim Preserve dSquared(1 To Rng1.Cells.Count)

    If Rng1.Columns.Count < 2 Then
      For r = LBound(dSquared) To UBound(dSquared)
         dSquared(r) = (WF.Rank_Eq(Rng1.Cells(r, 1), Rng1) - WF.Rank_Eq(Rng2.Cells(r, 1), Rng2)) ^ 2
      Next r
    Else
      For r = LBound(dSquared) To UBound(dSquared)
         dSquared(r) = (WF.Rank_Eq(Rng1.Cells(1, r), Rng1) - WF.Rank_Eq(Rng2.Cells(1, r), Rng2)) ^ 2
      Next r
    End If

    SpearmanEq = 1 - ((6 * WF.Sum(dSquared)) / ((Rng1.Cells.Count ^ 3) - Rng1.Cells.Count))

End Function

以下为原始代码

Function Spearman(Rng1 As Range, Rng2 As Range) As Double
    Dim WF As WorksheetFunction
    Dim dSquared() As Long
    Dim r As Long
    Set WF = WorksheetFunction
    ReDim Preserve dSquared(1 To Rng1.Rows.Count)
    For r = LBound(dSquared) To UBound(dSquared)
       dSquared(r) = (WF.Rank(Rng1.Cells(r, 1), Rng1) - WF.Rank(Rng2.Cells(r, 1), Rng2)) ^ 2
    Next r
    Spearman = 1 - ((6 * WF.Sum(dSquared)) / ((Rng1.Rows.Count ^ 3) - Rng1.Rows.Count))
End Function

Function SpearmanAvg(Rng1 As Range, Rng2 As Range) As Double
    Dim WF As WorksheetFunction
    Dim dSquared() As Long
    Dim r As Long
    Set WF = WorksheetFunction
    ReDim Preserve dSquared(1 To Rng1.Rows.Count)
    For r = LBound(dSquared) To UBound(dSquared)
       dSquared(r) = (WF.Rank_Avg(Rng1.Cells(r, 1), Rng1) - WF.Rank_Avg(Rng2.Cells(r, 1), Rng2)) ^ 2
    Next r
    SpearmanAvg = 1 - ((6 * WF.Sum(dSquared)) / ((Rng1.Rows.Count ^ 3) - Rng1.Rows.Count))
End Function

Function SpearmanEq(Rng1 As Range, Rng2 As Range) As Double
    Dim WF As WorksheetFunction
    Dim dSquared() As Long
    Dim r As Long
    Set WF = WorksheetFunction
    ReDim Preserve dSquared(1 To Rng1.Rows.Count)
    For r = LBound(dSquared) To UBound(dSquared)
       dSquared(r) = (WF.Rank_Eq(Rng1.Cells(r, 1), Rng1) - WF.Rank_Eq(Rng2.Cells(r, 1), Rng2)) ^ 2
    Next r
    SpearmanEq = 1 - ((6 * WF.Sum(dSquared)) / ((Rng1.Rows.Count ^ 3) - Rng1.Rows.Count))
End Function
版权声明:我极少创造新知识,大部分情况下是个知识的二道贩子

统计相关系数(2)——Spearman Rank(斯皮尔曼等级)相关系数

1、简介 在统计学中,斯皮尔曼等级相关系数以Charles Spearman命名,并经常用希腊字母ρ(rho)表示其值。斯皮尔曼等级相关系数用来估计两个变量X、Y之间的相关性,其中变量间的相关性可以...
  • shuangyufrank
  • shuangyufrank
  • 2014年12月17日 10:58
  • 2222

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

统计相关系数简介     由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数。   相关系数:考察两个事物(在数据里我们称之为变量)之间的相关程度。   如果有两...
  • zhaozhn5
  • zhaozhn5
  • 2017年10月30日 13:48
  • 397

Spearman Rank相关系数计算

spearman相关系数秩相关系数,秩相关系数还有其他类型,比如kendal秩相关系数 -使用Pearson线性相关系数有2个局限: * 1.必须假设数据是成对地从正态分布中取得的。* * 2...
  • BabyBirdToFly
  • BabyBirdToFly
  • 2017年05月05日 12:04
  • 947

Spearman秩相关系数和Pearson皮尔森相关系数

1、Pearson皮尔森相关系数皮尔森相关系数也叫皮尔森积差相关系数,用来反映两个变量之间相似程度的统计量。或者说用来表示两个向量的相似度。皮尔森相关系数计算公式如下:  分子是协方差,分母两个向量的...
  • u011089523
  • u011089523
  • 2016年11月03日 17:09
  • 1009

相关性检验--Spearman秩相关系数和皮尔森相关系数

本文给出两种相关系数,系数越大说明越相关。你可能会参考另一篇博客独立性检验。 皮尔森相关系数 皮尔森相关系数(Pearson correlation coefficient)也叫皮尔森积差相关系数...
  • promise_LOVE
  • promise_LOVE
  • 2015年06月08日 11:06
  • 3116

几个相关系数:Pearson、Spearman、pointbiserialr、kendalltau

http://baike.baidu.com/link?url=rkocJKJhSEL0UO-iCqg8n76fhNKotOlC4zj3yGbPgahDRZa2AqNv_7FxUOlk0Cb8Y9wl...
  • mmc2015
  • mmc2015
  • 2016年07月18日 15:36
  • 3576

[秩相关] Spearman秩相关系数计算及假设检验

首先说明秩相关系数还有其他类型,比如kendal秩相关系数。 使用Pearson线性相关系数有2个局限: 必须假设数据是成对地从正态分布中取得的。数据至少在逻辑范围内是等距的。 对于更一般的...
  • zhaozhn5
  • zhaozhn5
  • 2017年10月30日 09:59
  • 239

SPSS——相关分析——Spearman秩相关系数

简介斯皮尔曼等级相关(Spearman’s correlation coefficient for ranked data)主要用于解决称名数据和顺序数据相关的问题。适用于两列变量,而且具有等级变量性...
  • liuyuan_jq
  • liuyuan_jq
  • 2016年09月14日 23:02
  • 13400

斯皮尔曼等级相关性-Spearman Rank Correlation

在机器学习中,当要比较不同的机器学习算法在同一个学习任务上d
  • lhkaikai
  • lhkaikai
  • 2014年07月06日 18:11
  • 2737

【matlab】matlab相关系数计算公式(Pearson和Spearman,以及Kendall Rank)

原文地址:http://blog.sina.com.cn/s/blog_4a0824490100ync4.html Pearson相关系数用来衡量两个数据集合是否在一条线上面。其计算公式...
  • renxingzhadan
  • renxingzhadan
  • 2017年04月15日 16:48
  • 1293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算Spearman等级相关系数的VBA函数
举报原因:
原因补充:

(最多只允许输入30个字)