Как использовать WeightedCluster::wcKMedoids для обеспечения кластеризации для тепловой карты или тепловой карты.2 в R?

TL;DR: Как использовать библиотеку WeightedCluster (в частности, метод wcKMedoids()) в качестве входных данных для heatmap, heatmap.2 или подобных, чтобы предоставить ей информацию о кластеризации?


Мы создаем тепловую карту из некоторых двоичных данных (значения да/нет, представленные в виде единиц и нулей) в R, и нам нужно настроить веса некоторых строк для кластеризации на основе столбцов.

(они генерируются из категорий с множественным выбором в несколько двоичных строк со значением «да/нет» и, таким образом, перепредставлены).

Я нашел библиотеку WeightedCluster, которая может выполнять кластеризацию с весами.

Теперь вопрос в том, как использовать эту библиотеку (в частности, метод wcKMedoids()) в качестве входных данных для heatmap, heatmap.2 или подобных?

Я пробовал следующий код, который приводит к сообщению об ошибке ниже:

library(gplots)
library(WeightedCluster)

dataset <- "
F,T1,T2,T3,T4,T5,T6,T7,T8
A,1,1,0,1,1,1,1,1
B,1,0,1,0,1,0,1,1
C,1,1,1,1,1,1,1,0
D,1,1,1,0,1,1,1,0
E,0,1,0,0,1,0,1,0
F,0,0,1,0,0,0,0,0
G,1,1,1,0,1,1,1,1
H,1,1,0,0,0,0,0,0
I,1,0,1,0,0,1,0,0
J,1,1,1,0,0,0,0,1
K,1,0,0,0,1,1,1,1
L,1,1,1,0,1,1,1,1
M,0,1,1,1,1,1,1,1
N,1,1,1,0,1,1,1,1"
fakefile <- textConnection(dataset)

d <- read.csv(fakefile, header=T, row.names = 1)

weights <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1)

distf <- function(x) dist(x, method="binary")
wclustf <- function(x) wcKMedoids(distf(x), 
                                 k=8, 
                                 weights=weights, 
                                 npass = 1, 
                                 initialclust=NULL, 
                                 method="PAMonce", 
                                 cluster.only = FALSE, 
                                 debuglevel=0)

cluster_colors <- colorRampPalette(c("red", "green"))(256);
heatmap(as.matrix(d), 
        col=cluster_colors,
        distfun = distf,
        hclustfun = wclustf,
        keep.dendro = F,
        margins=c(10,16),
        scale="none")

Но запуск дает:

Error in UseMethod("as.dendrogram") : 
  no applicable method for 'as.dendrogram' applied to an object of class "c('kmedoids', 'list')"

По-видимому, wcKMedoids не является заменой R hclust, но кто-нибудь может подсказать, как это обойти?

ОБНОВЛЕНИЕ: Небольшой прогресс, которого я добился до сих пор, указывает на то, что я должен реализовать метод as.dendrogram.kmedoids, который выдает результат, аналогичный hclust(dist(x)). (Его вывод можно подробно проверить с помощью dput: dput(hclust(dist(x)))). Идеи и указатели приветствуются.


person Samuel Lampa    schedule 17.06.2016    source источник
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что речь идет о том, как использовать R без воспроизводимого примера.   -  person gung - Reinstate Monica    schedule 17.06.2016
comment
@gung Извините за это (немного новое для R и как это делать), теперь сделал пример кода полностью автономным и воспроизводимым!   -  person Samuel Lampa    schedule 17.06.2016


Ответы (2)


Этого нельзя делать. Кластеризация K-Medoid — это метод разделения, а не иерархический. Дендограмма имеет смысл только для алгоритмов иерархической кластеризации.

person Matthias Studer    schedule 20.06.2016

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

# Create the dataset
dataset <- matrix(
  dimnames = list(LETTERS[seq( from = 1, to = 14 )], c("T1","T2","T3","T4","T5","T6","T7","T8")),
  data = c(1,1,0,1,1,1,1,1,
           1,0,1,0,1,0,1,1,
           1,1,1,1,1,1,1,0,
           1,1,1,0,1,1,1,0,
           0,1,0,0,1,0,1,0,
           0,0,1,0,0,0,0,0,
           1,1,1,0,1,1,1,1,
           1,1,0,0,0,0,0,0,
           1,0,1,0,0,1,0,0,
           1,1,1,0,0,0,0,1,
           1,0,0,0,1,1,1,1,
           1,1,1,0,1,1,1,1,
           0,1,1,1,1,1,1,1,
           1,1,1,0,1,1,1,1),
  ncol=8,
  nrow=14)

# Assign weights to the different columns
col.weights <- c(2,3,1,1,1,1,1,1)

# Transform the original matrix with the weights
# you want to assign to each column.
create.weights.matrix <- function(weights, rows) {
  sapply(weights, function(x){rep(x, rows)})
}
weights.matrix <- create.weights.matrix(col.weights, nrow(dataset))
d.weighted <- weights.matrix * dataset

# Create the plot
cluster_colors <- colorRampPalette(c("red", "green"))(256);
heatmap(as.matrix(d.weighted), 
        col=cluster_colors,
        keep.dendro = F,
        margins=c(10,16),
        scale="none")

Это даст вам что-то вроде этого в результате:

тепловая карта с весами

person Johan    schedule 20.06.2016