【R语言数据分析】相关性分析:pearson与spearman

发布于:2024-05-07 ⋅ 阅读:(55) ⋅ 点赞:(0)

相关性分析是探寻两个变量之间关联关系的分析方法,注意相关性分析仅仅针对连续型变量和有序分类变量,对于无需分类变量就不存在相关性分析了,而是通过差异分析来间接反映相关性。比如性别和身高的关系就无法做相关性分析,虽然我们都知道身高和性别有关,但是这种关联性是通过差异性来间接体现的。比如我想研究是不是吃的越多长得越胖,这就可以做相关性分析了,因为这里的自变量也就是吃饭的多少是一个连续型变量。再比如我又想探寻是不是学历越高,工资越高,这也可以做相关性分析,因为这里的自变量学历是一个有序分类变量。发现没,一般可以做相关性分析的,都可以用越...就越....来描述我们想要研究的问题。

对于两个连续变量的相关性分析使用的是pearson线性相关性分析,比如探究身高和体重的关系。

对于一个连续变量和一个有序分类变量的相关性分析使用的是spearman秩相关性分析,比如探究工资和学历之间的关系。

对于两个有序分类变量之间的相关性分析也是使用spearman秩相关性分析,比如探究学历和考级等级的关系。

对于一个连续变量和一个无序分类变量之间就是做差异性分析了,比如身高和性别之间的关系,对于一个有序和一个无序分类变量变量之间也是做差异性分析,比如不同剂量组的药物与是否治愈的关系。

两个无序分类变量直接交叉卡方检验做差异性分析。比如两个班级的及格率。

举个例子,这里有一份调查问卷,问卷题目涉及到多个维度,我要研究这几个维度之间是否相关。

问卷的结果是以这样的表格形式给出的

首先把这份数据导入R中并进行一些数据的预处理。比如把表格中代表学历和能力考核的阿拉伯数字转成可读性更好的标签,使用的函数式factor,其中参数ordered=T表示这是一个分类变量,这个参数一般来说给不给都行。然后是计算每个人每一类问题的平均得分,并以这个得分构建新的一列,比如代表能力考核这一类的问题是前六个题,对应表格的第4到9列,我们要求每一个人这一类问题的平均得分,可以可以使用apply函数,apply(mydata[,4:9],1,mean)表示按行对这几列的数据求平均值,一次处理一行。最后使用round对这个平均值的结果保留两位小数。

接下来来查看一下不同类别之间的相关性,相关性分析,首先就来求一下两个变量之间的相关系数,比如求组织领导和护理认同这两个变量之间的相关系数,在R语言中求相关系数使用的函数是cor函数,函数使用的一般语法就是cor(变量1,变量2),比如运行cor(mydata$组织领导, mydata$护理认同)就得到了二者的相关系数为-0.3011634,表示这两个变量是负相关的,知道了相关系数之后我们还需要看一下这个相关性是否显著,注意相关系数的大小和显著性是两个不同的概念,并不是说相关性越大显著性就越高,相关性衡量的是两个变量之间线性关系的强度和方向,即使相关系数的值很大,如果样本量很小,那么这个相关性可能并不显著。相反,如果样本量很大,即使相关系数很小,相关性也可能显著。因此,在进行相关性分析时,需要同时考虑相关系数的大小和显著性(P值)。只有两个变量之间的关系显著,分析相关系数才有意义。查看两个变量之间的关系是否显著使用的函数是cor.test,运行代码cor.test(mydata$组织领导,mydata$护理认同)结果如图

发现p值小于0.05,可以得出结论二者之间关系显著。

这两个变量是我们求得不同学生对于这两种类别的问题的一个平均分,理论上是可以取到某个区间内所有的值的,因此这两个变量都是连续型变量,前面我们说过分析这样两个连续型变量应该使用pearson分析,那么我们直接调用cor函数把两个变量扔进去是不是做的pearson分析呢?答案是是的,cor函数的原型如下

其中method参数是可以省略的,省略的话默认是执行pearson分析,如果要执行另外两种分析就不能省略了。

cor函数是可以直接处理多个变量的,比如运行代码

res1

cor(mydata[,53:60])的意思是计算53列与其他列的相关系数(包括他自己的,与自己的相关系数是1),得到了8个结果,然后计算54列与其他列的相关系数,又得到了8个结果,最后得到了这样的一个矩阵。但是计算显著性就没法这样了,如果写cor.test(mydata[,53:60])会直接报错,显著性的计算只能一个个的写,比如cor.test(mydata[,53],mydata[,54]),这样的话这表有一个问题就是只展示了相关系数而没有展示显著性,因此该表的参考价值不大。既然cor.test无法批量应用,那么只能想一种别的方法了,既然表不好表达,那么我们直接用图可视化。使用的函数是corrgram程序包中的corrgram函数,使用方法也很简单,直接把不同变量扔给corrgram函数即可,运行代码corrgram(mydata[,53:60])就得到了这样一张图

图中根据颜色代表是正相关还是负相关,根据颜色的深浅来代表相关系数绝对值的大小,我们发现这个图是上三角和下三角对称的,这是因为比如组织领导和常规工作之间的相关系数和常规工作与组织领导之间的相关系数是一回事,就好比说你和我一起吃饭还是我和你一起吃饭,都是同一回事。这样为了方便的看到相关系数的大小我们可以把上三角或者下三角其中一个部分换成相关系数的数值,这个操作可以通过在corrgram函数中添加参数upper.panel = panel.conf完成,因为通过help查看corrgram的参数我们发现upper.panel需要的是一个函数

Function used to plot the contents of each panel.

而panel.conf就是一个函数,用于显示每个相关系数的显著性水平,比如是否小于0.05,表示统计显著性,如图,显著性是以置信区间的形式展示的。只要置信区间中不包含0,那么两个变量的相关性就是显著的。

spearman分析

对于一个有序分类变量和一个连续变量的相关性分析就要用到spearman分析,比如我现在要研究学历和病患处理这类问题的平均得分之间的相关性,学历是有序分类变量,病患处理问题的平均得分是一个连续变量,这就要用到spearman分析,函数还是用cor函数,但是和前面的pearson分析不同的是,参数部分需要我们手动指出method是spearman,但是cor函数只能处理numeric类型的变量的相关性分析,我们刚才为了增加表格可读性已经把学历转换成了因子类型,如图

现在我们要把他再转换成数值型,这就要用到do程序包中的Replace函数,运行下面一系列代码

运行之后再来看看mydata数据框,发现的确学历已经用阿拉伯数字替代了

但是长得像阿拉伯数字就一定是数值型吗?我们使用class(mydata$学历)查看这一列的类型居然是"character",所以还应该使用mydata$学历

数据准备完毕之后就可以调用cor函数和cor.test函数来计算相关系数和P值了

结果为

P值0.7204大于0.05,二者的相关性没有研究价值,差异可能由有偶然性引起的。