斯皮尔曼相关性检验
时间: 2025-06-20 15:15:07 浏览: 12
### 斯皮尔曼相关性检验的计算方法
斯皮尔曼相关性检验是一种基于秩次的非参数统计方法,用于评估两个变量之间是否存在单调关系。其核心思想是对原始数据进行排序并赋予秩次,再通过这些秩次来计算相关系数。
#### 计算公式
斯皮尔曼相关系数 \( \rho \) 的定义如下:
\[
\rho = 1 - \frac{6 \sum d_i^2}{n(n^2 - 1)}
\]
其中:
- \( n \) 是样本数量;
- \( d_i \) 表示两组数据对应位置上的秩差值。
如果数据中不存在重复值,则可以直接使用上述公式;如果有重复值,则需调整秩次以反映实际顺序。
---
### Python 实现代码
以下是利用 `scipy.stats` 库中的函数实现斯皮尔曼相关性检验的方法:
```python
from scipy.stats import spearmanr
import numpy as np
# 示例数据
np.random.seed(42)
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 6, 7, 8, 9])
# 使用 SciPy 进行斯皮尔曼相关性检验
correlation_coefficient, p_value = spearmanr(x, y)
print(f"斯皮尔曼相关系数: {correlation_coefficient:.4f}") # 输出相关系数
print(f"P 值: {p_value:.4f}") # 输出显著性水平 P 值
```
此代码片段展示了如何快速调用库函数完成斯皮尔曼相关性检验[^1]。对于更复杂的场景,也可以手动计算秩次及其差异平方和。
---
### 手动计算过程
下面是一个不依赖外部库的手动实现版本:
```python
def calculate_spearman_rank_correlation(x, y):
"""
手动计算斯皮尔曼相关系数。
参数:
x (list): 数据集 X
y (list): 数据集 Y
返回:
float: 斯皮尔曼相关系数 rho
"""
from collections import defaultdict
import math
def get_ranks(data):
sorted_data = sorted(data)
ranks = {}
rank = 1
for value in sorted_data:
if value not in ranks:
count = data.count(value)
avg_rank = sum(range(rank, rank + count)) / count
ranks[value] = avg_rank
rank += count
return [ranks[val] for val in data]
# 获取排名
ranks_x = get_ranks(list(x))
ranks_y = get_ranks(list(y))
# 计算差值平方和
diff_squared_sum = sum((rx - ry)**2 for rx, ry in zip(ranks_x, ranks_y))
n = len(x)
# 计算 Spearman 相关系数
rho = 1 - (6 * diff_squared_sum) / (n * (n**2 - 1))
return rho
# 测试数据
x = [1, 2, 3, 4, 5]
y = [5, 6, 7, 8, 9]
spearman_rho = calculate_spearman_rank_correlation(x, y)
print(f"手动计算的斯皮尔曼相关系数: {spearman_rho}")
```
该代码实现了完整的斯皮尔曼相关系数计算逻辑,并考虑了可能存在的平级情况(即相同数值共享平均秩次)[^2]。
---
### MATLAB 实现代码
除了 Python 外,MATLAB 同样支持高效的相关性分析功能。以下是一段简单示例:
```matlab
% 定义输入数据
data = randn(100, 2);
data(:, 2) = sort(data(:, 2)); % 创建单调递增的关系
% 计算斯皮尔曼相关系数矩阵
R_spearman = corr(data, 'Type', 'Spearman');
disp('斯皮尔曼相关系数:');
disp(R_spearman);
% 可视化热力图
figure;
heatmap(R_spearman, 'Colormap', parula, 'ColorbarVisible', 'on');
title('斯皮尔曼相关系数热力图');
xlabel('变量');
ylabel('变量');
```
这段代码生成了一组随机数据并对它们进行了斯皮尔曼相关性分析,最后绘制出了可视化热力图[^3]。
---
阅读全文
相关推荐


















