2011-01-24 13 views
5

K-meansクラスタの順序付けで他の人が何をしているのか不思議です。ヒートマップ(主にChIP-Seqのデータ)を作成しており、カスタムヒートマップ関数(Rのヒートマップ関数をベースにしている)を使って見栄えの良い数字を得ています。しかし、私は2つの改善が欲しいです。 1つ目は、平均値の減少に基づいてクラスタを注文することです。たとえば、次のコード:Kamans interとintra intra cluster ordering

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つのクラスタがそれぞれの順番に並んでいるように行を並べる最良の方法は何ですか?

第2に、各クラスタ内の行を最高平均値から最低値に並べることをお勧めしますか?これは、データをより組織的に見せてくれるが、慎重ではない観察者を欺いて、おそらくないはずのものを推測するかもしれない。あなたがこれをお勧めするなら、あなたはそれを最も効率的にどのようにしますか?

+0

手段?クラスタリングなどに使用される変数の1つ? –

+0

各クラスタ内の値の意味。たとえば、各クラスタがdata.frameの30行で、data.frameにk-meansクラスタリングが実行される10の列がある場合、各クラスタの300の値の平均が必要です。重心を使用することもできます。 –

+0

セントロイドは各クラスタの番号ではなく、10-d空間内の点であるため、各クラスタの重心は10の座標を持ちます。 –

答えて

4

あなたが求めるものに対しては正確な答えはありませんが、k-meansクラスタリングの代わりにセリエーションを考慮する可能性があります。それはクラスタリングではなく序列に似ていますが、最終的な結果として、セリエートされたデータのヒートマップが得られます。

seriationのためのRパッケージがありますが、seriationと呼ばれ、それはあなたが、私がしようとする例を調理したら、私はQの詳細をお答えしますdirectly from CRAN

を得ることができますビネットを持っています。

上記のコメントから、適切な回答が続いています。最初にいくつかのダミーデータ - 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) 

収量:何の

Original and reordered heatmaps

+0

優秀!私はそれを試して、私が受け入れる前に私が問題に遭遇していないことを確認したい。戻ってくれてありがとう! –

+0

No probs @Ronあなたの質問を編集してコメントを投稿してみてください。私が好きなように私はそれを見ていきます。 –

+1

私はちょうど誰かがこれをやろうと私に来てくれましたが、結果を出していませんでした彼らは期待した。私たちは、 'mns < - c(0.18、0.19、-0.27、0.24、0.32、-0.05)'を持っているとしたら、 'order(order 'clus < - 1:6'なら' clus [order(mns)[clus])] 'は最後の2番目の要素を与え、 私たちはクラスタ平均のランクでデータをソートしたいのですが、それは古い答えですが、人々はまだ見ていますここでは –