备战数学建模16-相关性分析SPSS&MATLAB

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了备战数学建模16-相关性分析SPSS&MATLAB相关的知识,希望对你有一定的参考价值。

目录

一、变量类型与相关性分析

1-变量类型及分析

2-两变量的相关性分析

二、相关性检验实例

1-卡方检验

2-Eta检验

3-Pearson检验

4-Speraman与kendall检验

三、偏相关分析

1-偏相关分析基本概念

2-偏相关分析的案例


一、变量类型与相关性分析

1-变量类型及分析

 

2-两变量的相关性分析

Peaeson系数法需要通过t检验,通过则说明结果不具有偶然性。

 pearson系数法需要是定距或者定比变量。

 

 

二、相关性检验实例

1-卡方检验

对于定类和定类的变量,我们采用卡方检验,具体如下所示:

 我们使用SPSS进行相关性分析,具体步骤如下:

首先导入数据,如下所示:

 点击分析->描述统计->交叉表->统计->勾选卡方检验,检验结果可以发现,显著性0.079,大于0.05,我们认为性别和吸烟存在偶然性,不存在很强的相关性。

我们修改一下数据,尽量让数据一致,也就是尽量让性别和吸烟有关,数据如下:

卡方检验结构如下,很明显,显著性小于0.05,说明抽烟和性别具有很强的相关性。

 

如果题目给出的数据类型是带频数的数据,如下所示,我们看一下:

在spss中点击数据->个案加权->勾选个案加权系数后。

此时再通过分析去作卡方检验就可以了。由下图可知显著性检验的值为0.00,则说明吸烟和性别由明显的相关关系。

2-Eta检验

Eta检验除了不适用于作定距和定距变量的相关性检验,其它的基本都适用。

一般是:行作为自变量,列作为因变量。我们将数据导入SPSS,然后点击分析->描述统计->交叉表->导入变量-> 在统计中勾选相关性即可。

从检验结果中发现,检验值为0.91,大于0.5,说明显著相关。 

3-Pearson检验

Pearson检验可以用于定距和定比变量的相关性检验。

 在SPSS中导入数据,依次点击分析->相关->双变量->勾选皮尔逊,点击确定即可。

得到的检验结果如下所示,相关性的绝对值为0.95,说明销售额和价格极高相关,即相关性显著。

 

 

上述Pearson相关性检验可以使用如下MATLAB函数,具体如下:
 

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结束

在命令行输入如下代码:

 X =  [2.00	46.00
3.00	42.00
4.00	41.00
3.00	43.00
4.00	39.00
5.00	38.00
6.00	33.20
7.50	20.60
3.30	41.30
2.50	51.50
6.80	28.00] ;
x = X(:,1) ;
y = X(:,2) ;
myPearson(x,y) 

得到的检验结果如下,和SPSS检验结果一致。

也可以使用MATLAB编程实现t检验,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
        
    if ttest ~=NaN
        disp('通过t检验!!!') ;
    else
        disp('未通过t检验!!!') ;

end %函数myttest005结束

在命令窗口调用t检验函数,具体如下:

myttest005(x,y) ;

输出结果:

 

4-Speraman与kendall检验

 使用SPSS,分析->相关->勾选斯皮尔曼,确定即可。可以看出结果-0.986,有极高相关性。

当然也可以使用MATLAB编程,进行斯皮尔曼检验,函数如下:

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结束

在命令窗口输入数据,进行斯皮尔曼检验,具体如下:

x = [20 15 40 30 42 60 65 70 53 78; 25 18 60 45 62 88 92 99 75 98];
x = x';
mySpearman(x(:,1),x(:,2))
myttest005(x(:,1),x(:,2));

得到的结果:0.9879,通过t检验!!

三、偏相关分析

1-偏相关分析基本概念

 

 

2-偏相关分析的案例

在spss中导入数据,点击分析->相关->偏相关,将评价的变量和控制的变量导入,点击去确定即可。

检验结果如下所示,从相关性表中可以发现,控制降雨量的情况下,降雨强度和土壤侵蚀量的相关性系数是0.754,如果不控制,则是0.612,说明降雨量的存在,降低了降雨强度和土壤侵蚀量的相关性。

 

当有变革变量的时候,两个变量分析相关性,需要控制其余变量,才能保证相关性检验更准确。

 

以上是关于备战数学建模16-相关性分析SPSS&MATLAB的主要内容,如果未能解决你的问题,请参考以下文章

备战数学建模35-时间序列预测模型

备战数学建模32-相关性分析2

备战数学建模30-回归分析2

备战数学建模43-决策树&随机森林&Logistic模型(攻坚站7)

备战数学建模43-决策树&随机森林&Logistic模型(攻坚站7)

备战数学建模23-数据包络分析