7月8日的微信推文中,给大家介绍了相关性分析(戳这里)。本文是这篇文章的下篇,给大家讲讲如何利用R语言做相关性分析。

相关性分析

cor函数的完整语法如下:

cor(x,y = NULL,use =“everything”,method = c(“pearson”,“kendall”,“spearman”))

也就是说相关性计算有三种方法:pearson、kendall和spearman。


1 pearson相关系数

算法如下:

cor相关 r语言 cor()r语言_spearman相关性分析

代数算法比较难理解,但分子我们可以看到是个协方差,只是少了除以n-1,而分母是我们很熟悉的标准差,同样少了除以n-1。可以看出分子分母都少了除以n-1,正好抵消。也就意味相关性系数就是协方差除以标准差。

甚至我们可以写成:

cor相关 r语言 cor()r语言_r语言相关性分析_02

其中cov既是协方差的缩写,也是R中的函数名称。如果想了解这个计公式,我们还要分为三个部分。

1

协方差

可以通俗地理解为:两个变量在变化过程中的变化方向是否一致,以及一致的程度。

如果两个变量,A变大,同时B也变大,说明两个变量是同向变化的,这时协方差就是正的。A变大,同时B变小,说明两个变量是反向变化的,这时协方差就是负的。从数值来看,协方差的数值越大,两个变量同向程度也就越大。反之亦然。

公式:

cor相关 r语言 cor()r语言_spearman相关性分析_03

如果有X,Y两个变量,每个时刻的“X值与其均值之差”乘以“Y值与其均值之差”得到一个乘积,再对这每时刻的乘积进行求和并求出均值。

首先x减去平均值,就意味着我们将平均值作为一个坐标原点。减去平均值,就意味着,所有的x的取值都会根据这个原点,重新调整数值(位置)。这样我们就可以得到Xn(n = 1,2,3,,,)的变化程度。也就是距离原点的距离远近,这是在x变量中的变化程度。

那么同样y变量中也做这样的取值,得到Yn在Y变量中的变化程度。如果Xn与Yn变化一致。那么要是Xn大于均值,那么X -Xn就是正数,Yn也是同样的,因此这个数是正数。将n依次取每个值,就可以算出X变量与Y变量之间的每个取值时的变化协同性。

以上是理想状态下,实际中,就算X变量与Y变量之间存在协同性,也可能出现这种情况:例如,在某个取值的时候,例如当n=2时候,·X2-mean(x) < 0,而·Y2-mean(Y) > 0。但因为我们是计算每一个取值时的计算结果,最终算一个求和。所以如果X和Y变量存在协同性,那么最终的结果还是为正数。

当然如果x变量与y变量反向相关,计算的结果为负数,代表负相关。

当然,你可能还会想,n = 1,n = 2,n = 3…,每个时刻X,Y都在增大,而且X都比均值大,Y都比均值小,这种情况协方差不就是负的了?7个负值求平均肯定是负值啊?也就是负相关。

但是X,Y都是增大的,明明同向变化的,这不就矛盾了?当然不矛盾,因为这种情况是不可能的。Xn和Yn减去的是均值。均值既然就意味这肯定有低于均值的Xn和Yn啊。所以结果一定是有正有负,看最后加和后,哪方更胜一筹。

cor相关 r语言 cor()r语言_r语言相关性分析_04

这里,我们知道了协方差是可以衡量两个变量之间的协同变化程度的。

2

标准差

标准差,是我们较常遇见的。不论是高中的数学课本,还是后面大学和工作遇到的变异系数,T检验等统计检验值都是需要标准差的。为什么标准差在统计中用到的这么多?

标准差可以衡量数据的分布状况

公式:

cor相关 r语言 cor()r语言_协方差_05

从公式可以看出,标准差计算方法为,每一时刻变量值与变量均值之差再平方,求得一个数值,再将每一时刻这个数值相加后求平均,再开方。其中Xi - u同样是以平均值为原点,某一时刻下数值偏离的程度。 取平方值,是因为这个偏离程度有正有负,如果想累加每一个时刻的偏离程度,需要取一个绝对值,平方是最好的绝对值的方法。

这样累加后,我们就可以得到x变量中数据的整体偏离中心原点的程度。然后我们还需要除以观察时刻的总数,以抵消因为观察次数不同而产生的影响。因为观察次数越多,求和值肯定越大,所以要除以N。

还没完,因为我们平方取值,所以还需要开平方。

这里我们可以看到:

标准差得到的,是变量中数据的分散程度

3

相关性系数

根据上述,我们知道了协方差可以获得两个变量之间的协同变化程度,标准差可以知道变量的变化范围。

协方差虽然可以衡量变化程度,但是还缺少一个统一的量纲,否则不能进行比较。

例如:

sunglass  icecream  cov(sunglass,icecream)#[1] 54091 cov(((sunglass)*0.01), ((icecream)*0.01))#[1] 5.4091 p1  p2  cowplot::plot_grid(p1,p2,nrow = 1,labels = c("p1","p2"),hjust = 0.05)



cor相关 r语言 cor()r语言_协方差_06