R语言之相关系数计算篇

简介:

在环境微生物类的文章中,经常出现计算物种与基因、基因与基因、基因与代谢物之间的相关系数的内容,在这个计算的基础之上再进行相关的可视化。例如相关性热图、网络图等等。文献中常出现的相关系数有Spearman、Pearson两种。

案例:

之间课题组一个师兄想代谢组学中代谢物与基因之间的相关性,共选择了95种代谢物,3313个相关基因,三个实验组一个对照组(每组三个生物学重复,共计12个样本)如下:

R语言 p值矫正 r语言p值计算_网络图


R语言 p值矫正 r语言p值计算_网络图_02

想分析每种代谢物和基因之间的关系,需要求解P值和R值,如下:

R语言 p值矫正 r语言p值计算_数据_03

求解思路:

方法一:cor() 函数与cor.test()函数

这两种函数是R自带的函数,使用简单,操作过程如下:

cor()函数

代码:

metabolite <- read.csv('metabolite.csv',row.names = 1)
gene <- read.csv('gene.csv',row.names = 1) #导入数据
R_pearson <- cor(metabolite,gene,method = 'pearson') #求解相关系数

结果:

R语言 p值矫正 r语言p值计算_操作过程_04

成功求解相关系数,but,该函数不能求解P值,失败*1。

cor.test()函数

代码:

metabolite <- read.csv('metabolite.csv',row.names = 1)
gene <- read.csv('gene.csv',row.names = 1)
R_pearson <- cor.test(metabolite,gene,method = 'pearson')

结果:

> R_pearson <- cor.test(metabolite,gene,method = 'pearson')
Error in cor.test.default(metabolite, gene, method = "pearson") : 
  'x'和'y'的长度必需相同

cor.test()函数只能进行同维度的数据计算,但是相较于cor()函数,cor.test()函数可以计算出P值,如下:

代码:

metabolite <- read.csv('metabolite.csv',row.names = 1)
gene <- read.csv('gene.csv',row.names = 1)
R_pearson <- cor.test(metabolite$X2.Hydroxypyridine,gene$Cluster.1184.0,method = 'pearson') #只选择其中一列数据进行计算

结果:

R语言 p值矫正 r语言p值计算_操作过程_05

But!我们需要计算的是不同维度的数据,失败*2

方法二:Hmisc包中的rcorr()函数以及Psych包中的corr.test()函数

Hmisc包中的rcorr()函数

代码:

metabolite <- read.csv('metabolite.csv',row.names = 1)
gene <- read.csv('gene.csv',row.names = 1)
library(Hmisc) #载入包(前提是你安装了这个包)
rcorr_test_pearson <- rcorr(as.matrix(gene),as.matrix(metabolite),type = 'pearson')#这里的编写规则和前两个不一样,数据需要转化为矩阵as.matrix()

结果:

该计算过程需要耗费一丢丢时间,当然不超过30s的样子

R语言 p值矫正 r语言p值计算_r语言_06

该结果包含了相关系数和P值,算是成功求解,但是一看结果:

R_pearson$r

R语言 p值矫正 r语言p值计算_数据_07


该结果中包含了gene、metabolite本身的相关系数以及P值,原因是啥俺也不知道/(ㄒoㄒ)/~~,失败*3

Psych包中的corr.test()函数

代码:

metabolite <- read.csv('metabolite.csv',row.names = 1)
gene <- read.csv('gene.csv',row.names = 1)
library(psych) #载入包(前提是你安装了这个包)
R_pearson <- corr.test(gene,metabolite,method = 'pearson')

结果:

结果就是出不来结果,┭┮﹏┭┮。好像是因为数量较大和corr.test()函数还包括了P值矫正的过程,这里需要指明的是虽然我没有写出矫正的方法但是corr.test()函数会有一个默认的矫正过程,所以大家在使用corr.test()的时候一定要注意这里有默认矫正的过程!!!!

R语言 p值矫正 r语言p值计算_R语言 p值矫正_08

代码一直停不下来,最后我按了ESC中止了代码。

后续:

只运行部分数据进行求解:

metabolite <- read.csv('metabolite.csv',row.names = 1)
gene <- read.csv('gene.csv',row.names = 1)
library(psych) #载入包(前提是你安装了这个包)
R_pearson <- corr.test(gene[1:3],metabolite[1:6],method = 'pearson')

后续的结果:

R语言 p值矫正 r语言p值计算_R语言 p值矫正_09

至少说明在数据量比较小的时候,corr.test()函数有着比较好的优势。失败*3

结果:

最后还是决定使用Hmisc包中的rcorr()函数进行求解:

代码:

metabolite <- read.csv('metabolite.csv',row.names = 1)
gene <- read.csv('gene.csv',row.names = 1)
library(Hmisc) #载入包(前提是你安装了这个包)
rcorr_test_pearson <- rcorr(as.matrix(gene),as.matrix(metabolite),type = 'pearson')#这里的编写规则和前两个不一样,数据需要转化为矩阵as.matrix()
rcorr_test_pearson_R <- rcorr_test_pearson$r[1:3313,3314:3408]
rcorr_test_pearson_P <- rcorr_test_pearson$P[1:3313,3314:3408]#后来琢磨了一下,我只选择结果里面我需要的数据即可
write.csv(rcorr_test_pearson_R,'R.csv')#导出数据
write.csv(rcorr_test_pearson_P,'P.csv')

结果:

R语言 p值矫正 r语言p值计算_r语言_10


R语言 p值矫正 r语言p值计算_R语言 p值矫正_11