如何在R中为heatmap.2手动创建树形图矩阵?

时间:2014-02-18 23:22:05

标签: r cluster-analysis

以下是gplots::heatmap.2创建的热图的示例:

df<-data.frame(x1=rnorm(100),x2=rnorm(100,2,3),x3=rnorm(100,10,1),
           y1=rnorm(100,5,1),y2=rnorm(100,20,5),y3=rnorm(100,30,2))
cor<-cor(df)

require(gplots)
heatmap.2(cor,trace="none",col=bluered)#fig1
heatmap.2(cor,Rowv=F,Colv=F,dendrogram="none",trace="none",col=bluered)#fig2

我想在图2中创建一个树形图,其中Xs手动分组在一起以及Ys,这样我就可以将相关数字与fig1进行比较,其中树形图是使用距离计算的。有人知道怎么做吗?

1 个答案:

答案 0 :(得分:1)

您可以手动创建树状图对象,但对我来说,问题还有一点不清楚为什么图2中需要这些信息。如果树形图将所有x和y组合在一起作为单独的组,则添加到图2中,树状图的分​​支将相互交叉,并使树形图(使用真实的分支长度或高度)不可读。如果添加了使用一些合适高度的树形图,则树形图分支长度没有意义(它们与实际相关系数不对应),但树形图仍然告诉树的分支顺序。

无论如何,这里是如何从技术上解决这个问题(另请参阅Aniko's answer类似的问题,详情可在那里找到。)

一个hclust对象(a),它使用“真实”(我快速计算它们,所以它们可能不完全正确,请使用具有平均链接的层次聚类算法来检查,如果需要)分支长度可以通过手:

a<-list()
a$merge<-matrix(c(-1, -2,
                  -4, -5,
                  -3, 1,
                  -6, 2,
                  3, 4), ncol=2, byrow=TRUE)
a$height<-c(0.1, 0.12, 0.12, 0.045, 0.1)
a$order<-1:6
a$labels<-c("x1", "x2", "x3", "y1", "y2", "y3")
class(a)<-"hclust"

或者通过使用一些合适的分支长度来获得树形图:

b<-list()
b$merge<-matrix(c(-1, -2,
                  -4, -5,
                  -3, 1,
                  -6, 2,
                  3, 4), ncol=2, byrow=TRUE)
b$height<-c(0.1, 0.1, 0.1, 0.1, 0.2)
b$order<-1:6
b$labels<-c("x1", "x2", "x3", "y1", "y2", "y3")
class(b)<-"hclust"

之后,最终的情节可以生成为:

heatmap.2(cor,Rowv=as.dendrogram(a),Colv=as.dendrogram(a),trace="none",col=bluered)#fig2

或:

heatmap.2(cor,Rowv=as.dendrogram(b),Colv=as.dendrogram(b),trace="none",col=bluered)#fig2