通路共出现
今天听报告发现了一个很有意思的东西,关于筛选 一对基因同时在几个通路中同时出现 .
不仅仅是通路共出现,往外延伸可以是 两个基因在几个病人中同时突变, 两个基因同时拷贝数异常, 两个基因同时甲基化异常 等等等等.
这种问题在平时课题中出现的频率还是挺高的,以前没有特别关注,今天这篇文章中的思考方式值得学习一下.
函数式
以前我在解决这种问题时,更偏向于函数式的思考.
这种思考方式决定了我会先考虑
- 输入参数是什么 –> 两个基因
- 输出结果是什么 –> 同时出现在几个通路中
- 数据形式是什么 –> 矩阵或data frame,行为基因,列为通路
结果就会导致我写出这样的函数,假设有10个pathway和5个基因:
random_choose <- sample(c(0,1), 50, replace = T)
gene_path <- matrix(random_choose, ncol = 10)
colnames(gene_path) <- paste0("p", 1:10)
rownames(gene_path) <- paste0("g", 1:5)
gene_path
## p1 p2 p3 p4 p5 p6 p7 p8 p9 p10
## g1 1 1 1 1 0 1 0 0 0 0
## g2 0 1 0 0 0 0 1 1 1 0
## g3 0 1 1 1 0 0 1 0 1 1
## g4 0 1 1 1 0 1 0 0 0 1
## g5 0 1 0 1 0 1 1 0 1 0
path_coexist <- function(gene_1, gene_2){
gene_1_pathway = colnames(gene_path)[which(gene_path[gene_1,] == 1)]
gene_2_pathway = colnames(gene_path)[which(gene_path[gene_2,] == 1)]
inter_pathway_num = length(intersect(gene_1_pathway, gene_2_pathway))
return(inter_pathway_num)
}
path_coexist("g1", "g4")
## [1] 4
这种方式咋一看,哎,很正常,但是跟下面的方式比较就相形见绌了.
矩阵式
关于R语言中矩阵式思维,一直是高手与新手的分界线,好似段誉学会了六脉神剑,功力大涨.
假如用矩阵式的思维来思考这个问题就显得特别简单:
gene_gene_coexist <- gene_path %*% t(gene_path)
gene_gene_coexist
## g1 g2 g3 g4 g5
## g1 5 1 3 4 3
## g2 1 4 3 1 3
## g3 3 3 6 4 4
## g4 4 1 4 5 3
## g5 3 3 4 3 5
接下去只需要在这个矩阵中的上三角或者下三角中提取我们想要的基因组合就可以了.
可塑性
矩阵式这么好用,我一定要学会!
矩阵式的确有着非常强大的作用,掌握它也非常有必要,但是作为所有编程语言的基础,函数是不可替代的.
相较于矩阵式,函数式有着无可比拟的可塑性.
比如我们不仅仅统计两个基因在几个通路中同时出现,还需要记录是在具体那几个通路中,那么我们其实只需要对上面的函数进行小小的修改即可:
path_coexist <- function(gene_1, gene_2){
gene_1_pathway = colnames(gene_path)[which(gene_path[gene_1,] == 1)]
gene_2_pathway = colnames(gene_path)[which(gene_path[gene_2,] == 1)]
inter_path = intersect(gene_1_pathway, gene_2_pathway)
inter_pathway_num = length(inter_path)
return(c(paste(inter_path, collapse = ";"),inter_pathway_num))
}
path_coexist("g1", "g4")
## [1] "p2;p3;p4;p6" "4"
话虽如此,我觉得我还是需要回炉重修一下线性代数.