Расхождение между ветвями вырезки и кластера

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

Для этого я сначала создаю иерархический кластерный кластер следующим образом:

library("dendextend")
library("ggplot2")
library("reshape2")
data=read.csv("data.csv", header=T, row.names=1)
trimmed=data[, -ncol(data)]

 hc <- as.dendrogram(hclust(dist(trimmed)))
    labels.drk=data[,ncol(data)]
    groups.drk=labels.drk[order.dendrogram(hc)]
    genotypes=as.character(unique(data[,ncol(data)]))
    k=4
    cluster_cols=rainbow(k)

    hc <- hc %>%
      color_branches(k = k, col=cluster_cols) %>%

      set("branches_lwd", 1) %>%

      set("leaves_pch", rep(c(21, 19), length(genotypes))[groups.drk]) %>% 
      set("leaves_col", palette()[groups.drk]) 

    plot(hc, main="Total animals" ,horiz=T)

    legend("topleft", legend=genotypes,
           col=palette(), pch = rep(c(21,19), length(genotypes)),
           title="Genotypes")

    legend("bottomleft", legend=1:k,
           col=cluster_cols, lty = 1, lwd = 2,
           title="Drinking group")

Затем я использую функцию cutree, чтобы оценить, какое животное принадлежит к какой группе, чтобы построить график среднего потребления воды для каждой группы.

groups<-cutree(hc, k=k, order_clusters_as_data = FALSE))
x<-cbind(data,groups)
intake_avg=aggregate(data[, -ncol(data)], list(x$groups), mean, header=T)

df <- melt(intake_avg, id.vars = "Group.1")
ggplot(df, aes(variable, value, group=factor(Group.1))) + geom_line(aes(color=factor(Group.1)))

Проблема в том, что у меня несоответствие между числами, которые я получаю из иерархического кластера, и числом, присвоенным функцией cutree. В то время как кластер упорядочивает ветви снизу вверх от 1 до 4, функция cutree использует какой-то другой параметр упорядочения, с которым я не знаком. Из-за этого метки на кластерном графике и на графике потребления не совпадают.

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

Набор данных

Кластер: Кластер

График потребления График потребления


person Daniel da Silva    schedule 29.12.2017    source источник
comment
Бранчи [ sic ] обычно заказывают: завтрак ‹ поздний завтрак ‹ обед ‹ чай ‹ ужин. ГКНР.   -  person Has QUIT--Anony-Mousse    schedule 30.12.2017


Ответы (1)


Чтобы получить те же кластеры, нанесенные на дендрограмму, вам нужно использовать:

groups <- dendextend:::cutree(hc, k=k, order_clusters_as_data = FALSE)
idx <- match(rownames(data), names(groups))
x <- cbind(data,groups[idx])
intake_avg <- aggregate(data[, -ncol(data)], list(x$groups), mean, header=T)

df <- melt(intake_avg, id.vars = "Group.1")
ggplot(df, aes(variable, value, group=factor(Group.1))) + 
 geom_line(aes(color=factor(Group.1)), lwd=1)

Вот график потребления:

введите здесь описание изображения

person Marco Sandri    schedule 30.12.2017
comment
Привет, Марко, спасибо за ответ, но я все еще получаю неправильные группы. Теперь группы классифицируются только на основе порядка их появления в исходном наборе данных, а не на основе депрограммы. Любая подсказка? - person Daniel da Silva; 02.01.2018
comment
Привет, Марко, я использую тот же предыдущий код, который я опубликовал, но добавляю предложенную вами строку. Раньше классификация была верной, но присвоенные номера были перевернуты, теперь кластеры, созданные катри, отличаются от депрограммы. Это код, который я сейчас использую: pastebin.com/xYFxQrbb. - person Daniel da Silva; 02.01.2018
comment
Отлично, Марко! Большое спасибо. Очень элегантный подход. На самом деле это также было полезно для исправления другой ошибки, которую я получал в своем коде. Большое спасибо - person Daniel da Silva; 02.01.2018