title: 相关系数
date: 2020-01-27 11:42:46
categories: 数学建模
tags: [统计, MATLAB, spss]
mathjax: true
学习视频:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab
老师讲得很详细,很受用!!!
相关系数(皮尔逊相关系数)
(1)如果两个变量本身就是线性的关系,那么皮尔逊相关系数绝对值大的就是相关性强,小的就是相关性弱;
(2)在不确定两个变量是什么关系的情况下,即使算出皮尔逊相关系数,发现很大,也不能说明那两个变量线性相关,甚至不能说他们相关,我们一定要画出散点图(spss很方便)来看才行。
事实上,比起相关系数的大小,我们往往更关注的是显著性。(假设检验)
假设检验
对皮尔逊相关系数进行假设检验
-
第一步:提出原假设H0和备择假设H1
两个假设是截然相反,假设我们计算出了一个皮尔逊相关系数r,我们想检验它是否显著的异于0.那么我们可以这样设定原假设和备择假设:H0:r=0,H1:r≠0
-
第二步:在原假设成立的条件下,利用我们要检验的量构造出一个符合某一分布的统计量
(注1:统计量相当于我们要检验的量的一个函数,里面不能有其他的随机变量)
(注2:这里的分布一般有四种:标准正态分布、t分布、x2分布和F分布)对于皮尔逊相关系数r而言,在满足一定条件下,我们可以构造统计量:
\[t = r\sqrt{(n-2)/(1-r^{2})} \]可以证明t是服从*度为n-2的t分布
-
第三步:将我们要检验的这个值带入这个统计量中,可以得到一个特定的值(检验值)。
假设我们现在计算出来的相关系数为0.5,样本为30,那么我们带入第二步公式可以得到\(t^{*}=3.05505\) -
第四步:由于我们知道统计量的分布情况,因此我们可以画出该分布的概率密度函数pdf,并给定一个置信水平,根据这个置信水平查表找到临界值,并画出检验统计量的接受域和拒绝域。
例如,我们知道上述统计量服从*度为28的t分布,代码x = -4:0.1:4; y = tpdf(x,28); plot(x,y,\'-\') grid on % 在画出的图上加上网格线
常见的置信水平有三个:90%,95%和99%,其中95%是三者中最为常用的。
因为我们这里是双侧检验,所以我们需要找出能覆盖0.95概率的部分t分布表:https://wenku.baidu.com/view/d94dbd116bd97f192279e94a.html查表可知,对应的临界值为2.048,因此我们可以做出接受域和拒绝域。
-
第五步:看我们计算出来的检验值是落在了拒绝域还是接受域,并下结论。因为我们得到的t*=3.05505>2.048,因此我们可以下结论:
在95%的置信水平上,我们拒绝原假设H0:r=0,因此r是显著的不为0的。
p值判断法
我们得到的检验值t*=3.05505,根据这个值,我们可以计算出其对应的那个概率。
disp(\'该检验值对应的p值为: \')
disp((1-tcdf(3.055,28))*2)
%双侧检验的p值要乘以2
- p<0.01,说明在99%的置信水平上拒绝原假设;p值>0.01,说明在99%的置信水平无法拒绝原假设;
- p<0.05,说明在95%的置信水平上拒绝原假设;p>0.05,说明在95%的置信水平上无法拒绝原假设:
- p<0.10,说明在90%的置信水平上拒绝原假设;p>0.10,说明在90%的置信水平上无法拒绝原假设;
小补充: \(0.5、 0.5* 、 0.5**、 0.5***\)的含义是什么?(显著性标记)
- 0.5*:90%的水平上显著异于0,p<0.1
- 0.5**:95%的水平上显著异于0,p<0.05
- 0.5***:99%的水平上显著异于0,p<0.01
%% 计算各列之间的相关系数以及p值
[R,P] = corrcoef(Test)
% 在EXCEL表格中给数据右上角标上显著性符号吧
P < 0.01 % 标记3颗星的位置
(P < 0.05) .* (P > 0.01) % 标记2颗星的位置
(P < 0.1) .* (P > 0.05) % 标记1颗星的位置
皮尔逊相关系数假设检验的条件
第一, 实验数据通常假设是成对的来自于正态分布的总体(需要验证)。 因为我们在求皮尔逊相关性系数以后,通常还会用t检验之类的方法来进行皮尔逊相关性系数检验,而t检验是基于数据呈正态分布的假设的。
第二, 实验数据之间的差距不能太大。 皮尔逊相关性系数受异常值的影响比较
大。
第三:每组样本之间是独立抽样的。 构造t统计量时需要用到。
正态分布JB检验(大样本 n>30)
对于一个随机变量{Xi},假设其偏度为s,峰度为K,那么我们可以构造JB统计量:
可以证明,如果{Xi}是正态分布,那么在大样本情况下JB-x(2)(*度为2的卡方分布)
正态分布的偏度为0,峰度为3
那么进行假设检验的步骤如下:
H0:该随机变量服从正态分布
H1:该随机变量不服从正态分布
然后计算该变量的偏度和峰度,得到检验值JB*,并计算出其对应的p值
将p值与0.05比较,如果小于0.05则可拒绝原假设,否则我们不能拒绝原假设。
MATLAB中进行JB检验的语法: [h,p] = jbtest(x,alpha)
当输出h等于1时,表示拒绝原假设; h等于0则代表不能拒绝原假设。
alpha就是显著性水平,一般取0.05,此时置信水平为1‐0.05=0.95
x就是我们要检验的随机变量,注意这里的x只能是向量。
%% 假设检验部分
x = -4:0.1:4;
y = tpdf(x,28); %求t分布的概率密度值 28是*度
figure(1)
plot(x,y,\'-\')
grid on % 在画出的图上加上网格线
hold on % 保留原来的图,以便继续在上面操作
% matlab可以求出临界值,函数如下
tinv(0.975,28) % 2.0484
% 这个函数是累积密度函数cdf的反函数
plot([-2.048,-2.048],[0,tpdf(-2.048,28)],\'r-\')
plot([2.048,2.048],[0,tpdf(2.048,28)],\'r-\')
%% 计算p值
x = -4:0.1:4;
y = tpdf(x,28);
figure(2)
plot(x,y,\'-\')
grid on
hold on
% 画线段的方法
plot([-3.055,-3.055],[0,tpdf(-3.055,28)],\'r-\')
plot([3.055,3.055],[0,tpdf(3.055,28)],\'r-\')
disp(\'该检验值对应的p值为:\')
disp((1-tcdf(3.055,28))*2) %双侧检验的p值要乘以2
%% 计算各列之间的相关系数以及p值
[R,P] = corrcoef(Test)
% 在EXCEL表格中给数据右上角标上显著性符号吧
P < 0.01 % 标记3颗星的位置
(P < 0.05) .* (P > 0.01) % 标记2颗星的位置
(P < 0.1) .* (P > 0.05) % % 标记1颗星的位置
% 也可以使用Spss操作哦 看我演示
%% 正态分布检验
% 正态分布的偏度和峰度
x = normrnd(2,3,100,1); % 生成100*1的随机向量,每个元素是均值为2,标准差为3的正态分布
skewness(x) %偏度
kurtosis(x) %峰度
qqplot(x)
% 检验第一列数据是否为正态分布
[h,p] = jbtest(Test(:,1),0.05)%只能一组一组检验
[h,p] = jbtest(Test(:,1),0.01)
% 用循环检验所有列的数据
n_c = size(Test,2); % number of column 数据的列数
H = zeros(1,6); % 初始化节省时间和消耗
P = zeros(1,6);
for i = 1:n_c
[h,p] = jbtest(Test(:,i),0.05);
H(i)=h;
P(i)=p;
end
disp(H)
disp(P)
### 小样本3≤n≤50:Shapiro-wilk检验
H0:该随机变量服从正态分布
H1:该随机变量不服从正态分布
计算出威尔克统计量后,得到相应的p值
将p值与0.05比较,如果小于0.05则可拒绝原假设,否则我们不能拒绝原假设。
Q-Q图 (大样本 )
在统计学中, Q‐Q图(Q代表分位数Quantile)是一种通过比较两个概率分布的分位数对这两个概率分布进行比较的概率图方法。
首先选定分位数的对应概率区间集合,在此概率区间上,点(x,y)对应于第一个分布的一个分位数x和第二个分布在和x相同概率区间上相同的分位数。
这里,我们选择正态分布和要检验的随机变量,并对其做出QQ图,可想而知,如果要检验的随机变量是正态分布,那么QQ图就是一条直线。
要利用Q‐Q图鉴别样本数据是否近似于正态分布,只需看Q‐Q图上的点是否近似地在一条直线附近。(要求数据量非常大)
斯皮尔曼spearman相关系数
定义:X和Y为两组数据,其斯皮尔曼(等级)相关系数:
(一个数的等级,就是将它所在的一列数按照从小到大排序后,这个数所在的位置)可以证明:\(r_{s}\)位于-1和1之间。
X | Y | X的等级 | Y的等级 | 等级差 | 等级差的平方 |
---|---|---|---|---|---|
3 | 5 | 2 | 1 | 1 | 1 |
8 | 10 | 5 | 4.5 | 0.5 | 0.25 |
4 | 8 | 3 | 3 | 0 | 0 |
7 | 10 | 4 | 4.5 | ‐0.5 | 0.25 |
2 | 6 | 1 | 2 | ‐1 | 1 |
注:如果有的数值相同,则将它们所在的位置取算术平均
斯皮尔曼相关系数被定义成等级之间的皮尔逊相关系数。
MATLAB中计算
两种用法
(1) corr(X , Y , \'type\' , \'Spearman\')
这里的X和Y必须是列向量哦~
(2) corr(X , \'type\' , \'Spearman\')
这时计算X矩阵各列之间的斯皮尔曼相关系数
%% 斯皮尔曼相关系数
X = [3 8 4 7 2]\' % 一定要是列向量哦,一撇\'表示求转置
Y = [5 10 9 10 6]\'
% 第一种计算方法
1-6*(1+0.25+0.25+1)/5/24
% 第二种计算方法
coeff = corr(X , Y , \'type\' , \'Spearman\')
% 等价于:
RX = [2 5 3 4 1]
RY = [1 4.5 3 4.5 2]
R = corrcoef(RX,RY)
% 计算矩阵各列的斯皮尔曼相关系数
R = corr(Test, \'type\' , \'Spearman\')
% 大样本下的假设检验
% 计算检验值
disp(sqrt(590)*0.0301)
% 计算p值
disp((1-normcdf(0.7311))*2) % normcdf用来计算标准正态分布的累积概率密度函数
% 直接给出相关系数和p值
[R,P]=corr(Test, \'type\' , \'Spearman\')
斯皮尔曼相关系数的假设检验
小样本
小样本情况,即n≤30时,直接查临界值表即可。
样本相关系数r必须大于等于表中的临界值,才能得出显著的结论。
大样本
大样本情况下,统计量\(r_{s}\sqrt{n-1}~N(0,1)\)
我们计算检验值\(r_{s}\sqrt{n-1}\),并求出对应的p值与0.05相比即可。
p值大于0.05,因此我们无法拒绝原假设。(和0没有显著的差异
% 大样本下的假设检验
% 计算检验值
disp(sqrt(590)*0.0301)
% 计算p值
disp((1-normcdf(0.7311))*2) % normcdf用来计算标准正态分布的累积概率密度函数
% 直接给出相关系数和p值
[R,P]=corr(Test, \'type\' , \'Spearman\')
斯皮尔曼相关系数和皮尔逊相关系数选择:
-
连续数据,正态分布,线性关系,用pearson相关系数是最恰当,当然用spearman相关系数也可以, 就是效率没有pearson相关系数高。
-
上述任一条件不满足,就用spearman相关系数,不能用pearson相关系数。
-
两个定序数据之间也用spearman相关系数,不能用pearson相关系数。
定序数据是指仅仅反映观测对象等级、顺序关系的数据,是由定序尺度计量形成的,表现为类别,可以进行排序,属于品质数据。
例如:优、良、差;
我们可以用1表示差、 2表示良、 3表示优,但请注意,用2除以1得出的2并不代表任何含义。定序数据最重要的意义代表了一组数据中的某种逻辑顺序。
注:斯皮尔曼相关系数的适用条件比皮尔逊相关系数要广,只要数据满足单调关系(例如线性函数、指数函数、对数函数等)就能够使用
总代码
clear;clc
load \'physical fitness test.mat\' %文件名如果有空格隔开,那么需要加引号
% https://ww2.mathworks.cn/help/matlab/ref/corrcoef.html
%% 统计描述
MIN = min(Test); % 每一列的最小值
MAX = max(Test); % 每一列的最大值
MEAN = mean(Test); % 每一列的均值
MEDIAN = median(Test); %每一列的中位数
SKEWNESS = skewness(Test); %每一列的偏度
KURTOSIS = kurtosis(Test); %每一列的峰度
STD = std(Test); % 每一列的标准差
RESULT = [MIN;MAX;MEAN;MEDIAN;SKEWNESS;KURTOSIS;STD] %将这些统计量放到一个矩阵中中表示
%% 计算各列之间的相关系数
% 在计算皮尔逊相关系数之前,一定要做出散点图来看两组变量之间是否有线性关系
% 这里使用Spss比较方便: 图形 - 旧对话框 - 散点图/点图 - 矩阵散点图
R = corrcoef(Test) % correlation coefficient
%% 假设检验部分
x = -4:0.1:4;
y = tpdf(x,28); %求t分布的概率密度值 28是*度
figure(1)
plot(x,y,\'-\')
grid on % 在画出的图上加上网格线
hold on % 保留原来的图,以便继续在上面操作
% matlab可以求出临界值,函数如下
tinv(0.975,28) % 2.0484
% 这个函数是累积密度函数cdf的反函数
plot([-2.048,-2.048],[0,tpdf(-2.048,28)],\'r-\')
plot([2.048,2.048],[0,tpdf(2.048,28)],\'r-\')
%% 计算p值
x = -4:0.1:4;
y = tpdf(x,28);
figure(2)
plot(x,y,\'-\')
grid on
hold on
% 画线段的方法
plot([-3.055,-3.055],[0,tpdf(-3.055,28)],\'r-\')
plot([3.055,3.055],[0,tpdf(3.055,28)],\'r-\')
disp(\'该检验值对应的p值为:\')
disp((1-tcdf(3.055,28))*2) %双侧检验的p值要乘以2
%% 计算各列之间的相关系数以及p值
[R,P] = corrcoef(Test)
% 在EXCEL表格中给数据右上角标上显著性符号吧
P < 0.01 % 标记3颗星的位置
(P < 0.05) .* (P > 0.01) % 标记2颗星的位置
(P < 0.1) .* (P > 0.05) % % 标记1颗星的位置
% 也可以使用Spss操作哦 看我演示
%% 正态分布检验
% 正态分布的偏度和峰度
x = normrnd(2,3,100,1); % 生成100*1的随机向量,每个元素是均值为2,标准差为3的正态分布
skewness(x) %偏度
kurtosis(x) %峰度
qqplot(x)
% 检验第一列数据是否为正态分布
[h,p] = jbtest(Test(:,1),0.05)%只能一组一组检验
[h,p] = jbtest(Test(:,1),0.01)
% 用循环检验所有列的数据
n_c = size(Test,2); % number of column 数据的列数
H = zeros(1,6); % 初始化节省时间和消耗
P = zeros(1,6);
for i = 1:n_c
[h,p] = jbtest(Test(:,i),0.05);
H(i)=h;
P(i)=p;
end
disp(H)
disp(P)
% Q-Q图
qqplot(Test(:,1))
%% 斯皮尔曼相关系数
X = [3 8 4 7 2]\' % 一定要是列向量哦,一撇\'表示求转置
Y = [5 10 9 10 6]\'
% 第一种计算方法
1-6*(1+0.25+0.25+1)/5/24
% 第二种计算方法
coeff = corr(X , Y , \'type\' , \'Spearman\')
% 等价于:
RX = [2 5 3 4 1]
RY = [1 4.5 3 4.5 2]
R = corrcoef(RX,RY)
% 计算矩阵各列的斯皮尔曼相关系数
R = corr(Test, \'type\' , \'Spearman\')
% 大样本下的假设检验
% 计算检验值
disp(sqrt(590)*0.0301)
% 计算p值
disp((1-normcdf(0.7311))*2) % normcdf用来计算标准正态分布的累积概率密度函数
% 直接给出相关系数和p值
[R,P]=corr(Test, \'type\' , \'Spearman\')
作业
写一篇文章,分析男生体测数据各指标之间的相关性,并与女生的数据得到的结论进行对比。
要求:要说明选择哪一种相关系数的原因,并要求做出散点图。(可以自己动手试试相关矩阵可视化哦)
确定相关系数
为了度量两个变量间的线性关系,一般采用皮尔逊(Pearson)相关系数或斯皮尔曼(Spearman)相关系数进行分析。其中,只有当数据满足连续且呈线性关系时,才能使用皮尔逊(Pearson)相关系数描述变量间的相关性,且估计数据显著性时候需要数据服从正态分布;相对地,斯皮尔曼(Spearman)相关系数则没有使用条件限制。
因此,在确定使用哪种相关系数之前,应对各指标数据绘制散点图判断是否呈线性关系以及正态分布检验。
绘制散点图
由散点图司知,各指标彼此之间均无线性关系。
正态分布检验
由于本整数据的样本容里;730,属于大样本苷量,应采用JB检始的方式检验备描标款据是否愿从正态分布·我们将通过MATLAB 的 jbtest的数对各指标数据进行正态分布检验。
假设原指标均服从正态分布,在95%的置信水平下,各指标数据的正态分布检验结果如下表所示:
![](https://img2018.cnblogs.com/blog/1880713/202002/1880713-20200220234314812-591975900.png)
由表1可知,经正态分布检验之后,各指标的h值均为1且p值均小于0.05,即拒绝原假设。
经散点图与正态分布检验分析可知,本不能使用皮尔逊(Pearson)相关系数分析.故考虑使用斯皮尔曼(Speaman)相关系数。
斯皮尔曼(Spearman)相关系数
我们将本题数据导入到SPSS中,进行相关性分析,结果如下表所示:
结果分析。
根据SPSS求解结果,可得结论如下:
当显著性水平a=0.01时,身高与肺活量呈正相关,身高与坐位体前屈呈负相关,体重与立定跳远呈正相关。
附录
%% 导入电子表格中的数据
% 用于从以下电子表格导入数据的脚本:
%
% 工作簿: G:\数学建模学习材料\参考资料\清风数学建模\第1-14讲和番外篇的课件和代码(1月16日修订版本)\第1-14讲和番外篇课件和代码\第5讲.相关系数\代码和例题数据\八年级男生体测数据.xls
% 工作表: 八年级数据
%
% 要扩展代码以供其他选定数据或其他电子表格使用,请生成函数来代替脚本。
% 由 MATLAB 自动生成于 2020/02/20 23:38:50
%% 导入数据
[~, ~, raw] = xlsread(\'G:\数学建模学习材料\参考资料\清风数学建模\第1-14讲和番外篇的课件和代码(1月16日修订版本)\第1-14讲和番外篇课件和代码\第5讲.相关系数\代码和例题数据\八年级男生体测数据.xls\',\'八年级数据\',\'A2:F731\');
%% 创建输出变量
data = reshape([raw{:}],size(raw));
%% JB检验
n_c = size(data,2); % number of column 数据的列数
H = zeros(1,6); % 初始化节省时间和消耗
P = zeros(1,6);
for i = 1:n_c
[h,p] = jbtest(data(:,i),0.05);
H(i)=h;
P(i)=p;
end
disp(H)
disp(P)
%% 清除临时变量
clearvars data raw;