Как создать тепловую карту оценок сходства из нескольких списков генов в R - PullRequest
1 голос
/ 09 апреля 2020

Проблема
У меня есть расплавленный кадр данных 19 различных типов опухолей, каждый из которых связан с маркерными генами. Я хочу визуализировать сходство между типами опухолей, чтобы увидеть, как они группируются. У меня есть план для решения этой проблемы, но кажется, что должен быть более простым способом.

Dummy Data

>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) Рассчитать попарные оценки сходства между всеми комбинациями опухолей. Мне придется сделать что-то вроде l oop, используя (пересекаются (опухоль1, опухоль2) / (пересекаются (опухоль1, опухоль2) + setdiff (опухоль1, опухоль2) + setdiff (опухоль2, опухоль1)) * 100.
Должен получить матрицу, такую ​​как:

>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) Затем я сделаю стандартную тепловую карту

Мне понадобится помощь в выяснении отдельных компонентов (например, как сделать l * 1025). * делать все парные сравнения), но я подумал, что мне следует начать с более высокого уровня, чтобы убедиться, что мои мысли об этом процессе верны, прежде чем задавать кучу разных вопросов по деталям.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Предполагая, что "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)

Создано в 2020-04-09 пакетом представить (v0.3.0)

1 голос
/ 09 апреля 2020

Это очень упрощенное решение, может быть, просто для изучения данных. Вы упрощаете задачу, спрашивая, какой ген связан с каждой опухолью, в двоичном виде:

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))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...