目录
3. 基于Spearman的城市PM2.5和风速的相关性分析
1. 摘要
使用Spearman相关性分析方法,对北京市某年某月的部分日期的PM2.5的浓度与风速之间的数据相关性进行分析。研究结果表明,风速与PM2.5的浓度成负相关,风速越大,污染浓度越小,但并非完全的线性关系,也验证了Spearman 方法使用的合理性。
2. 基本原理
2.1. Spearman 秩相关系数
斯皮尔曼秩相关系数(The Spearman’s rank coefficient of correlation),简称斯皮尔曼相关系数,是秩相关(rank correlation)的一种非参数度量(nonparametric measure)。
斯皮尔曼相关可以看作是皮尔逊相关的非参数版本。皮尔逊相关是关于两个随机变量之间的线性关系强度的统计度量,而斯皮尔曼相关考察的是两者单调关系的强度,通俗地说就是两者在变大或变小的趋势上多大程度上保持步调一致,哪怕没有保持比例关系。计算皮尔逊相关系数时使用的是数据样本值本身,而计算斯皮尔曼相关系数使用的是数据样本排位位次值(有时候数据本身就是位次值,有时候数据本身不是位次值,则在计算斯皮尔曼相关系数之前要先计算位次值)。
这里"非参数"有两层含义。首先,当X和Y的关系是由任意单调函数描述的,则它们是完全皮尔逊相关的。与此相应的,皮尔逊相关系数只能给出由线性方程描述的X和Y的相关性。其次,斯皮尔曼不需要先验知识(也就是说,除了数据本身不需要知道其它参数,比如说关于数据的分布的先验信息)便可以准确获取X和Y的采样概率分布之间的相关性。
因此其适用性比皮尔逊相关系数要广泛,应用场景如下:
如果数据展现的是非线性关系,或者不是正态分布的。
如果至少有一方数据是序数类型而非数值类型。
如果数据中有明显的异常值。与皮尔逊相关不同,斯皮尔曼相关对于异常值不太敏感,因为它基于排序位次进行计算,实际数值之间的差异大小对于计算结果没有直接影响。
2.2. 计算方法
Spearman秩相关系数计算公式如下:
其中:和分别是x和y的位次;和分别表示平均位次;
常使用以下简化公式:
3. 基于Spearman的城市PM2.5和风速的相关性分析
选取22天的风速和PM2.5的小时级数据,每天24小时;数据分布如下所示:
图 3.1 风速和PM2.5浓度数据分布
依据式计算,得Spearman 相关系数为-0.5369,结合图 3.1可得PM2.5的浓度与风速成反比,且非线性相关。
参考文献
[1] 斯皮尔曼相关(Spearman correlation)系数概述及其计算例_斯皮尔曼秩相关系数_笨牛慢耕的博客-CSDN博客. Blog.
【精选】斯皮尔曼相关(Spearman correlation)系数概述及其计算例_斯皮尔曼相关系数-CSDN博客
代码附录
本案例的Matlab代码如下:
clc
clear
close all
%% 数据的相关性分析Spearman相关系数
Load(‘LWS.mat’);
Load(‘PM2_5.mat’);
u=[LWS, PM2_5];
figure
scatterhist(u(:,1),u(:,2));
xlabel('累计风速(m/s)');
ylabel('PM2.5浓度(μg/m³)');
copula_corr=mySpearman(u(:,1),u(:,2));
%%
function coeff = mySpearman(X , Y)
% 本函数用于实现斯皮尔曼等级相关系数的计算操作
%
% 输入:
% X:输入的数值序列
% Y:输入的数值序列
%
% 输出:
% coeff:两个输入数值序列X,Y的相关系数
if length(X) ~= length(Y)
error('两个数值数列的维数不相等');
return;
end
N = length(X); %得到序列的长度
Xrank = zeros(1 , N); %存储X中各元素的排行
Yrank = zeros(1 , N); %存储Y中各元素的排行
%计算Xrank中的各个值
for i = 1 : N
cont1 = 1; %记录大于特定元素的元素个数
cont2 = -1; %记录与特定元素相同的元素个数
for j = 1 : N
if X(i) < X(j)
cont1 = cont1 + 1;
elseif X(i) == X(j)
cont2 = cont2 + 1;
end
end
Xrank(i) = cont1 + mean([0 : cont2]);
end
%计算Yrank中的各个值
for i = 1 : N
cont1 = 1; %记录大于特定元素的元素个数
cont2 = -1; %记录与特定元素相同的元素个数
for j = 1 : N
if Y(i) < Y(j)
cont1 = cont1 + 1;
elseif Y(i) == Y(j)
cont2 = cont2 + 1;
end
end
Yrank(i) = cont1 + mean([0 : cont2]);
end
%利用差分等级(或排行)序列计算Spearman等级相关系数
fenzi = 6 * sum((Xrank - Yrank).^2);
fenmu = N * (N^2 - 1);
coeff = 1 - fenzi / fenmu;
end