基于Spearman的城市PM2.5与风速的相关性分析(MATLAB)

目录

1. 摘要

2. 基本原理

2.1. Spearman 秩相关系数

2.2. 计算方法

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秩相关系数计算公式如下:

                                                   

其中:R(x)R(y)分别是x和y的位次;\overline{R(x)}\overline{R(y)}分别表示平均位次;

常使用以下简化公式:

其中:d_i表示第i个数据对的位次值之差;n 为总的观测样本数;

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 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值