备战数学建模16-相关性分析SPSS&MATLAB
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了备战数学建模16-相关性分析SPSS&MATLAB相关的知识,希望对你有一定的参考价值。
目录
一、变量类型与相关性分析
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的主要内容,如果未能解决你的问题,请参考以下文章
备战数学建模43-决策树&随机森林&Logistic模型(攻坚站7)