分享

R语言相关性分析(上)

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

接触组学数据这么久了,大家一定少不了分析各种相关性,譬如大到几个转录组样本的整体相关性分析,小到挑选了一些候选基因看它们在不同样本中的表达模式相关性。今天这篇文章给大家讲讲如何利用R语言进行相关性分析。


1
前言

组学数据分析主要有两类,一类是基于被研究对象的位置和序列。一类是基于算法。前者比如说lncRNA与mRNA的antisense和cis的作用关系,miRNA和piRNA的靶向基因预测等。后者就比如说机器学习、降维、聚类等算法。

其中机器学习是通过程序不断迭代来寻找合适的模型。

降维就是将高维数据通过计算,在尽量保证数据原始分布特征的情况下,将数据映射在低维的刻度。

聚类方法很多,常用的是计算欧式距离后,用K-mean聚类算法进行聚类。

K-mean聚类算法就是先随机挑选k个中心,按照距离远近分别聚在一起,然后在聚类的簇里重新选择平均值作为中心点,重新聚类,再不断迭代设置的次数,最后的结果就是聚类结果。

当然如果画树,还涉及分类树的算法。简而言之,麻烦,不详细说了。

相关性分析,这就是本文要详细说的了。

2
相关性分析

相关性分析是一种统计技术。

相关性分析,就是衡量两个变量之间的依赖性强弱

相关性:可以显示两个变量是否相关以及如何相关。例如,身高和体重是相关的; 较高的人往往有更大的体重。那么这种关系就是正相关。那么再例如汽车排量与每升汽油的里程,是负相关的,汽车排量越大,每升汽油跑的里程就越短。

尽管这种相关性非常明显,但您的数据可能包含未预料到的相关性。您可能还会产生怀疑,怀疑两个变量之间是否存在相关性,或者不知道两者之间的依赖和联系程度。这个时候,就需要一种可以量化的指数分析。相关分析可以帮助我们更好地理解数据。

但是,使用相关性分析的时候,我们需要记住的一个关键事项是:永远不要假设相关性就一定意味着A变量的变化会导致B变量的变化。

多年来个人电脑和运动鞋的销售都急剧增长,并且它们之间存在高度相关性,但你不能认为购买电脑会导致人们购买运动鞋(反之亦然)。但可能还是可能存在相同的调节因素,比如社会生产力的提高和经济状况的改善。

1

正负相关性

当两个变量之间存在非常强烈的相互依赖关系的时候,我们就可以说两个变量之间的存在高度相关性。

若两组的值一起增大,我们称之为正相关,若一组的值增大时,另一组的值减小,我们称之为负相关

本次我们用R来进行计算和绘图,所用的数据是R自带的mtcars数据。

> mtcars
> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4

Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4

Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

行名我们知道是汽车的型号。那么列名呢?

mpgcyldisphpwt
英里/加仑气缸数量排量总马力重量

从上述列名中,我们可以简单得到排量(disp)与马力(hp)呈现正相关性,而与每加仑汽油行驶的里程是负相关性。

那么我们就可以用R的cor函数来计算两个变量之间的相关性。

library(ggplot2)

r <- cor(mtcars$disp,mtcars$mpg,method = 'pearson')

p1 <- ggplot(data = mtcars, aes(x = disp, y = mpg)) +

geom_point(color = '#d7191c') +

geom_smooth(method = 'lm',color = '#1a9641') +
       geom_text(aes(x = 400, y = 32,label = paste('R' ,'=',signif(r,3),seq = '')),color ='#fdae61') +
theme_bw()
r1 <- cor(mtcars$disp,mtcars$hp,method = 'pearson')
p2 <- ggplot(data = mtcars, aes(x = disp, y = hp)) +
geom_point(color = '#d7191c') + 
geom_smooth(method = 'lm',color = '#1a9641') +
geom_text(aes(x = 400, y = 32,label = paste('R' ,'=',signif(r1,3),seq = '')),color ='#fdae61') + 
theme_bw()
cowplot::plot_grid(p1,p2,nrow = 1,labels = c('p1','p2'),hjust = 0.05)


2

相关分析的局限

刚刚我们知道了,相关性分为正相关和负相关。但这里,我们之说的是线性相关。因为非线性相关的话,更适合建模拟合多元回归。这个还是很牛的领域,只是我还没涉及,上次去青岛做生信培训,就有老师想构建四因素的多元回归分析。这个领域我完全没有了解。就不说了。

但是用R中cor函数来计算相关性也是有局限的。首先第一点,不能计算非线性模型。

例如我们先看一组简化的数据,icecream是冰激凌的销售额。sunglass是太阳镜的销售额,tem是温度。

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)

tem <- seq(30,40,0.5)
dat <- data.frame(sunglass, icecream, tem)

我们先看在温度低于35时候的冰激凌销售与温度之间的关系。

require(magrittr)

dat_low <- dat %>% dplyr::filter(tem < 35)
r2 <- cor(dat_low$icecream, dat_low$tem)
p3 <- ggplot(data = dat_low, aes(x = tem, y = icecream)) +
          geom_point() + 
geom_smooth(method = 'lm', color = '#1a9641') +
           geom_text(aes(x = 34, y = 500,label = paste('R' ,'=',signif(r2,3),seq = '')),color ='#fdae61') + 
  theme_bw()

这个时候,我们可以看到当温度低于35度的时候,冰激凌销量是和温度正相关的。但是随着天气炎热,大家都不愿出远门,这时候冰激凌的销售就下来了。温度在30度到40度之间的时候,温度和冰淇淋销量之间的相关性是怎么样呢。

r3 <- cor(dat$icecream,dat$tem)

p4 <- ggplot(data = dat, aes(x = tem, y = icecream)) +

geom_point() +
         geom_smooth(method = 'lm',color = '#1a9641') +
geom_text(aes(x = 39, y = 500,label = paste('R' ,'=',signif(r3,3),seq = '')),color ='#fdae61') +
         theme_bw()

其实我们就可以发现问题,这里的温度和冰激凌销量是有很强的相关性的,我们甚至可以用脑子拟合出一个抛物曲线。虽然这个相关性不是线性的。但是如果我们继续用R中cor函数来计算,用线性相关性分析显然是不正确的,数值才-0.39。

另外,相关性强,也不等于因果关系。例如我们可以看到太阳眼镜的销量和冰激凌的销量之间的关系。

r4 <- cor(dat$icecream,dat$sunglass)

p5 <- ggplot(data = dat, aes(x = icecream, y = sunglass)) +

         geom_point() + 
geom_smooth(method = 'lm',color = '#1a9641') +
         geom_text(aes(x = 700, y = 500,label = paste('R' ,'=',signif(r4,3),seq = '')),color ='#fdae61') + 
theme_bw()

可以看到,就算太阳镜和冰淇淋的销量相关性是0.99,也不能体现两者是因果关系。就是说,相关不代表一个现象导致另一个(相关可能有其他的原因,比如太阳的直射时间)。

今天的内容就到这里啦~

参考资料:

[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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多