如何从 R 中的多个基因列表生成相似性分数热图

How to generate similarity scores heatmap from multiple gene lists in R

问题
我有一个包含 19 种不同肿瘤类型的融合数据框,每种类型都有相关的标记基因。我想可视化肿瘤类型之间的相似性,看看它们是如何聚集的。我有一个解决这个问题的计划,但似乎应该是一个更简单的方法。

虚拟数据

>df <- data.frame(tumor_type = c("tumor1", "tumor1", "tumor1", "tumor2", "tumor2", "tumor3", "tumor4", "tumor4"), genes = c("geneA", "geneB", "geneC", "geneA", "geneD", "geneD", "geneA", "geneD"))

>df
tumor_type  genes
tumor1      geneA
tumor1      geneB
tumor1      geneC
tumor2      geneA
tumor2      geneD
tumor3      geneD
tumor4      geneA
tumor4      geneD

建议的解决方案
1) 将融化的数据框分解为单个肿瘤列表
2) 计算所有肿瘤组合之间的成对相似性分数。我将不得不使用 (intersect(tumor1, tumor2)/(intersect(tumor1, tumor2) + setdiff(tumor1, tumor2) + setdiff(tumor2, tumor1))*100.
做一些 for 循环 应该得到如下矩阵:

>dfmatrix
       tumor1   tumor2   tumor3   tumor4
tumor1    100       25        0       25
tumor2     25      100       50       50
tumor3      0       50      100       50  
tumor4     25       50       50      100

3) 然后我会做一个标准的热图

我需要帮助来弄清楚各个组件(比如如何执行循环来进行所有成对比较),但我认为我应该从更高的层次开始,以确保我之前对这个过程的想法是正确的问了一堆关于细节的不同问题。

这是一个非常简化的解决方案,可能只是为了探索数据。您将问题简化为以二进制方式询问哪个基因与每个肿瘤相关:

table(df$tumor_type,df$genes)
         geneA geneB geneC geneD
  tumor1     1     1     1     0
  tumor2     1     0     0     1
  tumor3     0     0     0     1
  tumor4     1     0     0     1

然后我们可以使用 dist:

使用成对距离
D = dist(table(df$tumor_type,df$genes),method="binary")
       tumor1 tumor2 tumor3
tumor2   0.75              
tumor3   1.00   0.50       
tumor4   0.75   0.00   0.50

或者如果您更喜欢其他尺寸,您可以这样做:

library(ade4)
D = dist.binary(unclass(table(df$tumor_type,df$genes)),method=1)

然后只想象 1 个距离

library(pheatmap)
pheatmap(1-as.matrix(D))

假设“19种不同的肿瘤类型”可以表示为19个样本,这样你就可以创建一个n_genes x 19的表达矩阵,你可以使用dcast来生成矩阵,然后生成成对相关热图。

您可能需要考虑处理缺失数据的方法以获得适当的相似度分数。

假设一个完整的矩阵,你可以只使用 dist 函数,例如:

library(data.table)
library(pheatmap)

# mock data
set.seed(1)
mat <- matrix(
    stats::runif(1000, 3, 14),
    nrow = 100,
    ncol = 10,
    dimnames = list(paste0("gene", 1:100), paste0("Sample", 1:10))
)
modmat <- base::sample(1:100, 30)
mat[modmat, 1:5] <- mat[modmat, 1:5] + stats::runif(150, 4, 6)
MAT <- melt(data.table(mat, keep.rownames = TRUE), id.vars = "rn")
# MAT would correspond to your melted data.frame, after setDT(your.df)

mat <- as.matrix(dcast(MAT, rn ~ variable), rownames = 1)
cmat <- as.matrix(dist(t(mat), diag=TRUE, upper=TRUE))

pheatmap(cmat)

reprex package (v0.3.0)

于 2020-04-09 创建