Pheatmap: сделать иерархическую кластеризацию на полной матрице, но отображать только подмножество строк

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

# Random data

full_mat <- matrix(rgamma(1000, shape = 1) * 5, ncol = 50)
reduced_mat <- full_mat[1:5,]

# Function to calculate distances on full-matrix and make dendrogram
cl_cb <- function(hcl, mat){
    # Recalculate manhattan distances for reorder method
    dists <- dist(full_mat, method = "manhattan")

    # Perform reordering according to OLO or GW method
    hclust_olo <- reorder(hcl, dists, method="GW")
    return(hclust_olo)
}

# Only display the reduced matrix (same columns but fewer rows)
p <- pheatmap(reduced_mat, 
         show_rownames=TRUE, 
         show_colnames = TRUE,
         cluster_cols=T,
         cluster_rows=F,
         scale = "none",
         clustering_callback = cl_cb
         )

Я попытался установить cluster_cols = F, но тогда дендограмма или переупорядочение вообще не выполняются.


person arvchi    schedule 20.02.2019    source источник


Ответы (1)


Попробуйте вместо этого использовать функцию heatmap.2. Установите его, если у вас его еще нет.

После этого выполните следующее:

 heatmap.2(reduced_mat, dendrogram = "both", labRow=row.names(reduced_mat), 
                        labCol=colnames(reduced_mat), Colv = FALSE, Rowv = FALSE)

#If you want to only show row or col dendrogram, change dendrogram = "both" to dendrogram = "column" (or "row")

Он по-прежнему будет создавать дендрограмму на основе подмножества набора данных, однако он не должен изменять порядок используемой матрицы. Если я правильно понимаю, это то, что вы хотите.

Если вы предоставите воспроизводимый пример, используя dput(), я мог бы попробовать это сам.

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

dev.copy(jpeg,filename="plot.jpg")
dev.off ()

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

Однако, как упоминалось в моем комментарии, это не «настоящая» дендрограмма подмножества набора данных, а скорее «фрагмент» исходной тепловой карты.

Дайте мне знать, если это сработает!

person h3ab74    schedule 20.02.2019
comment
Спасибо! Еще не пробовал, но, судя по вашему описанию, получится новая дендрограмма. Я хочу использовать ту же дендрограмму, что и на полной матрице. То есть кластеризация должна основываться на полной матрице, тогда как функция тепловой карты просто отображает экспрессию каждого гена. - person arvchi; 20.02.2019
comment
Хорошо я понял. Честно говоря, я не знаю, возможно ли то, о чем вы просите, потому что тогда вы не создаете настоящую дендрограмму из предоставленных данных. - person h3ab74; 20.02.2019
comment
Просто предоставил обходной путь для вашей проблемы, отредактировав исходный пост ^ - person h3ab74; 20.02.2019