【数学建模】相关系数

第一部分:相关系数简介

  • 总体与样本
    • 总体:指研究对象的全体,比如全国人口普查数据。
    • 样本:从总体中抽取的一部分个体,如通过问卷调查收集的学生数据。
  • 皮尔逊相关系数
    • 总体皮尔逊相关系数:衡量两个变量之间的线性相关性。它是将两个变量标准化后的协方差,消除了量纲的影响。
    • 样本皮尔逊相关系数:与总体相关系数类似,但在计算时分母为(n-1)而不是(n),这是为了更好地估计总体相关系数。
  • 相关性可视化:通过绘制散点图来直观展示两个变量之间的相关性。

第二部分:皮尔逊相关系数的理解误区

  • 理解误区
    • 非线性相关:即使两个变量之间存在强烈的非线性关系,皮尔逊相关系数也可能很小。
    • 离群点的影响:单个离群点可能会导致相关系数的显著变化。
    • 相关性不代表因果关系:即使两个变量高度相关,也不一定存在因果联系。
    • 零相关性:相关系数为0并不意味着变量之间没有任何关系,可能存在着非线性关系。

第三部分:皮尔逊相关系数的假设检验

  • 假设检验:用于判断两个变量之间的相关性是否显著,即是否真的存在线性相关而非偶然出现。
    • 拒绝域:在假设检验中,如果计算出的统计量落入拒绝域,则拒绝原假设。
    • 接受域:如果统计量落在接受域内,则接受原假设。
  • p值判断法:一种更加直观的检验方法,通过比较计算出的p值与预设的显著性水平(如0.05),来判断是否拒绝原假设。

第四部分:计算各列之间的相关系数及p值

  • 相关系数表:显示了不同变量之间的相关性强度。
  • 显著性标记:用来表示相关系数的显著性水平,如***表示p值小于0.01,**表示p值小于0.05等。

第五部分:皮尔逊相关系数假设检验的条件

  • 条件
    • 正态分布:数据应当成对来自于正态分布的总体。
    • 数据差距:数据之间的差距不能太大,以减少异常值的影响。
    • 独立抽样:样本之间应该是独立的。

第六部分:正态分布检验

  • JB检验(大样本):适用于样本量较大的情况,通过比较样本的偏度和峰度与正态分布的偏度和峰度来进行检验。
  • Shapiro-Wilk检验(小样本):适用于较小的样本量(通常为3到50),用于检验数据是否符合正态分布。
  • Q-Q图:通过比较数据点与理论正态分布的分位数,来直观判断数据是否接近正态分布。

第七部分:操作步骤总结

  • Excel中的美化步骤
    • 调整单元格格式为正方形。
    • 设置文本居中对齐。
    • 使用条件格式中的色阶功能来突出相关系数的高低。
    • 编辑条件格式规则以实现更精细的控制。

小结

通过上述内容,我们可以了解到皮尔逊相关系数的计算和应用,以及如何在实际数据分析中使用它来评估变量之间的线性相关性,并进行相应的假设检验。此外,我们还了解到了如何利用统计软件和Excel来处理数据,以及如何通过图形化的方式直观地展示数据和结果。

function [ R , P ]= fun_spearman(X, kind)  
% % 输入值:
    % X: m*n维数据矩阵,每一行表示一个样本,每一列表示一个指标;且 m >=30 以及 n >= 2 
    % kind=1: 单侧检验;kind=2: 双侧检验 (不输入默认为2)
% % 返回值:
    % R: 斯皮尔曼相关系数矩阵(n*n维)
    % P: 对应的p值矩阵(n*n维)
    
    if nargin == 1  % 判断用户输入的参数,如果只输入了一个参数,则默认kind = 2
        kind = 2;
    end

    [m,n] = size(X); % 计算样本个数和指标个数

    if m < 30  % 判断是否样本数太少
        disp('样本个数少于30,请直接查临界值表进行假设检验')

    elseif n <2  % 判断是否指标数太少
        disp('指标个数太少,无法计算')

    elseif kind ~= 1 && kind ~= 2 % 判断kind是否为1或者2
        disp('kind只能取1或者2')

    else  % 如果上述输入均没问题的话就执行下面的操作
        R = ones(n); % 初始化R矩阵
        P = ones(n); % 初始化P矩阵
        for i = 1: n
            for j = (i+1): n   % 这样设置循环只计算主对角线上半部分的值
                r = calculate_r(X(:, i), X(:, j));  % 用子函数 calculate_r 计算i和j两列的相关系数r
                p = calculate_p(r, m, kind); % 用子函数 calculate_p 计算p值
                R(i, j) = r;  R(j, i) = r;  % 把计算出来的相关系数r填充到我们的R矩阵中,注意R矩阵对称
                P(i, j) = p; P(j, i) = p;  % 把计算出来的p值填充到我们的P矩阵中,注意P矩阵对称
            end
        end
    end
    
end

% % 注意:代码文件仅供参考,一定不要直接用于自己的数模论文中
% % 国赛对于论文的查重要求非常严格,代码雷同也算作抄袭
% % 视频中提到的附件可在售后群(购买后收到的那个无忧自动发货的短信中有加入方式)的群文件中下载。包括讲义、代码、我视频中推荐的资料等。
% % 关注我的微信公众号《数学建模学习交流》,后台发送“软件”两个字,可获得常见的建模软件下载方法;发送“数据”两个字,可获得建模数据的获取方法;发送“画图”两个字,可获得数学建模中常见的画图方法。另外,也可以看看公众号的历史文章,里面发布的都是对大家有帮助的技巧。
% % 购买更多优质精选的数学建模资料,可关注我的微信公众号《数学建模学习交流》,在后台发送“买”这个字即可进入店铺(我的微店地址:https://weidian.com/?userid=1372657210)进行购买。
% % 视频价格不贵,但价值很高。单人购买观看只需要58元,三人购买人均仅需46元,视频本身也是下载到本地观看的,所以请大家不要侵犯知识产权,对视频或者资料进行二次销售。
% % 如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231(必看)
function [p]= calculate_p(r, m, kind)
% % 输入值:
    % r:斯皮尔曼相关系数
    % m: 样本个数
    % kind: 1表示单侧检验 2表示双侧检验
% % 返回值:
    % p:计算出来的p值

    z = abs(r) * sqrt(m-1); % 计算检验值  注意这里的相关系数我们先转换为正数再进行计算
    p = (1 - normcdf(z)) * kind; % 计算p值,双侧检验的p值是单侧检验的2倍

end



% % 注意:代码文件仅供参考,一定不要直接用于自己的数模论文中
% % 国赛对于论文的查重要求非常严格,代码雷同也算作抄袭
% % 视频中提到的附件可在售后群(购买后收到的那个无忧自动发货的短信中有加入方式)的群文件中下载。包括讲义、代码、我视频中推荐的资料等。
% % 关注我的微信公众号《数学建模学习交流》,后台发送“软件”两个字,可获得常见的建模软件下载方法;发送“数据”两个字,可获得建模数据的获取方法;发送“画图”两个字,可获得数学建模中常见的画图方法。另外,也可以看看公众号的历史文章,里面发布的都是对大家有帮助的技巧。
% % 购买更多优质精选的数学建模资料,可关注我的微信公众号《数学建模学习交流》,在后台发送“买”这个字即可进入店铺(我的微店地址:https://weidian.com/?userid=1372657210)进行购买。
% % 视频价格不贵,但价值很高。单人购买观看只需要58元,三人购买人均仅需46元,视频本身也是下载到本地观看的,所以请大家不要侵犯知识产权,对视频或者资料进行二次销售。
% % 如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231(必看)
function [r]= calculate_r(X, Y)
% % 输入值:
    % X: 列向量
    % Y: 列向量,且与X同维度
% % 返回值:
    % r: X和Y的斯皮尔曼相关系数(第一种定义方法)
    
    RX = rank_data(X);  % 调用自定义函数 rank_data 来计算X的等级
    RY = rank_data(Y);  % 调用自定义函数 rank_data 来计算Y的等级
    d = RX - RY; % 计算X和Y等级差
    n = size(X,1); % 计算样本个数n
    r = 1 - (6 * sum(d .* d)) / (n * (n^2-1));  % 利用公式计算斯皮尔曼相关系数

end


% % 注意:代码文件仅供参考,一定不要直接用于自己的数模论文中
% % 国赛对于论文的查重要求非常严格,代码雷同也算作抄袭
% % 视频中提到的附件可在售后群(购买后收到的那个无忧自动发货的短信中有加入方式)的群文件中下载。包括讲义、代码、我视频中推荐的资料等。
% % 关注我的微信公众号《数学建模学习交流》,后台发送“软件”两个字,可获得常见的建模软件下载方法;发送“数据”两个字,可获得建模数据的获取方法;发送“画图”两个字,可获得数学建模中常见的画图方法。另外,也可以看看公众号的历史文章,里面发布的都是对大家有帮助的技巧。
% % 购买更多优质精选的数学建模资料,可关注我的微信公众号《数学建模学习交流》,在后台发送“买”这个字即可进入店铺(我的微店地址:https://weidian.com/?userid=1372657210)进行购买。
% % 视频价格不贵,但价值很高。单人购买观看只需要58元,三人购买人均仅需46元,视频本身也是下载到本地观看的,所以请大家不要侵犯知识产权,对视频或者资料进行二次销售。
% % 如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231(必看)

这段代码提供了计算斯皮尔曼相关系数及其对应的p值的功能。下面是代码的详细解释和拓展:

主函数 fun_spearman

该函数接收一个数据矩阵 X 和一个可选参数 kind,返回斯皮尔曼相关系数矩阵 R 和对应的p值矩阵 P

参数说明
  • X: m×n 维数据矩阵,每一行表示一个样本,每一列表示一个指标。
  • kind: 检验类型,1表示单侧检验,2表示双侧检验,默认为2。
返回值
  • R: 斯皮尔曼相关系数矩阵(n×n维)。
  • P: 对应的p值矩阵(n×n维)。
函数逻辑
  1. 参数检查:
    • 如果只输入了一个参数,则默认 kind = 2
    • 检查样本个数是否至少为30。
    • 检查指标个数是否至少为2。
    • 检查 kind 是否为1或2。
  1. 初始化输出矩阵:
    • 创建 RP 矩阵,并将其所有元素初始化为1。
  1. 计算相关系数和p值:
    • 遍历所有可能的指标对,计算斯皮尔曼相关系数和p值。
    • 使用 calculate_rcalculate_p 子函数来计算相关系数和p值。
    • 将计算结果填入 RP 矩阵中。

子函数 calculate_r

该函数用于计算斯皮尔曼相关系数。

参数说明
  • X: 列向量。
  • Y: 列向量,与 X 同维度。
返回值
  • r: 斯皮尔曼相关系数。
函数逻辑
  1. 计算等级:
    • 使用 rank_data 函数计算 XY 的等级。
  1. 计算等级差:
    • 计算等级之间的差异 d
  1. 计算相关系数:
    • 使用斯皮尔曼相关系数的定义公式计算相关系数 r

子函数 calculate_p

该函数用于计算p值。

参数说明
  • r: 斯皮尔曼相关系数。
  • m: 样本个数。
  • kind: 检验类型,1表示单侧检验,2表示双侧检验。
返回值
  • p: p值。
函数逻辑
  1. 计算检验值:
    • 计算检验值 z,其中相关系数 r 被转换为正值。
  1. 计算p值:
    • 使用标准正态分布累积分布函数 normcdf 计算单侧p值。
    • 对于双侧检验,将单侧p值乘以2得到最终的p值。

子函数 rank_data

该函数用于计算向量的等级。

参数说明
  • data: 输入向量。
返回值
  • rankedData: 输出等级向量。
函数逻辑
  1. 排序:
    • 对输入向量进行排序。
  1. 计算等级:
    • 计算每个元素的等级。

使用示例

假设我们有一个数据矩阵 X,包含多组观测值。

X = [3 5 6 1; 7 8 2 4; 2 4 8 9; 1 3 9 2];  % 示例数据
[R, P] = fun_spearman(X);
disp(R);  % 显示斯皮尔曼相关系数矩阵
disp(P);  % 显示p值矩阵

注意事项

  • 该代码仅供学习参考,不应用于正式的研究或竞赛提交,以免造成代码雷同。
  • 在实际使用时,需要自行修改代码以避免与他人雷同。
  • 代码中的 rank_data 函数未给出实现细节,这里可以使用MATLAB内置的 rank 函数或其他方法来实现。

扩展说明

  • 如果需要对等级进行平局处理(例如,多个相同数值的等级分配),可以在 rank_data 函数中加入相应的逻辑。
  • 可以添加更多的错误处理逻辑,比如当输入矩阵不是二维时抛出错误。
  • 可以增加更多的输出信息,如在计算过程中打印进度条等,方便用户了解程序运行状态。

在数学建模中,相关系数是一种重要的统计工具,用于衡量两个变量之间的关联程度。相关系数可以帮助我们理解数据集中的变量是如何相互作用的,这对于预测模型的建立和解释是非常有用的。以下是几种常用的相关系数及其在数学建模中的应用说明:

1. 皮尔逊相关系数(Pearson correlation coefficient)

皮尔逊相关系数衡量的是两个变量之间的线性相关性。它的值范围是 ([-1, 1]),其中:

  • 1 表示完全正相关;
  • -1 表示完全负相关;
  • 0 表示没有线性相关性。
计算公式

[ r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})2 \sum (Y_i - \bar{Y})2}} ]
其中,(\bar{X}) 和 (\bar{Y}) 分别是 (X) 和 (Y) 的平均值。

应用场景
  • 用于分析变量间的线性关系。
  • 用于特征选择,帮助识别哪些变量对预测目标变量最有价值。
  • 用于检测模型中的多重共线性问题。

2. 斯皮尔曼等级相关系数(Spearman's rank correlation coefficient)

斯皮尔曼等级相关系数是一种非参数统计方法,用于衡量两个变量之间的单调关系。它适用于数据不是正态分布的情况,或当数据以等级形式给出时。

计算公式

[ r_s = 1 - \frac{6 \sum d_i2}{n(n2-1)} ]
其中,(d_i) 是第 (i) 个观测值中 (X) 和 (Y) 的等级差,(n) 是观测值的数量。

应用场景
  • 用于非正态分布的数据。
  • 用于数据中存在异常值的情况。
  • 用于检测两个变量之间的非线性关系。

3. 肯德尔秩相关系数(Kendall's tau correlation coefficient)

肯德尔秩相关系数也是衡量两个变量之间顺序关系的一种方法,适用于分类变量或等级数据。

计算公式

[ \tau = \frac{(\text{number of concordant pairs}) - (\text{number of discordant pairs})}{\frac{1}{2} n(n-1)} ]
其中,(n) 是观测值的数量。

应用场景
  • 用于评委对选手的评分等场景。
  • 用于医院的尿糖化验报告等场景。

4. 相关系数的假设检验

无论是皮尔逊相关系数还是斯皮尔曼等级相关系数,通常都需要进行假设检验来确定相关系数是否显著。常用的假设检验方法包括t检验和秩和检验。

t检验
  • 用于皮尔逊相关系数的假设检验。
  • 通常情况下,如果p值小于0.05,则认为相关系数显著。
秩和检验
  • 用于斯皮尔曼等级相关系数的假设检验。
  • 同样,如果p值小于0.05,则认为相关系数显著。

实现代码示例

以下是一个简单的MATLAB代码示例,用于计算斯皮尔曼等级相关系数及其对应的p值:

function [ R , P ] = fun_spearman(X, kind)
% 输入值:
% X: m*n维数据矩阵,每一行表示一个样本,每一列表示一个指标;且 m >=30 以及 n >= 2
% kind=1: 单侧检验;kind=2: 双侧检验 (不输入默认为2)

if nargin == 1  % 判断用户输入的参数,如果只输入了一个参数,则默认kind = 2
    kind = 2;
end

[m,n] = size(X); % 计算样本个数和指标个数

if m < 30  % 判断是否样本数太少
    error('样本个数少于30,请直接查临界值表进行假设检验');

elseif n <2  % 判断是否指标数太少
    error('指标个数太少,无法计算');

elseif kind ~= 1 && kind ~= 2 % 判断kind是否为1或者2
    error('kind只能取1或者2');

else  % 如果上述输入均没问题的话就执行下面的操作
    R = ones(n); % 初始化R矩阵
    P = ones(n); % 初始化P矩阵
    for i = 1: n
        for j = (i+1): n   % 这样设置循环只计算主对角线上半部分的值
            r = calculate_r(X(:, i), X(:, j));  % 用子函数 calculate_r 计算i和j两列的相关系数r
            p = calculate_p(r, m, kind); % 用子函数 calculate_p 计算p值
            R(i, j) = r;  R(j, i) = r;  % 把计算出来的相关系数r填充到我们的R矩阵中,注意R矩阵对称
            P(i, j) = p; P(j, i) = p;  % 把计算出来的p值填充到我们的P矩阵中,注意P矩阵对称
        end
    end
end

% 子函数 calculate_r
function [r]= calculate_r(X, Y)
% 输入值:
% X: 列向量
% Y: 列向量,且与X同维度
% 返回值:
% r: X和Y的斯皮尔曼相关系数(第一种定义方法)

RX = rank_data(X);  % 调用自定义函数 rank_data 来计算X的等级
RY = rank_data(Y);  % 调用自定义函数 rank_data 来计算Y的等级
d = RX - RY; % 计算X和Y等级差
n = size(X,1); % 计算样本个数n
r = 1 - (6 * sum(d .* d)) / (n * (n^2-1));  % 利用公式计算斯皮尔曼相关系数

end

% 子函数 calculate_p
function [p]= calculate_p(r, m, kind)
% 输入值:
% r:斯皮尔曼相关系数
% m: 样本个数
% kind: 1表示单侧检验 2表示双侧检验
% 返回值:
% p:计算出来的p值

z = abs(r) * sqrt(m-1); % 计算检验值  注意这里的相关系数我们先转换为正数再进行计算
p = (1 - normcdf(z)) * kind; % 计算p值,双侧检验的p值是单侧检验的2倍

end

% 子函数 rank_data
function rankedData = rank_data(data)
% 计算等级
sortedIndices = sortrows(data);
ranks = (1:size(data,1))';
rankedData = ranks(sortedIndices);
end

使用示例

假设我们有一组数据 X,我们可以这样调用上面定义的函数来计算斯皮尔曼相关系数和p值:

X = [3 5 6 1; 7 8 2 4; 2 4 8 9; 1 3 9 2];  % 示例数据
[R, P] = fun_spearman(X);
disp(R);  % 显示斯皮尔曼相关系数矩阵
disp(P);  % 显示p值矩阵

通过这种方式,你可以轻松地在数学建模项目中应用相关系数分析来探索变量之间的关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时雨h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值