2016-06-17 5 views
2

TL; DR:WeightedClusterライブラリー(特にwcKMedoids()メソッド)をheatmap,heatmap.2などの入力として使用してクラスタリング情報を提供する方法?WeightedCluster :: wcKeditを使用してRのヒートマップまたはヒートマップのクラスタリングを提供する方法。


我々はRで(はい/いいえ値は、1とゼロとして表されていない)いくつかのバイナリデータからヒートマップを作成し、列ベースのクラスタリングの行の一部の重みを調整する必要があります。

(これらは多項選択カテゴリから生成され、複数のバイナリのイエス/ノーバリューの行になり、オーバー表現されます)。

私はWeightedClusterライブラリを見つけました。このライブラリは重み付きクラスタリングが可能です。

今質問は、heatmap,heatmap.2などの入力としてこのライブラリ(特にwcKMedoids()メソッド)を使用する方法ですか?

私は以下のエラーメッセージになり、次のコードは、試してみました:

library(gplots) 
library(WeightedCluster) 

dataset <- " 
F,T1,T2,T3,T4,T5,T6,T7,T8 
A,1,1,0,1,1,1,1,1 
B,1,0,1,0,1,0,1,1 
C,1,1,1,1,1,1,1,0 
D,1,1,1,0,1,1,1,0 
E,0,1,0,0,1,0,1,0 
F,0,0,1,0,0,0,0,0 
G,1,1,1,0,1,1,1,1 
H,1,1,0,0,0,0,0,0 
I,1,0,1,0,0,1,0,0 
J,1,1,1,0,0,0,0,1 
K,1,0,0,0,1,1,1,1 
L,1,1,1,0,1,1,1,1 
M,0,1,1,1,1,1,1,1 
N,1,1,1,0,1,1,1,1" 
fakefile <- textConnection(dataset) 

d <- read.csv(fakefile, header=T, row.names = 1) 

weights <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1) 

distf <- function(x) dist(x, method="binary") 
wclustf <- function(x) wcKMedoids(distf(x), 
           k=8, 
           weights=weights, 
           npass = 1, 
           initialclust=NULL, 
           method="PAMonce", 
           cluster.only = FALSE, 
           debuglevel=0) 

cluster_colors <- colorRampPalette(c("red", "green"))(256); 
heatmap(as.matrix(d), 
     col=cluster_colors, 
     distfun = distf, 
     hclustfun = wclustf, 
     keep.dendro = F, 
     margins=c(10,16), 
     scale="none") 

をしかし、実行していることができます:

Error in UseMethod("as.dendrogram") : 
    no applicable method for 'as.dendrogram' applied to an object of class "c('kmedoids', 'list')" 

どうやら、wcKMedoidsはないドロップインの代替Rさんですhclust、しかし、誰もそれを回避する方法についていくつかの指針を持っていますか?

UPDATE:私がこれまでに作った小さな進歩は、私がhclust(dist(x))と同様の出力を生成する方法as.dendrogram.kmedoidsを実装する必要があることを示しています。 (出力はdputdput(hclust(dist(x)))で詳細に調べることができます)。アイデアとポインタは大歓迎です。

+1

私がオフトピックとして、この質問を閉じるために投票しています。 – gung

+0

@gungこれで申し訳ありません(Rの新機能、やり方)、コードサンプルを完全に自己完結型で再現性のあるものにしました! –

答えて

0

これはできません。 K-Medoidクラスタリングは、区分方法であり、階層的クラスタリングではない。樹状図は、階層的クラスタリングアルゴリズムにとってのみ意味があります。

+0

@MathiasStuderこの情報のおかげで多くの! –

1

より簡単な解決策をとることができれば、元のマトリックスに重みを掛けるだけで、より大きな重みを与えることができます。私はこれを行う統計的に正しい方法であることを100%確信しているわけではありませんが、達成したいことに応じて仕事をするかもしれません。

# Create the dataset 
dataset <- matrix(
    dimnames = list(LETTERS[seq(from = 1, to = 14)], c("T1","T2","T3","T4","T5","T6","T7","T8")), 
    data = c(1,1,0,1,1,1,1,1, 
      1,0,1,0,1,0,1,1, 
      1,1,1,1,1,1,1,0, 
      1,1,1,0,1,1,1,0, 
      0,1,0,0,1,0,1,0, 
      0,0,1,0,0,0,0,0, 
      1,1,1,0,1,1,1,1, 
      1,1,0,0,0,0,0,0, 
      1,0,1,0,0,1,0,0, 
      1,1,1,0,0,0,0,1, 
      1,0,0,0,1,1,1,1, 
      1,1,1,0,1,1,1,1, 
      0,1,1,1,1,1,1,1, 
      1,1,1,0,1,1,1,1), 
    ncol=8, 
    nrow=14) 

# Assign weights to the different columns 
col.weights <- c(2,3,1,1,1,1,1,1) 

# Transform the original matrix with the weights 
# you want to assign to each column. 
create.weights.matrix <- function(weights, rows) { 
    sapply(weights, function(x){rep(x, rows)}) 
} 
weights.matrix <- create.weights.matrix(col.weights, nrow(dataset)) 
d.weighted <- weights.matrix * dataset 

# Create the plot 
cluster_colors <- colorRampPalette(c("red", "green"))(256); 
heatmap(as.matrix(d.weighted), 
     col=cluster_colors, 
     keep.dendro = F, 
     margins=c(10,16), 
     scale="none") 

結果として、これはあなたにこのような何かを与える:それは再現性の例なしRを使用する方法についてですので

heatmap with weights

+0

多くの感謝@ヨハン! –

関連する問題