web-dev-qa-db-ja.com

Rのヒートマップ/クラスタリングのデフォルトの違い(ヒートプロットとヒートマップ.2)

Rの樹形図でヒートマップを作成する2つの方法を比較しています。1つは_made4_のheatplotを使用し、もう1つは_heatmap.2_のgplotsを使用します。適切な結果は分析によって異なりますが、デフォルトが非常に異なる理由と、両方の関数を取得して同じ結果(または非常に類似した結果)を得る方法を理解しようとしているので、行くすべての「ブラックボックス」パラメータを理解しますこれに。

これはデータとパッケージの例です:

_require(gplots)
# made4 from bioconductor
require(made4)
data(khan)
data <- as.matrix(khan$train[1:30,])
_

Heatmap.2を使用してデータをクラスタリングすると、以下が得られます。

_heatmap.2(data, trace="none")
_

enter image description here

heatplotを使用すると、以下が得られます。

_heatplot(data)
_

enter image description here

最初は非常に異なる結果とスケーリングです。この場合heatplotの結果はより合理的に見えるので、_heatmap.2_には他の利点/機能があるので、_heatmap.2_に入力するパラメーターを理解して同じ結果を得たいと思います。不足している成分を理解したいので、使用したいと思います。

heatplotは相関距離を持つ平均リンケージを使用するので、それを_heatmap.2_に入力して、同様のクラスタリングが使用されるようにします(ベース: https://stat.ethz.ch/pipermail/bioconductor /2010-August/034757.html

_dist.pear <- function(x) as.dist(1-cor(t(x)))
hclust.ave <- function(x) hclust(x, method="average")
heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave)
_

その結果: enter image description here

これにより、行側の樹形図はより似たように見えますが、列は依然として異なり、縮尺も異なります。 heatplotはデフォルトで何らかの形で列をスケーリングするように見えますが、_heatmap.2_はデフォルトでそれを行いません。ヒートマップに行スケーリングを追加すると、次のようになります:

_heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave,scale="row")
_

enter image description here

まだ同一ではありませんが、近いです。 _heatmap.2_でheatplotの結果を再現するにはどうすればよいですか?違いは何ですか?

edit2:主な違いは、heatplotが以下を使用して行と列の両方でデータを再スケールすることです。

_if (dualScale) {
    print(paste("Data (original) range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
    data <- t(scale(t(data)))
    print(paste("Data (scale) range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
    data <- pmin(pmax(data, zlim[1]), zlim[2])
    print(paste("Data scaled to range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
}
_

これは、_heatmap.2_への呼び出しにインポートしようとしているものです。私が好きな理由は、zlimを_heatmap.2_に渡すだけで無視されるのに対して、低値と高値の間のコントラストが大きくなるためです。列に沿ったクラスタリングを維持しながら、この「デュアルスケーリング」を使用するにはどうすればよいですか?私が欲しいのは、あなたが得るコントラストの増加です:

heatplot(..., dualScale=TRUE, scale="none")

あなたが得る低コントラストと比較して:

heatplot(..., dualScale=FALSE, scale="row")

これに関するアイデアはありますか?

25
user248237

_heatmap.2_関数とheatplot関数の主な違いは次のとおりです。

  1. heatmap.2は、デフォルトとしてeuclideanメジャーを使用して距離行列を取得し、completeクラスタリングのための凝集法、ヒートプロットはcorrelation、およびaverage凝集を使用メソッド。

  2. heatmap.2は距離行列を計算し、スケーリングの前にクラスタリングアルゴリズムを実行しますが、heatplot(_dualScale=TRUE_の場合)は既にデータをスケーリングします。

  3. heatmap.2は、 here のように、行と列の平均値に基づいて樹状図を並べ替えます。

デフォルト設定(p。1)は、カスタムdistfunおよびhclustfun引数を指定することにより、heatmap.2内で簡単に変更できます。しかし、p。 2と3は、ソースコードを変更しないと簡単に対処できません。したがって、heatplot関数はheatmap.2のラッパーとして機能します。まず、必要な変換をデータに適用し、距離マトリックスを計算し、データをクラスター化し、heatmap.2機能を使用して、上記のパラメーターでヒートマップをプロットします。

ヒートプロット関数の_dualScale=TRUE_引数は、行ベースのセンタリングとスケーリング( 説明 )のみを適用します。次に、スケーリングされたデータの極値( description )をzlim値に再割り当てします。

_z <- t(scale(t(data)))
zlim <- c(-3,3)
z <- pmin(pmax(z, zlim[1]), zlim[2])
_

ヒートプロット関数からの出力を一致させるために、2つの解決策を提案したいと思います。

I-ソースコードに新しい機能を追加_-> heatmap.3_

コードは here にあります。リビジョンを自由に参照して、heatmap.2関数に加えられた変更を確認してください。要約すると、次のオプションを導入しました。

  • クラスタリングの前にzスコア変換が実行されます:scale=c("row","column")
  • スケーリングされたデータ内で極値を再割り当てできます:zlim=c(-3,3)
  • 樹状図の並べ替えをオフにするオプション:_reorder=FALSE_

例:

_# require(gtools)
# require(RColorBrewer)
cols <- colorRampPalette(brewer.pal(10, "RdBu"))(256)

distCor <- function(x) as.dist(1-cor(t(x)))
hclustAvg <- function(x) hclust(x, method="average")

heatmap.3(data, trace="none", scale="row", zlim=c(-3,3), reorder=FALSE,
          distfun=distCor, hclustfun=hclustAvg, col=rev(cols), symbreak=FALSE) 
_

enter image description here


II-_heatmap.2_に必要なすべての引数を提供する関数を定義する

元のヒートマップ2を使用する場合、zClust関数(下)はヒートプロットによって実行されるすべてのステップを再現します。スケーリングされたデータ行列、行および列の樹状図を(リスト形式で)提供します。これらは、heatmap.2関数への入力として使用できます。

_# depending on the analysis, the data can be centered and scaled by row or column. 
# default parameters correspond to the ones in the heatplot function. 
distCor <- function(x) as.dist(1-cor(x))
zClust <- function(x, scale="row", zlim=c(-3,3), method="average") {
    if (scale=="row") z <- t(scale(t(x)))
    if (scale=="col") z <- scale(x)
    z <- pmin(pmax(z, zlim[1]), zlim[2])
    hcl_row <- hclust(distCor(t(z)), method=method)
    hcl_col <- hclust(distCor(z), method=method)
    return(list(data=z, Rowv=as.dendrogram(hcl_row), Colv=as.dendrogram(hcl_col)))
}

z <- zClust(data)

# require(RColorBrewer)
cols <- colorRampPalette(brewer.pal(10, "RdBu"))(256)

heatmap.2(z$data, trace='none', col=rev(cols), Rowv=z$Rowv, Colv=z$Colv)
_

heatmap.2(3)機能に関する追加コメント:

  • _symbreak=TRUE_は、スケーリングが適用されるときに推奨されます。カラースケールを調整するので、0付近で壊れます。現在の例では、負の値=青、正の値=赤です。
  • col=bluered(256)は代替のカラーリングソリューションを提供する場合があり、RColorBrewerライブラリを必要としません。
38
TWL