文章目录
1. 肯德尔(Kendall)相关系数定义
肯德尔(Kendall)相关系数,又称肯德尔秩相关系数,它是一种秩相关系数。Kendall秩相关系数可以通过比较数据对之间的排序关系来计算。假设有两个变量 X X X 和 Y Y Y,每个变量都有 n n n 个观测值。对这些观测值进行排序,Kendall秩相关系数的计算基于每一对观测值之间的“协同”或“不协同”关系。
2. 什么是秩相关系数
秩相关系数(Coefficient of Rank Correlation),又称等级相关系数,是将两要素的样本值按数据的大小顺序排列位次,以各要素样本值的位次代替实际数据而求得的一种统计量。它是反映等级相关程度的统计分析指标,常用的等级相关分析方法有Spearman相关系数和Kendall秩相关系数等。
3. 计算方法
Kendall秩相关系数可以通过比较数据对之间的排序关系来计算。假设有两个变量 X X X 和 Y Y Y ,每个变量有 n n n 个观测值,对这些观测值的排序中,Kendall秩相关系数的计算基于每一对观测值之间的“协同”或“不协同”关系。
1. 数据对的比较: 对于每对观测值 ( X i , Y i ) (X_i, Y_i) (Xi,Yi) 和 ( X j , Y j ) (X_j, Y_j) (Xj,Yj) :
- 如果
X
i
>
X
j
X_i > X_j
Xi>Xj 且
Y
i
>
Y
j
Y_i > Y_j
Yi>Yj ,则该对被称为
一致对
- 如果
X
i
<
X
j
X_i < X_j
Xi<Xj 且
Y
i
<
Y
j
Y_i < Y_j
Yi<Yj ,则该对被称为
一致对
- 如果
X
i
>
X
j
X_i > X_j
Xi>Xj 且
Y
i
<
Y
j
Y_i < Y_j
Yi<Yj ,则该对被称为
不一致对
- 如果
X
i
<
X
j
X_i < X_j
Xi<Xj 且
Y
i
>
Y
j
Y_i > Y_j
Yi>Yj ,则该对被称为
不一致对
- 如果
X
i
=
X
j
X_i = X_j
Xi=Xj 且
Y
i
=
Y
j
Y_i =Y_j
Yi=Yj,则该对被称为
完全平局对
- 如果
X
i
=
X
j
X_i = X_j
Xi=Xj 且
Y
i
≠
Y
j
Y_i \neq Y_j
Yi=Yj,则该对被称为
仅在x中的平局对
- 如果
X
i
≠
X
j
X_i \neq X_j
Xi=Xj 且
Y
i
=
Y
j
Y_i = Y_j
Yi=Yj,则该对被称为
仅在y中的平局对
2.计算公式:
τ
=
C
−
D
n
(
n
−
1
)
2
\tau = \frac {C-D}{\frac {n(n-1)} {2}}
τ=2n(n−1)C−D
其中:
- C C C 是一致对的数量
- D D D 是不一致对的数量
- n n n 是观测值的数量
- τ \tau τ 的取值范围为 [ − 1 , 1 ] [-1,1] [−1,1]
解释:
- 当 τ = 1 \tau =1 τ=1 时,表示完全正相关,意味着所有的观测对都是一致对。即在一对观测值 ( X i , Y i ) (X_i, Y_i) (Xi,Yi) 和 ( X j , Y j ) (X_j, Y_j) (Xj,Yj) 中,如果 X i > X j X_i > X_j Xi>Xj ,那么 Y i > Y j Y_i > Y_j Yi>Yj 始终成立,或者如果 X i < X j X_i < X_j Xi<Xj 那么 Y i < Y j Y_i < Y_j Yi<Yj 也始终成立
- 当 τ = − 1 \tau =-1 τ=−1 时,表示完全负相关,意味着所有的观测对都是不一致对。即在一对观测值 ( X i , Y i ) (X_i, Y_i) (Xi,Yi) 和 ( X j , Y j ) (X_j, Y_j) (Xj,Yj) 中,如果 X i > X j X_i > X_j Xi>Xj ,那么 Y i < Y j Y_i < Y_j Yi<Yj 必然成立,或者如果 X i < X j X_i < X_j Xi<Xj 那么 Y i > Y j Y_i > Y_j Yi>Yj 也必然成立
- 当 τ = 0 \tau =0 τ=0 时,表示没有相关性,意味着一致对和不一致对的数量相等,或者两者的关系没有显著的一致性。换句话说,两个变量之间没有线性相关性或排序上的一致性
- 当 τ \tau τ 接近 +1 或者 -1 时,表示两个变量之间的排序一致性非常强。 τ \tau τ 接近 +1 时,表示正相关较强, τ \tau τ 接近 -1 时,表示负相关较强
- 当 τ \tau τ 的值介于0与 ±1 之间时,表示两个变量之间有一定程度的相关性,但不完全。数值越接近0,相关性越弱,接近±1时,相关性越强
4. 示例及代码实现
4.1 示例
假设我们现在有两个变量:
- X = [ 1 , 2 , 3 , 4 ] X=[1,2,3,4] X=[1,2,3,4]
- Y = [ 2 , 3 , 1 , 4 ] Y=[2,3,1,4] Y=[2,3,1,4]
比较每一对观测值的关系:
- ( X 1 , X 2 ) (X_1, X_2) (X1,X2) 和 ( Y 1 , Y 2 ) (Y_1, Y_2) (Y1,Y2) 一致对
- ( X 1 , X 3 ) (X_1, X_3) (X1,X3) 和 ( Y 1 , Y 3 ) (Y_1, Y_3) (Y1,Y3) 不一致对
- ( X 1 , X 4 ) (X_1, X_4) (X1,X4) 和 ( Y 1 , Y 4 ) (Y_1, Y_4) (Y1,Y4) 一致对
- ( X 2 , X 3 ) (X_2, X_3) (X2,X3) 和 ( Y 2 , Y 3 ) (Y_2, Y_3) (Y2,Y3) 不一致对
- ( X 2 , X 4 ) (X_2, X_4) (X2,X4) 和 ( Y 2 , Y 4 ) (Y_2, Y_4) (Y2,Y4) 一致对
- ( X 3 , X 4 ) (X_3, X_4) (X3,X4) 和 ( Y 3 , Y 4 ) (Y_3, Y_4) (Y3,Y4) 一致对
因此:
- 一致对数量 C = 4 C=4 C=4
- 不一致对数量 D = 2 D=2 D=2
代如公式计算得:
τ
=
C
−
D
n
(
n
−
1
)
2
=
4
−
2
0.5
∗
4
∗
(
4
−
1
)
=
1
3
=
0.333.....
\tau = \frac {C-D}{\frac {n(n-1)} {2}} = \frac {4-2}{0.5 * 4 *(4-1)} = \frac {1} {3} = 0.333.....
τ=2n(n−1)C−D=0.5∗4∗(4−1)4−2=31=0.333.....
4.2 python代码实现
在python中通过调用scipy库实现肯德尔(Kendall)相关系数计算:
import numpy as np
from scipy.stats import kendalltau
X=[1,2,3,4]
Y=[2,3,1,4]
r, p_value = kendalltau(X,Y)
print(r)
print(p_value)
5. 优缺点
优点:
- 不受异常值影响:Kendall秩相关系数是基于排序的,通常比皮尔逊相关系数更不容易受到异常值(outliers)的影响
- 适用于非线性关系:Kendall秩相关系数可以有效处理非线性关系,而不仅限于线性关系。它能更好地反映变量间的顺序一致性
缺点:
- 计算复杂度高:Kendall秩相关系数需要计算每对观测值的关系,计算量较大,尤其在样本量较大时,计算时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
6. 适用范围
- 非线性关系分析:当两个变量之间存在非线性关系时,Kendall秩相关系数能够较好地反映其相关性
- 小样本数据:Kendall秩相关系数比皮尔逊相关系数对小样本数据更加稳定,尤其在数据分布不满足正态假设时,Kendall方法更具优势
- 异常值影响较大时:Kendall秩相关系数基于排序,不受极端值的影响,适合处理存在异常值的情况
7. 与斯皮尔曼相关系数比较
相同点:
都是秩相关系数:
Kendall秩相关系数和斯皮尔曼秩相关系数都属于秩相关系数,旨在衡量两个变量之间的相关性。它们通过对数据进行排序,并基于排序结果来评估变量之间的相关程度。不依赖数据分布:
与皮尔逊相关系数(Pearson correlation coefficient)不同,Kendall和斯皮尔曼系数不依赖于数据的正态分布,因此可以应用于非正态分布的数据或具有非线性关系的数据。适用于非线性关系:
Kendall和斯皮尔曼秩相关系数都可以有效处理非线性关系,因为它们主要考虑的是数据的排序,而非具体数值之间的差异。适应异常值:
这两种方法都不容易受到数据中的异常值影响,因为它们是基于排序计算的,而非依赖原始数据点的大小,因此比皮尔逊相关系数更为稳健。
不同点:
计算复杂度
: 肯德尔(Kendall)相关系数的计算更为复杂适用场景的差异
:对于小样本数据,Kendall的 τ \tau τ 比斯皮尔曼的 ρ \rho ρ 更稳定。因为Kendall秩相关系数考虑了每一对数据之间的秩比较,能够更细致地反映变量之间的关系。斯皮尔曼相关系数更适合样本量较大的数据集,并且计算上更为简便。因此在样本量较大时,斯皮尔曼相关系数通常是一个较为常用的选择。
8. 思考
8.1 当变量中有重复值时肯德尔(Kendall)相关系数是如何计算的?
我们先来看一个示例:
import numpy as np
from scipy.stats import kendalltau
X=[1,2,3]
Y=[2,3,3]
rho, p_value = kendalltau(X,Y)
print(rho)
print(p_value)
代码输出:
0.816496580927726
0.22067136191984693
即肯德尔(Kendall)相关系数为 :0.816496580927726,与我们通过上述公式计算出来的结果(0.666…)不一致,这是为什么呢?
通过研究 kendalltau 源码
我们发现,肯德尔(Kendall)相关系数有两种计算形式
T
a
u
_
b
Tau\_b
Tau_b 与
T
a
u
_
c
Tau\_c
Tau_c,默认使用
T
a
u
_
b
Tau\_b
Tau_b :
τ b = P − Q ( P + Q + T ) ∗ ( P + Q + U ) \tau_b = \frac {P-Q} {\sqrt {(P+Q+T) * (P+Q+U)}} τb=(P+Q+T)∗(P+Q+U)P−Q
- P P P 是一致对的数量
- Q Q Q 是不一致对的数量
- T T T 是仅在 x x x 中存在的平局对数量
- U U U 是仅在 y y y 中存在的平局对数量
如果在 x 和 y 中同一对数据存在平局(即两个值相同),则该平局不计入 T T T 或 U U U
τ c = 2 ( P − Q ) n 2 ( m − 1 ) m \tau_c = \frac {2(P-Q)} {n^2\frac {(m-1)}{m}} τc=n2m(m−1)2(P−Q)
- n 是样本的总数
- m 是 x 或 y 中唯一值的数量(取较小者)