在R中预先知道所有合并的情况下绘制树状图

62lalag4  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(238)

我希望使用R来绘制一个图,看起来像一个层次聚类树(树状图),除了在我的情况下,我已经知道哪些集群与哪些合并。

**示例:*假设我们有对象'a''b''c''d''e'。它们开始时是5个集群1,2,3,4和5。现在我想将1和2合并到一个新的集群(集群6),然后合并集群3和5(集群7),然后合并集群6和集群4(集群8) 并停止。然后这个树将由列表[ (1,2), (3,5), (6,4) ]指定。

希望描述足够清楚。这里基本上有两个子问题需要解决:

  • 从一个完全有监督的过程中生成一个聚类对象;
  • 在到达顶端之前将树状图剪掉;

如果后者对于一个问题来说太多了,你可以在回答中省略它。

7kqas0il

7kqas0il1#

下面是一个手动构造类“hclust”对象的尝试。
首先-检查此对象应该具有哪些属性:

fit <- hclust(dist(USArrests))
names(fit)
[1] "merge"   "height"  "order"   "labels"   "method"   "call"   "dist.method"

其次-检查所有这些中必须存在哪些信息:

help(hclust)
# read the section called "Values"

第三步-创建一个对象并添加合并信息:

obj <- list()
obj$merge <- rbind(c(-1, -2), c(-3, -5), c(-4, 1), c(2, 3))

注意事项:根据hclust()的帮助页面,merge应该是一个两列的矩阵,指定在每一步合并哪些对象。看起来它必须包括将所有组合并到一个最终树中的所有步骤,所以你可能无法中途停止(因为这将是3个独立的树)。负值表示叶子(即,c(-1,-2)指示在第一步骤合并观察1和2)。正值是指在先前步骤中获得的聚类(即,c(-4,1)指示在该步骤处,观察4与在步骤1处获得的聚类合并)。
第四-增加高度:

obj$height <- 1:4

注意:这保存了每个合并的合并高度。
第五-提供观察顺序:

obj$order  <- c(1,2,4,3,5)

注意:这是观察值在x轴上显示的顺序。需要这样才能使分支不重叠。您可以提供重叠的顺序,但最终的树状图图片看起来不会很漂亮。
第六-添加标签:

obj$labels <- 1:5

注意:这些是最后一棵树中叶子的名字。
第七-为我们的对象祝福一个类:

class(obj) <- "hclust"

注意:plot()函数需要选择合适的方法。
第八-绘制结果:

plot(obj, hang=-1)
rect(1, 2.5, 99, 99, col="white", border="white")

注意:hang参数使所有的叶子都在相同的y轴水平上,rect绘制了一个白色矩形,在视觉上隐藏了上面的树,这模仿了您的要求,即不要完全连接所有对象。
可能有更简单/更好的方法,但我不知道。

相关问题