我想知道其他人在使用K-means集群排序做了什么。我正在制作热图(主要是ChIP-Seq数据)并使用自定义热图功能(基于R的内置热图功能)获得漂亮的数字。但是,我想要两个改进。第一种是根据平均值递减来订购我的集群。例如,以下代码:
fit = kmeans(data, 8, iter.max=50, nstart=10)
d = data.frame(data, symbol)
d = data.frame(d, fit$cluster)
d = d[order(d$fit.cluster),]
给我一个在群集列上排序的data.frame。订购行的最佳方法是什么,以便8个聚类按其各自的方式排序?
其次,您是否建议将每个群集中的行从最高平均值排序到最低?这将对数据进行更有条理的观察,但可能会欺骗一个非谨慎的观察者来推断他可能不应该做的事情。如果你的确推荐这个,你会如何最有效地做到这一点?
答案 0 :(得分:4)
不是你问的确切答案,但也许你可能会考虑连续而不是k-means聚类。它有点像排序而不是聚类,但最终的结果是系列化数据的热图,听起来类似于你用k-means做的事情,后面跟着一个特别有序的热图。
有一个用于连载的R包,名为seriation
,它有一个小插图,你可以得到directly from CRAN
一旦我尝试了一个例子,我会回答Q的具体细节。
好的 - 从上面的评论中得到正确答案。首先是一些虚拟数据 - 在3个变量的每一个上,每个10个样本的3个集群。
set.seed(1)
dat <- data.frame(A = c(rnorm(10, 2), rnorm(10, -2), rnorm(10, -2)),
B = c(rnorm(10, 0), rnorm(10, 5), rnorm(10, -2)),
C = c(rnorm(10, 0), rnorm(10, 0), rnorm(10, -10)))
## randomise the rows
dat <- dat[sample(nrow(dat)),]
clus <- kmeans(scale(dat, scale = FALSE), centers = 3, iter.max = 50,
nstart = 10)
## means of n points in each cluster
mns <- sapply(split(dat, clus$cluster), function(x) mean(unlist(x)))
## order the data by cluster with clusters ordered by `mns`, low to high
dat2 <- do.call("rbind", split(dat, clus$cluster)[order(mns)])
## heatmaps
## original first, then reordered:
layout(matrix(1:2, ncol = 2))
image(1:3, 1:30, t(data.matrix(dat)), ylab = "Observations",
xlab = "Variables", xaxt = "n", main = "Original")
axis(1, at = 1:3)
image(1:3, 1:30, t(data.matrix(dat2)), ylab = "Observations",
xlab = "Variables", xaxt = "n", main = "Reordered")
axis(1, at = 1:3)
layout(1)
产量: