30

R のデンドログラムを使用してヒートマップを作成する 2 つの方法を比較しています。1 つは で、made4もうheatplot1 つはgplotsofheatmap.2です。適切な結果は分析によって異なりますが、デフォルトが非常に異なる理由と、両方の関数が同じ結果 (または非常に類似した結果) を与える方法を理解しようとしています。これに。

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

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

heatmap.2 を使用してデータをクラスター化すると、次のようになります。

heatmap.2(data, trace="none")

ここに画像の説明を入力

を使用すると、次のようになりheatplotます。

heatplot(data)

ここに画像の説明を入力

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

heatplot相関距離との平​​均リンケージを使用するため、同様のクラスタリングが使用されるようにフィードできます( https://stat.ethz.ch/pipermail/bioconductor/2010-August/034757.htmlheatmap.2に基づく) 。

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)

その結果: ここに画像の説明を入力

これにより、行側のデンドログラムはより似たものになりますが、列は依然として異なり、スケールも異なります。デフォルトでは列をheatplotスケーリングheatmap.2しないように見えます。行スケーリングを heatmap.2 に追加すると、次のようになります。

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

ここに画像の説明を入力

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

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。私が気に入っている理由は、低い値と高い値の間のコントラストが大きくなるためです。一方、に渡すだけzlimheatmap.2は無視されます。列に沿ったクラスタリングを維持しながら、この「デュアルスケーリング」を使用するにはどうすればよいですか? 私が望むのは、あなたが得るコントラストの増加だけです:

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

得られる低コントラストと比較して:

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

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

4

1 に答える 1

42

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

  1. heatmap.2 では、デフォルトでユークリッド測度を使用して距離行列を取得し、クラスタリングに完全な凝集法を使用しますが、heatplot はそれぞれ相関法と平均凝集法を使用します。

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

  3. heatmap.2 は、こちらで説明されているように、行と列の平均値に基づいてデンドログラムを並べ替えます。

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

dualScale=TRUEheatplot 関数の引数は、行ベースのセンタリングとスケーリング ( description ) のみを適用します。次に、スケーリングされたデータの極値 ( descriptionzlim ) を値に再割り当てします。

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

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

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

コードはここにあります。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) 

ここに画像の説明を入力


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

元の heatmap.2 を使用する場合は、zClust関数 (以下) が heatplot によって実行されるすべてのステップを再現します。スケーリングされたデータ マトリックス、行と列のデンドログラムを (リスト形式で) 提供します。これらは 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 ライブラリは必要ありません。
于 2013-12-04T08:01:43.833 に答える