Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >相关性分析返回相关性系数的同时返回p值

相关性分析返回相关性系数的同时返回p值

作者头像
生信技能树
发布于 2022-03-03 05:00:59
发布于 2022-03-03 05:00:59
77000
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:0
代码可运行

这个分析需求已经不是第一次有人问我了,可能是因为某个基因集相关的lncRNA的数据分析策略深入人心吧。越来越多的人选择了它相关性分析。如果是2万多个蛋白质编码基因和2万多个lncRNA基因的相关性,计算量就有点可怕,不过几十个m6a基因或者小班焦亡基因去跟其它基因进行相关性计算,基本上还是绝大部分小伙伴可以hold住的。

首先创造模拟数据;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dat_m6A = matrix(rnorm(10000),nrow = 20)
dim(dat_m6A)
dat_lnc  = matrix(rnorm(15000*ncol(dat_m6A)),nrow = 15000)
dim(dat_lnc)

可以看到是20个m6a基因,以及 1.5万个lncRNA的表达量矩阵,而且样品数量是500个;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> dim(dat_m6A)
[1]  20 500 
> dim(dat_lnc)
[1] 15000   500

接下来,我们就开始对 dat_m6A 和 dat_lnc 两个矩阵的不同基因,进行相关性分析。

首先对它们进行简单的行列命名,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
colnames(dat_m6A) = paste0('sample_',1:ncol(dat_m6A))
rownames(dat_m6A) = paste0('m6a_',1:nrow(dat_m6A))
colnames(dat_lnc) = paste0('sample_',1:ncol(dat_lnc))
rownames(dat_lnc) = paste0('lnc_',1:nrow(dat_lnc))
 
> round(dat_m6A[1:4,1:4],2) 
      sample_1 sample_2 sample_3 sample_4
m6a_1     1.46    -1.22    -1.26    -0.58
m6a_2    -0.14     0.46     2.27    -0.62
m6a_3    -1.96    -1.37    -0.32    -0.90
m6a_4    -0.83     0.58     0.67     0.82
> round(dat_lnc[1:4,1:4],2) 
      sample_1 sample_2 sample_3 sample_4
lnc_1     0.76     0.91     0.17     0.40
lnc_2     0.47    -1.89    -0.10     0.62
lnc_3    -0.57    -0.34    -1.07    -1.25
lnc_4    -1.47     0.02    -1.33    -0.73

因为,这两个矩阵,都是完全随机的,所以后续进行相关性分析,理论上R值和p值都表现不好。

最简单的是 corr.test 函数:

而 corr.test 函数 来自于 psych 这个包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

## do corr.test 
data.corr <- corr.test(dat_m6A, dat_lnc, 
                       method="pearson", adjust="fdr")
data.r <- data.corr$r
data.p <- data.corr$p

虽然 corr.test 函数 方便,一下子得到了r值矩阵和配套的p值矩阵。很容易进行筛选。但是它运行速度实在是太慢了!

起码在我写完这个教程的时候,它还没有运行完毕。而且我注意到它的帮助文档里面写的是:For very large matrices (> 200 x 200), there is a noticeable speed improvement if confidence intervals are not found.

也仅仅是说,它认为 matrices (> 200 x 200), 是 very large ,简直是搞笑啊,对生物信息学数据分析完全不适用啊它这个评价标准。

R基础包stats里面的cor函数是效率最高的,但是缺p值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dat=rbind(dat_m6A,dat_lnc)
# 这个 cor 函数运行非常快
# Unfortunately, the function cor() returns only the correlation coefficients between variables
cor_dat=cor(t(dat))
cor_dat[1:4,1:4] 
cor_df=cor_dat[1:nrow(dat_m6A),
               (nrow(dat_m6A)+1):(nrow(dat_m6A)+nrow(dat_lnc))]
round(cor_df[1:4,1:4], 2)
library(reshape2)
cor_df=melt(cor_df)
head(cor_df)
colnames(cor_df)=c('m6A' ,'lncRNA' ,'cor')

R_thre=0.2 # 因为是模拟数据,所以迫不得已,设置了 0.2          
cor_df=cor_df[abs(cor_df$cor) > R_thre,]
cor_df$R = ifelse(cor_df$cor > 0,'postive','negative')
table(cor_df$R)
table(as.character(cor_df$m6A)) 

因为是模拟数据,所以迫不得已,设置了R的阈值是 0.2 ,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> cor_df
          m6A    lncRNA        cor        R
93795  m6a_15  lnc_4690 -0.2197739 negative
141146  m6a_6  lnc_7058 -0.2058085 negative
239808  m6a_8 lnc_11991 -0.2090980 negative
298828  m6a_8 lnc_14942  0.2139784  postive

可以看到,完全随机的数值,也是可以达到约0.2的相关性哦,不过,这里没有给出p对应的p值,并不能说是统计学显著的相关性哦。

另外,因为我这个教程里面并没有设置随机数种子,所以呢,你也基本上不可能得到跟我一模一样的结果哦。

两个apply循环嵌套

这个问题是粉丝提问,我让对方发给我了代码,我看了看, 虽然对方已经是很灵活应用了apply函数,以及unlist函数,而且还可以自己创造函数,比如下面的cor_2_matrix函数,但是代码冗余太多了。

可能是对 R基础包stats里面的cor函数 不熟悉,以为它只能是对两个向量进行相关性计算,其实它可以直接对一个表达量矩阵进行相关性计算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
m1=dat_m6A
m2=dat_lnc
cor_2_matrix <- function(m1,m2){
  apply(m2 , 1, function(x){
    #  x = m2[2,]
    unlist(apply(m1, 1,function(y){
      # y  = m1[1,]
      cor(as.numeric(x),
          as.numeric(y))
    }))
  })
}
rdf=cor_2_matrix( m1  , m2 ) 

这个速度其实超级快了。但是粉丝也是不知道如何设置p值,我给他进行了简单的修改,如下所示;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

corP_2_matrix <- function(m1,m2){
  apply(m2 , 1, function(x){
    #  x = m2[2,]
    unlist(apply(m1, 1,function(y){
      # y  = m1[1,]
      cor.test(as.numeric(x),
          as.numeric(y))$p.value
    }))
  })
}
pdf=corP_2_matrix( m1  , m2 ) 

速度也是一般般,而且比较麻烦的就是两次得到了两个矩阵,需要整合!可以看到,同样的,因为是模拟数据,所以基本上相关性都很弱,而且p值不太可能是小于0.05的, 很难有统计学显著性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> rdf[1:4,1:4] 
            lnc_1         lnc_2        lnc_3       lnc_4
m6a_1  0.03162697  0.0160654358 -0.041608606 -0.02066662
m6a_2 -0.02402029 -0.0002989616  0.025571886  0.02516795
m6a_3 -0.03827284  0.0072451576 -0.001705459  0.03600183
m6a_4 -0.01619382 -0.0743613971  0.028690169  0.01480454
> pdf[1:4,1:4] 
          lnc_1      lnc_2     lnc_3     lnc_4
m6a_1 0.4804326 0.72007536 0.3531637 0.6447899
m6a_2 0.5920671 0.99467954 0.5683611 0.5744888
m6a_3 0.3931174 0.87161827 0.9696560 0.4218182
m6a_4 0.7179333 0.09673156 0.5221350 0.7412269

这两个矩阵如何整合,筛选统计学显著的结果,就是后话了。

最辣鸡的两个for循环嵌套

当我把这个问题发在讨论群,让学员们尝试解决,发现绝大部分小伙伴给出来的都是最辣鸡的两个for循环嵌套,运行效率本身就堪忧,而且极度的不美观。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 最垃圾的代码,两个for循环
if(F){
  outTab=data.frame()
  for(i in row.names(m6A_exp)){
    for(j in row.names(lnc_exp)){
      x=as.numeric(m6A_exp[i,])
      y=as.numeric(lnc_exp[j,])
      corT=cor.test(x,y)
      cor=corT$estimate
      pvalue=corT$p.value
      if((cor>corFilter) & (pvalue<pvalueFilter)){
        outTab=rbind(outTab,cbind(m6A=i,lncRNA=j,
                                  cor,pvalue,Regulation="postive"))
      }
      if((cor< -corFilter) & (pvalue<pvalueFilter)){
        outTab=rbind(outTab,cbind(m6A=i,lncRNA=j,
                                  cor,pvalue,Regulation="negative"))
      }
    }
  }
}

这个是最垃圾的代码,两个for循环,速度超级慢,只不过里面添加好了筛选标准而已。

我们前面的两个apply循环嵌套得到的两个矩阵进行整合后筛选统计学显著的结果也非常简单。

如果你确实觉得我的教程对你的科研课题有帮助,让你茅塞顿开,或者说你的课题大量使用我的技能,烦请日后在发表自己的成果的时候,加上一个简短的致谢,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
We thank Dr.Jianming Zeng(University of Macau), and all the members of his bioinformatics team, biotrainee, for generously sharing their experience and codes.

十年后我环游世界各地的高校以及科研院所(当然包括中国大陆)的时候,如果有这样的情谊,我会优先见你

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
做COX生存分析是否需要把连续值变成高低二分组?
在进行Cox回归分析时,是否需要将连续变量转化为分类变量(如高低二分组)取决于研究目的和数据特性。Cox回归模型可以处理连续变量,但有时将连续变量转化为分类变量可以提供更明确的临床意义和更易解释的结果。
生信技能树
2025/01/07
2020
做COX生存分析是否需要把连续值变成高低二分组?
你只能哭着说明明没有相关性
因为是转录组测序,所以基因表达量可以很容易根据物种对应的gtf文件进行蛋白编码基因和非编码基因的表达量拆分,前面的代码略过哈,我们直接看拆分好的两个表达量矩阵:
生信技能树jimmy
2021/05/18
4210
你只能哭着说明明没有相关性
基于CellMiner数据库的基因表达与药敏分析
CellMiner数据库,主要是通过国家癌症研究所癌症研究中心(NCI)所列出的60种癌细胞为基础而建立的。该数据库最初发表于2009年,后于2012年在Cancer Research杂志上进行了更新,题目为“CellMiner: a web-based suite of genomic and pharmacologic tools to explore transcript and drug patterns in the NCI-60 cell line set”。大家后期在使用该数据库记得应用相关文献。
DoubleHelix
2022/11/24
4.5K0
基于CellMiner数据库的基因表达与药敏分析
回答公众号留言的2个关于相关性分析的问题
https://www.bilibili.com/video/BV1Ne41147eR
用户7010445
2020/07/28
9290
如果你觉得相关性热图不好看,或者太简陋
就有粉丝提问,把单细胞亚群使用 AverageExpression 函数做成为了亚群矩阵,是不是忽略了单细胞亚群的异质性呢?毕竟每个单细胞亚群背后都是成百上千个具体的细胞啊。代码如下所示:
生信技能树jimmy
2022/01/10
6740
如果你觉得相关性热图不好看,或者太简陋
m6A图文复现06-样本相关性检验与Peak Calling
前面我们分享了 跟着Nature Medicine学MeDIP-seq数据分析,数据和代码都是公开,这个2G的压缩包文件,足以学习3个月,写60篇教程。同时也分享了 全套MeRIP-seq文章图表复现代码,其实MeRIP-seq其实就是RNA水平的,又叫做m6a测序。
生信技能树
2021/08/25
3K0
m6A图文复现06-样本相关性检验与Peak Calling
相关性热图、圈图、弦图(笔记)
如下所示,可以看到有多个样品,每个样品都有多个基因表达量,这个时候我们比较关心的是这些基因的表达量相关性(在多个样品),基因与基因之间有两两组合相关性:
生信技能树
2023/02/27
2.6K0
相关性热图、圈图、弦图(笔记)
多分组差异分析解决方案(1)循环T检验
主要方法:将其中某一组设置为实验组,其余几组统一设置为对照组。 第一步读取数据,合并表达矩阵和分组文件 #=========================================================================== #=========================================================================== rm(list = ls(all.names = TRUE)) options(st
用户1359560
2021/06/10
1.2K0
多分组差异分析解决方案(1)循环T检验
R计算mRNA和lncRNA之间的相关性+散点图
我们在做表达谱数据分析的时候,经常需要检测基因两两之间表达的相关性。特别是在构建ceRNA网络的时候,我们需要去检查构成一对ceRNA的mRNA和lncRNA之间的表达是否呈正相关。前面给大家分享过R计算多个向量两两之间相关性,今天小编就给大家分享一个实际的应用案例,用R去批量的检测大量mRNA跟lncRNA之间表达的相关性,并绘制散点图。
生信交流平台
2022/09/21
8540
R计算mRNA和lncRNA之间的相关性+散点图
比较不同流程(limma/voom,edgeR,DESeq2 )差异分析的区别
距离第一次听说生信已经十几年了,现在是邋遢大叔重新开始学代码,精力确实已不像从前,各位入坑还是要乘早。后来约莫在5年前,课题组当时有个RNA-Seq数据,lab meeting时听瑞典小哥在汇报DEGs筛选,当时感觉好是神奇。其实陆陆续续也有过学习的念头,但在对自己的各种纵容下,想法又逐渐隐没。直到2月前,机缘巧合参加了生信技能树培训,才进一步强化了自己学习生信技术的信念。
生信技能树
2021/01/05
5.2K0
转录组差异分析—基本流程
读取RawCounts.csv文件,其文件形式如下图行名为ensembleid,列名为样本名称。
sheldor没耳朵
2024/07/29
2340
转录组差异分析—基本流程
一网打尽转录组差异分析!!!
差异分析在转录组数据分析中占据着举足轻重的地位,是揭示基因表达变化的关键步骤。然而,面对众多如DESeq2、limma和edgeR等转录组分析R包,分析人员常常面临选择困境。本文旨在深入探讨这些常用差异分析R包的特点、优劣,以及它们与t检验/Wilcox秩和检验(Wilcox-rank-sum test)在差异分析结果上的异同点。
生信学习者
2024/06/11
4550
一网打尽转录组差异分析!!!
肿瘤免疫细胞浸润与临床相关性分析
Profiles of immune infiltration in colorectal cancer and theirclinical significant: A gene expression- based study
DoubleHelix
2020/04/07
6.9K0
TCGA癌症数据挖掘之预后模型建立和评价
表达矩阵只需要tumor数据,不要normal,将其去掉,新表达矩阵数据命名为exprSet;
生信技能树
2022/06/08
5.9K1
TCGA癌症数据挖掘之预后模型建立和评价
WGCNA仅仅是划分基因模块,其它都是附加分析
曾老师给我分享了一篇数据挖掘的文章,里面的WGCNA非常奇怪,我之前没见过这样的模块与表型的相关性热图
生信技能树
2023/09/04
1.3K0
WGCNA仅仅是划分基因模块,其它都是附加分析
在Python中创建相关系数矩阵的6种方法
相关系数矩阵(Correlation matrix)是数据分析的基本工具。它们让我们了解不同的变量是如何相互关联的。在Python中,有很多个方法可以计算相关系数矩阵,今天我们来对这些方法进行一个总结
deephub
2023/09/24
1.1K0
在Python中创建相关系数矩阵的6种方法
R中循环处理多组间相关性分析
R语言数据分析指南
2023/11/30
2620
R中循环处理多组间相关性分析
生物信息数据分析教程视频——11-筛选相关性基因
视频地址:http://mpvideo.qpic.cn/0bc3tiabgaaaneakrfjtfvrvbgwdconaaeya.f10002.mp4? 参考: 如何合理的展示相关性分析结果??
DoubleHelix
2022/12/15
7680
生物信息数据分析教程视频——11-筛选相关性基因
重复一篇Cell文献的PCA图
这天,接到了生信技能树创始人jimmy老师的一个任务,要重复一篇CELL文章中的一个图示:
生信技能树
2019/05/08
2.1K0
重复一篇Cell文献的PCA图
【画图】如何批量展现基因表达相关性?
现在已经有明确的实验证明,跟SARS病毒一样,新冠状病毒2019-nCoV与宿主细胞的ACE2受体结合[1]。上次教程已经给大家演示了,GTEx数据库有人各组织中基因表达谱数据,下载整理这个数据可以绘制出ACE2受体在人体组织中的表达量情况以及可能的功能有哪些。
Chris生命科学小站
2023/02/28
4680
【画图】如何批量展现基因表达相关性?
推荐阅读
相关推荐
做COX生存分析是否需要把连续值变成高低二分组?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验