查看原文
其他

高能推荐!批量在多个组织中找出跟你的分子最相关的基因。

果子 果子学生信 2023-06-15

在第一个课程中,我们像素级别还原了Nature的一张小图,
跟Nature一起学习TCGA,GTEx和CCLE数据库的使用

更重要的是,在实现这个图之前的数据处理过程,我们强行执行了数据调整的三大步
1.基因名称转换
2.行列转置
3.添加分组信息

1.已经实现的技能

这样我们就实现了输入任意两个基因,返回其在多个组织中相关性数据的功能。

比如你看到一个分子TMED3,想看看他跟诺奖明星低氧诱导分子(HIF1A)之间的关系
只要三步就可以实现:
第一步加载数据

load(file = "pancancer_mRNA_exprSet.Rdata")
data = mRNA_exprSet
test <- data[1:10,1:10]

第二步加载函数运算
他会返回一个清洁数据框,

### 写一个函数
pancor <- function(gene1,gene2,data=data){
  data1 <- split(data,data$type)
  do.call(rbind,lapply(data1, function(x){
    dd  <- cor.test(as.numeric(x[,gene1]),as.numeric(x[,gene2]),method="pearson")
    data.frame(type=x$type[1],cor=dd$estimate,p.value=dd$p.value )
  }))
}
### 运算
plotdf <- pancor("TMED3","HIF1A",data)

第三步画图

pancorplot(plotdf)

图马上就出来了。

心里还是有一些希望的,因为有颜色就代表p值是小于0.05的
这两个分子至少在一些组织中是有相关性的,只是有的高(红色)有的低(蓝色)。

2.目前的困境

我想看看在我的乳腺癌中有没有相关性呢?
作图函数pancorplot支持指定肿瘤类型(如果是GTEx数据,支持的是组织类型)

pancorplot(plotdf,"BRCA")

这回彻底悲凉了,没有相关性。竖线是p值0.05。

当然,如果会编程,这些都不是个事情。我们可以让2万个基因都跟HIF1A算一次
然后返回所有的结果,让我来选。
这样就可以找到,在所有组织中相关性都很好的基因GNB1

当然,我们也可以找到在大部分组织中都负相关的分子ABHD16B
你要知道,其实总体而言,两个基因相关性为正的概率远远大于相关性为负的,这是从两万个数据中统计得出的。

这样一来,真的是天高任鸟飞啦。

3.解决方案

方法显而易见,就是写个批量的循环来做这个啊
因为我们可以算一个,就可以算多个。
修改上面的函数,让他返回一个总结后的结果,也就是一个基因一行,告诉我p值有意义的有多少个,多少是正的,多少是负的。

data1 = split(data,data$type)
### 加载函数
pancorBatch <- function(gene1,gene2,data1){
  pancordata = do.call(rbind,lapply(data1, function(x){
    dd  <- cor.test(as.numeric(x[,gene1]),as.numeric(x[,gene2]),method="pearson")
    data.frame(type=x$type[1],cor=dd$estimate,p.value=dd$p.value )
  }))
  subdata = pancordata[pancordata$p.value < 0.05 ,]
  data.frame(gene1,
             count= nrow(subdata),
             positive= sum(subdata$cor > 0),
             engitive= sum(subdata$cor < 0))
}

测试一下

pancorBatch("GNB1","HIF1A",data1)

返回结果:

  gene1 count positive engitive
1  GNB1    33       33        0

而且我发现时间大概是0.03秒,两万个基因大概就是600秒,10分钟就搞定了。
不过我们可以用并行的方法来加快速度

library(future.apply)
plan(multiprocess)

正式运行

yourgene <- "HIF1A"
genelist <-  setdiff(colnames(data),c("sample","TCGA_id","type","subtype",yourgene))
system.time(pancorfilter <- do.call(rbind,future_lapply(genelist,pancorBatch,yourgene,data1)))

运算过程中,我的小电脑被榨干了每一滴性能。

最终大概2分钟搞定。

  用户   系统   流逝 
 28.08  47.30 139.03 

返回的数据看一样吧
GBN1基因赫然在列。

我为什么没用新冠相关的分子ACE2来作为例子呢。
因为总有人要拿他来发文章,我就不展现了。

4.使用场景扩展

这样一个功能,对于任何手上有个基因的科研工作者都可以用起来。
但还有更好的场景

1.非编码RNA: 比如,你有个lncRNA,但是不知道有什么功能,可以用这里的方法来看一下。

在单个组织中我已经写过了。
单基因批量相关性分析的妙用

2.miRNA:假如你有一个miRNA在手上,那就更好了,因为miRNA和mRNA的相关性正好吻合他的作用机制。
我们可以先预测miRNA的靶基因
然后再用批量相关性去筛选负相关的。在泛组织层面得出的结论更加可靠

3.甲基化位点: 如果你能够学会数据整理的方法,把甲基化数据也整合到一起。
那么你就可以实现,任意一个甲基化位点的注释。

4.转录因子筛选: 你的基因的启动子预测出一大堆转录因子,然后用你的基因和转录因子求相关性,是不是结果更可信呢,拿出其中的3-5个去做过表达实验,只要能让你的基因表达升高或者降低,就是很好的开题,而且一定可以做出结果。

好了,这次就讲这么多,代码已经给大家展示了,
其实这里用到的就是lapply和do.call的功能,可以看看这个帖子,自己就可以写出来的。
视频小教程_R语言中的批量操作

如果在文章课题中用到的的话可以给我说一声哈,我也高兴高兴。
该部分的project文件和讲解视频会更新到产品交流群,为什么要录视频,因为有一些人迷恋我的声音(看图说话)
还有几十个没有加入的,麻烦看到联系一下我,以后所有的更新都在群里,没办法单独联系。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存