分享

R语言相关性分析(下)

 生物_医药_科研 2019-07-23

相关性分析

cor函数的完整语法如下:

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

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

1
pearson相关系数

算法如下:

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

甚至我们可以写成:

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

1

协方差

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

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

公式:

如果有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啊。所以结果一定是有正有负,看最后加和后,哪方更胜一筹。

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

2

标准差

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

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

公式:

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

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

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

这里我们可以看到:

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


3

相关性系数

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

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

例如:

 sunglass <- c(213,233,296,345,645,644,492,691,790,667,645,546,506,524,434,383,282,181,30,50,30) icecream <- c(215,236,300,350,651,651,500,700,800,678,657,559,520,539,450,400,300,200,50,30,50) cov(sunglass,icecream)#[1] 54091 cov(((sunglass)*0.01), ((icecream)*0.01))#[1] 5.4091 p1 <- qplot(sunglass,icecream) p2 <- qplot(((sunglass)*0.01), ((icecream)*0.01)) cowplot::plot_grid(p1,p2,nrow = 1,labels = c('p1','p2'),hjust = 0.05)

发现问题了吧,明明icecream和sunglass之间是一样的变化协同程度,但因为波动范围的取值大小,就导致了cov(sunglass,icecream)是54091,而cov(((sunglass)*0.01), ((icecream)*0.01))就变成了5.4091。

但是明明趋势和相关性程度是一致的,这就意味着协方差没有考虑原始数据的分布范围。因此我们还需要将这个值数放在一个量纲下,最好的量纲就是自己的原始数据分布情况。

这不正好需要标准差吗。因此相关性系数的计算就是协方差/标准差:

2
spearman相关性系数

Pearson相关系数相关,Spearman相关系数测量两个变量之间的关系。Spearman可以理解为Pearson相关系数的基于等级的版本,可以用于非正态分布且具有非线性关系的变量。此外,它不仅可用于连续数据,还可用于序数属性的分析。

是不是感觉有点蒙圈,但其实不难。spearman最大的差别在于,它不是根据原始数值来计算相关性,而是根据排序。

假设两个随机变量分别为X、Y,它们的元素个数均为N,两个随机变量取的第i(1<=i<=N)个值分别用Xi、Yi表示。对X、Y进行排序(同时为升序或降序),得到两个元素排行集合x、y,其中元素xi、yi分别为Xi在X中的排行以及Yi在Y中的排行。将集合x、y中的元素对应相减得到一个排行差分集合d,其中di=xi-yi。

注意区分X和Y的大小写。

我们知道了排名后,其实计算公式还是person那套算法

但是我们也可以发现,直接计算排名,对那些非线性的相关性就会非常友好了。此外,还可以适用于非正态分布的数据。但作用也是有限的,不信你试试。

cor(tem,icecream,method ='spearman')cor(tem,icecream,method ='pearson')

所以至于选择spearman还是选择pearson来计算相关性,这个还要结合数据来说话。因此推荐先用pearson来计算,如果结果不好,就可以试试spearman。

3
cos余弦相似性

余弦相似性测量两个n维样本向量的方向,而与其大小无关。它由两个数值向量的点积计算,并且通过向量长度的乘积进行归一化,因此接近1的输出值表示高相似性。

4
Kendall相似性

和Spearman相关系数类似,Kendall计算排序变量之间的依赖关系,同样适用非正态分布数据。Kendall 可以计算连续数据和有序数据。Kendall在已有排名变量的背景下,通过对错位的强烈惩罚来区别于Spearman的。

公式:

就是如果Xi与Yi的排序是一致的,就会得分,不一致就会减分。

今天的内容就到这里啦~

参考资料:

[1] http://blog.sina.com.cn/s/blog_6aa3b1010102xkp5.html

[2] https://statistics./statistical-guides/spearmans-rank-order-correlation-statistical-guide.php

[3] http://www.hep.ph./~hallg/UG_2015/Pearsons.pdf

[4] http:///latex-and-statistics-formulas/

[5] https://www./data/correlation.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多