2011-01-24 171 views
5

我在想知道其他人在用K-means集羣排序時正在做什麼。我正在製作熱圖(主要是ChIP-Seq數據),並使用自定義熱圖功能(基於R內建的熱圖功能)獲得漂亮的圖形。不過,我想要兩個改進。首先是根據遞減的平均值排序我的羣集。例如,下面的代碼:Kmeans集羣內部和集羣內訂購

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

手段?用於聚類或其他變量的變量之一? – 2011-01-26 22:15:09

+0

每個羣集中的值的含義。例如,如果每個集羣在data.frame中有30行,並且data.frame有10列,在這些列上執行k-means聚類,我想要在每個集羣中使用300個值的均值。也可以使用質心。 – 2011-01-28 06:05:54

回答

4

不是你問的問題的確切答案,但也許你可能會考慮系列化而不是k-均值聚類。它有點像協調而不是聚類,但最終的結果是連續數據的熱圖,聽起來與k-means後跟特定排序熱圖所顯示的相似。

有r包系列化,叫seriation,它有一個小插曲,你可以得到directly from CRAN

我會回答Q的細節一旦我編造了一個例子來試試。

好的 - 從上面的評論中正確的答案。首先一些虛擬數據 - 每個10個樣本的3個羣集,每個變量有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) 

產量:什麼

Original and reordered heatmaps