查看: 1128|回复: 3

[R语言] R语言相关性分析(上)

[复制链接]
  • TA的每日心情

    2019.9.23 10:01
  • 签到天数: 101 天

    连续签到: 1 天

    [LV.6]常住居民II

    管理员

    Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

    主题
    392
    奥币
    1106
    积分
    5611
    注册时间
    2018.4.19
    在线时间
    893 小时

    推广达人宣传达人


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

    1前言

    组学数据分析主要有两类,一类是基于被研究对象的位置和序列。一类是基于算法。前者比如说lncRNA与mRNA的antisense和cis的作用关系,miRNA和piRNA的靶向基因预测等。后者就比如说机器学习、降维、聚类等算法。
    其中机器学习是通过程序不断迭代来寻找合适的模型。
    降维就是将高维数据通过计算,在尽量保证数据原始分布特征的情况下,将数据映射在低维的刻度。
    聚类方法很多,常用的是计算欧式距离后,用K-mean聚类算法进行聚类。
    K-mean聚类算法就是先随机挑选k个中心,按照距离远近分别聚在一起,然后在聚类的簇里重新选择平均值作为中心点,重新聚类,再不断迭代设置的次数,最后的结果就是聚类结果。
    当然如果画树,还涉及分类树的算法。简而言之,麻烦,不详细说了。
    相关性分析,这就是本文要详细说的了。

    2相关性分析

    相关性分析是一种统计技术。
    相关性分析,就是衡量两个变量之间的依赖性强弱
    相关性:可以显示两个变量是否相关以及如何相关。例如,身高和体重是相关的; 较高的人往往有更大的体重。那么这种关系就是正相关。那么再例如汽车排量与每升汽油的里程,是负相关的,汽车排量越大,每升汽油跑的里程就越短。
    尽管这种相关性非常明显,但您的数据可能包含未预料到的相关性。您可能还会产生怀疑,怀疑两个变量之间是否存在相关性,或者不知道两者之间的依赖和联系程度。这个时候,就需要一种可以量化的指数分析。相关分析可以帮助我们更好地理解数据。
    但是,使用相关性分析的时候,我们需要记住的一个关键事项是:永远不要假设相关性就一定意味着A变量的变化会导致B变量的变化。
    多年来个人电脑和运动鞋的销售都急剧增长,并且它们之间存在高度相关性,但你不能认为购买电脑会导致人们购买运动鞋(反之亦然)。但可能还是可能存在相同的调节因素,比如社会生产力的提高和经济状况的改善。

    1.正负相关性

    当两个变量之间存在非常强烈的相互依赖关系的时候,我们就可以说两个变量之间的存在高度相关性。
    若两组的值一起增大,我们称之为正相关,若一组的值增大时,另一组的值减小,我们称之为负相关。


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



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

    从上述列名中,我们可以简单得到排量(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,也不能体现两者是因果关系。就是说,相关不代表一个现象导致另一个(相关可能有其他的原因,比如太阳的直射时间)。

    今天的内容就到这里啦~

    本文作者:技术咖


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

  • TA的每日心情
    yes!
    11 小时前
  • 签到天数: 238 天

    连续签到: 2 天

    [LV.7]常住居民III

    帝王蝶

    Rank: 4

    主题
    3
    奥币
    960
    积分
    370
    注册时间
    2019.3.2
    在线时间
    115 小时

    发表于 2019.7.9 12:27:56 | 显示全部楼层
    相关性强,也不等于因果关系!
    回复 支持 反对

    使用道具 举报

    +

    该用户从未签到

    草履虫

    Rank: 2

    主题
    0
    奥币
    6
    积分
    26
    注册时间
    2018.9.27
    在线时间
    2 小时

    发表于 2019.7.9 20:35:16 | 显示全部楼层
    最近正在弄这个东西,好耶
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    吃饭
    13 小时前
  • 签到天数: 27 天

    连续签到: 27 天

    [LV.4]偶尔看看III

    帝王蝶

    Rank: 4

    主题
    1
    奥币
    228
    积分
    313
    注册时间
    2019.10.24
    在线时间
    19 小时

    发表于 7 天前 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表