Как использовать 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)


arrow_upward
0
arrow_downward

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

person Matthias Studer    schedule 20.06.2016

arrow_upward
1
arrow_downward

Если вы можете обойтись более простым решением, просто умножьте веса на исходную матрицу, таким образом придав им больший вес. Я не уверен на 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