R строит верхнюю дендрограмму на основе k
Я кластеризовал матрицу расстояний на основе данных столбца 20000 x 169 в R, используя hclust(). Когда я преобразовываю кластерный объект в дендрограмму и строю всю дендрограмму, ее трудно читать, потому что она очень большая, даже если я вывожу ее в довольно большой PDF-файл.
df <- as.data.frame(matrix(abs(rnorm(3380000)), nrow = 20000))
mydist <- vegdist(df)
my.hc <- hclust(mydist, method = "average")
hcd <- as.dendrogram(my.hc)
pdf("hclust_plot.pdf", width = 40, height = 15)
plot(hcd)
dev.off()
Я хотел бы указать количество кластеров (k) для обрезания дендрограммы, а затем нанести только верхнюю часть дендрограммы над k точками разделения. Я знаю, что могу построить верхнюю часть на основе указания высоты (h) с помощью функции cut().
pdf("hclust_plot2.pdf", width = 40, height = 15)
plot(cut(hcd, h = 0.99)$upper)
dev.off()
Я также знаю, что могу использовать пакет dendextend, чтобы раскрасить график дендрограммы с помощью k групп.
library(dendextend)
pdf("hclust_plot3.pdf", width = 40, height = 15)
plot(color_branches(hcd, k = 44))
dev.off()
Но для моего набора данных эта дендрограмма слишком плотная, чтобы даже прочитать, какая группа какого цвета. Есть ли способ построить только верхнюю часть дендрограммы выше точки разреза, указав k, а не h? Или есть способ получить значение h для дендрограммы при заданном k?
1 ответ
Вы можете использовать heights_per_k.dendrogram
Функция из пакета dendextend, чтобы получить высоту для различных k сокращений.
Например:
## Not run:
hc <- hclust(dist(USArrests[1:4,]), "ave")
dend <- as.dendrogram(hc)
library(dendextend)
dend_h <- heights_per_k.dendrogram(dend)
par(mfrow = c(1,2))
plot(dend)
plot(dend, ylim = c(dend_h["3"], dend_h["1"]))
И в вашем случае:
set.seed(2016-01-16)
df <- as.data.frame(matrix(abs(rnorm(2*20000)), nrow = 20000))
mydist <- dist(df)
my.hc <- hclust(mydist, method = "average")
hcd <- as.dendrogram(my.hc)
library(dendextend)
library(dendextendRcpp)
dend_h <- heights_per_k.dendrogram(hcd) # (this can take some time)
plot(hcd, ylim = c(dend_h["43"], dend_h["1"]))