数学建模之变量和相关性分析(含matlab代码

一、变量类型

 不同变量之间的使用

 二、相关系数及其检验

(1)Pearson相关系数:

适用于定距、定比类型的变量。是运用最广的一种相关程度统计量。检验用t统计量:其中统计量t服从自由度(n-2)的分布。

 

 使用条件
1、两变量均应由测量得到的连续变量。
2、两变量所来自的总体都应是正态分布,或接近正态的单峰对称分布。
3、变量必须是成对的数据。
4、两变量间为线性关系。

(2)Spearman等级相关系数

 三、偏相关分析


1.偏相关分析的基本概念


在多变量的情况下,变量之间的相关关系是很复杂的。
如:农作物产量与降水量之间的关系中实际还包含温度对产量的影响。商品的需求与价格关系,注意收入水平的影响等等。
偏相关分析是指在对其他变量的影响进行控制的条件下,分析多个变量中某两个变量之间的线性相关程度,计算偏相关系数。

 例如:

 在现实经济生活中,由于收入和价格常常都有不断提高的趋势,如果不考虑收入对需求的影响,仅仅利用需求和价格的时间序列数据去计算简单相关系数,就有可能得出价格越高需求越大的错误结论。

 2、偏相关系数及其检验

 四、代码

1、皮尔逊函数

function coeff = myPearson(X , Y)
% 本函数实现了皮尔逊相关系数的计算操作
% 皮尔逊相关系数计算公式(P18)及无偏相关系数矫正公式(P19)参见《现代气候统计诊断与预测技术》-魏凤英
%
% 输入:
%   X:输入的数值序列
%   Y:输入的数值序列
%
% 输出:
%   coeff:两个输入数值序列X,Y的相关系数
%

if length(X) ~= length(Y)
    error('两个数值数列的维数不相等');
    return;
end

fenzi = sum((X-sum(X)/length(X)).*(Y-sum(Y)/length(Y)));
fenmu = sqrt(sum((X-sum(X)/length(X)).^2))*sqrt(sum((Y-sum(Y)/length(Y)).^2));
coef = fenzi / fenmu;

if length(X)>30
    coeff = coef;
elseif length(X)>4 && length(X)<30
    coeff = coef*(1+(1-coef^2)/(2*(length(X)-4)));      %计算无偏相关系数加以矫正
else
    coeff = coef;
    fprintf('数据长度小于5 %8.4f\n',coeff);
end

end %函数myPearson结束

2、皮尔逊相关系数函数和T检验

function ttest = myttest005(X , Y) 

    if Y <= 2 
        error('计算相关系数的样本量不够');
        return;
    end

    if X == NaN
        ttest = Z;
        return;
    end
    r2 = myPearson(X , Y);%计算pearson系数
    [m,n]=size(Y)
    Z = m-2;%求出自由度
 
    tvalue=abs(r2/(sqrt((1-r2^2)/Z)));
    
    if Z == 1
        tnorm = 12.71;
        if tvalue > tnorm
            ttest = Z;
        else
            ttest = NaN;
        end
    elseif Z == 2
            tnorm = 4.30;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end
    elseif Z == 3
            tnorm = 3.18;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end
    elseif Z == 4
            tnorm = 2.78;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end
    elseif Z == 5
            tnorm = 2.57;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end       
    elseif Z == 6
            tnorm = 2.45;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 7
            tnorm = 2.37;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end
    elseif Z == 8
            tnorm = 2.31;
            if tvalue > tnorm
                ttest = X;
            else
                ttest = NaN;
            end
    elseif Z == 9
            tnorm = 2.26;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end
    elseif Z == 10
            tnorm = 2.23;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 11
            tnorm = 2.20;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end        
    elseif Z == 12
            tnorm = 2.18;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 13
            tnorm = 2.16;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 14
            tnorm = 2.15;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 15
            tnorm = 2.13;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 16
            tnorm = 2.12;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end  
    elseif Z == 17
            tnorm = 2.11;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 18
            tnorm = 2.10;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 19
            tnorm = 2.09;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 20
            tnorm = 2.09;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 21
            tnorm = 2.08;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 22
            tnorm = 2.07;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 23
            tnorm = 2.07;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 24
            tnorm = 2.06;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end
    elseif Z == 25
            tnorm = 2.06;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 26
            tnorm = 2.06;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 27
            tnorm = 2.05;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 28
            tnorm = 2.05;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 29
            tnorm = 2.04;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end            
    elseif Z == 30
            tnorm = 2.04;
            if tvalue > tnorm
                ttest = Z;
            else
                ttest = NaN;
            end                        
    else 
            tnorm = 1.96;
            if tvalue > tnorm
                ttest = X;
            else
                ttest = NaN;
            end                
        end

end %函数myttest005结束

3、Spearman函数

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

%利用差分等级(或排行)序列计算斯皮尔曼等级相关系数
fenzi = 6 * sum((Xrank - Yrank).^2);
fenmu = N * (N^2 - 1);
coeff = 1 - fenzi / fenmu;

end %函数mySpearman结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值