X和Y为两组数据,其斯皮尔曼(等级)相关系数:
r s = 1 − 6 ∑ i = 1 n d i 2 n ( n 2 − 1 ) r_s=1-\frac{6\sum\limits_{i=1}^nd_i^2}{n(n^2-1)} rs=1−n(n2−1)6i=1∑ndi2
其中, d i d_i di为 X i X_i Xi和 Y i Y_i Yi之间的等级差。
可以证明: r s r_s rs为于-1和+1之间。
等级:一个数的等级,就是将它所在的一列数按从小到大排序后,这个数所在的位置,也就是排序后等级从小到大为1,2,…,n。当排序时有相同数值时,则将取它们所在的位置的算数平均值。
下面举一个例子:
x | y | x的等级 | y的等级 | 等级差 | 等级差的平方 |
---|---|---|---|---|---|
3 | 5 | 2 | 1 | 1 | 1 |
8 | 10 | 5 | 4.5 | 0.5 | 0.25 |
4 | 8 | 3 | 3 | 0 | 0 |
7 | 10 | 4 | 4.5 | -0.5 | 0.25 |
2 | 6 | 1 | 2 | -1 | 1 |
根据公式可以计算出斯皮尔曼相关系数为0.875。
注:斯皮尔曼相关系数>0为正相关;斯皮尔曼相关系数<0为负相关。越接近1和-1相关性越强。斯皮尔曼相关系数为零表明当X增加时Y没有任何趋向性。
斯皮尔曼相关系数还有另一种定义方式:斯皮尔曼相关系数被定义成等级变量之间的皮尔逊相关系数。如果数据中没有重复值,计算和上一种定义方式相同。如果有重复值,可能会有一定的偏差。
两种用法:
corr(X,Y,'type','Spearman')
%这里的X和Y必须是列向量
corr(X,'type','Spearman')
%计算x矩阵各列之间的斯皮尔曼相关系数
下面我们对上面表格中的例子使用MATLAB进行计算:
%% 斯皮尔曼相关系数
X = [3 8 4 7 2]' % 一定要是列向量哦,一撇'表示求转置
Y = [5 10 9 10 6]'
% 第一种计算方法
1-6*(1+0.25+0.25+1)/5/24
% 第二种计算方法
coeff = corr(X , Y , 'type' , 'Spearman')
% 等价于:
RX = [2 5 3 4 1]
RY = [1 4.5 3 4.5 2]
R = corrcoef(RX,RY)
%这里的等价就是斯皮尔曼相关系数被定义成等级变量之间的皮尔逊相关系数。
% 计算矩阵各列的斯皮尔曼相关系数
R = corr(Test, 'type' , 'Spearman')
斯皮尔曼相关系数的假设检验分为大样本和小样本的情况。
H 0 : r s = 0 , H 1 : r s ≠ 0 H_0:r_s=0,H_1:r_s\neq0 H0:rs=0,H1:rs=0
小样本情况,即n<30时,直接查临界值表即可。
注:样本相关系数r必须大于表中的临界值,才能得出显著的结论。
大样本情况下,构造统计量: r s n − 1 服 从 标 准 正 态 N ( 0 , 1 ) r_s\sqrt{n-1}服从标准正态N(0,1) rsn−1服从标准正态N(0,1)
H 0 : r s = 0 , H 1 : r s ≠ 0 H_0:r_s=0,H_1:r_s\neq0 H0:rs=0,H1:rs=0
我们计算检验值 r s n − 1 r_s\sqrt{n-1} rsn−1,并求出对应的p值与0.05相比即可。
disp((1-normcdf(r_s*sqrt(n-1)))*2)
%normcdf是对标准正态分布进行积分
%双侧检验时p值需要乘以2
matlab中也给出了对应的函数,可以直接输出斯皮尔曼相关系数和p值:
% 直接给出相关系数和p值
[R,P]=corr(Test, 'type' , 'Spearman')
%R为斯皮尔曼相关系数
%P为对应的p值
使用spss标记显著性水平:分析——相关——双变量
勾选皮尔逊、斯皮尔曼。根据问题选择双尾或单尾。勾选标记显著性水平。
1.连续数据,正态分布,线性关系,用皮尔逊相关系数最为恰当,当然斯皮尔曼相关系数也可以,就是效率没有皮尔逊相关系数高。
2.上述任一条件不满足,就用斯皮尔曼相关系数,不能使用皮尔逊相关系数。
3两个定序数据之间也用斯皮尔曼相关系数,不能使用皮尔逊相关系数。
定序数据是指仅仅反应观测对象等级、顺序关系的数据,是由定序尺度计量形成的,表现为类别,可以进行排序,属于品质数据。
例如:优、良、差;
我们可以使用1表示差、2表示良、3表示优,但是请注意,用2除以1得出的2并不代表任何含义。定序数据最重要的意义代表了一组数据中的某种逻辑顺序。