聚类(hclust)分支和剪切标记

问题描述 投票:0回答:1

我是集群新手。 我想将彼此具有良好相关性的系列聚类在一起。 从一个例子开始:

set.seed(0)

r1 <- rnorm(1000)
r2 <- rnorm(1000)
e <- rnorm(1000)

d <- data.frame(r1=r1, r2=r2, e=e, r4=rnorm(1000), r.is.r1=r1, 
                r.is.almost.r1=r1 + rnorm(1000)/100, 
                r12=r1*0.75 + r2*0.25, 
                r21=r1*0.25 + r2*0.75, r21e=r1*0.25 + r2*0.75 + e/10,
                r21ee=r1*0.25 + r2*0.75 + e/2 )

print(round(cor(d), 2))

plot(hclust(dist(t(d)), method="centroid"))

有以下相关性

                  r1    r2     e    r4 r.is.r1 r.is.almost.r1   r12   r21  r21e r21ee
r1              1.00 -0.01  0.01 -0.05    1.00           1.00  0.94  0.30  0.29  0.26
r2             -0.01  1.00  0.02 -0.02   -0.01          -0.01  0.32  0.95  0.94  0.82
e               0.01  0.02  1.00 -0.01    0.01           0.01  0.02  0.02  0.14  0.52
r4             -0.05 -0.02 -0.01  1.00   -0.05          -0.05 -0.05 -0.04 -0.04 -0.03
r.is.r1         1.00 -0.01  0.01 -0.05    1.00           1.00  0.94  0.30  0.29  0.26
r.is.almost.r1  1.00 -0.01  0.01 -0.05    1.00           1.00  0.94  0.30  0.29  0.26
r12             0.94  0.32  0.02 -0.05    0.94           0.94  1.00  0.59  0.59  0.51
r21             0.30  0.95  0.02 -0.04    0.30           0.30  0.59  1.00  0.99  0.87
r21e            0.29  0.94  0.14 -0.04    0.29           0.29  0.59  0.99  1.00  0.92
r21ee           0.26  0.82  0.52 -0.03    0.26           0.26  0.51  0.87  0.92  1.00

cluster example

直观上看起来不错(除了负相关性[如

r4
e
]不应该连接,但我可以忍受它;很想杀死它)。 我真的不明白高度是什么,除了相关性更强的序列具有更低的高度并且完美的相关性为零之外。

我对这个图的第一个愿望是在树根上用小写字母来衡量相关性——例如,r1 和 r.is.r1 之间的

100%
。 这可能吗?

我的第二个愿望是砍掉这棵树(例如,只留下

r4
e
r12
r21ee
r2
加上两个簇,A是
r.is.almost.r1,r1,r.is.r1
,B是
r21,r21e
)并命名末端分支(我的实际应用程序有数百个系列,所以我需要剪切它。)

不知何故,情节需要决定我想把 A 中的三个系列或 B 中的两个系列中的哪一个放在分支末端。 一种选择是将

paste
所有三个组合成一根绳子,这适用于小树。 另一种选择是找出集群中我的系列中哪一个看起来最“中心”,然后直接说出那个系列的名称。 最后一个选择是我将某些系列指定为比其他系列更好的名称(例如,优先命名
r1
而不是
r.is.r1
r.is.almost.r1

我希望这是两个简单的问题...

r dendrogram hclust
1个回答
0
投票

应该有一种更简单的方法,但这里是树上的高度图。
我不确定你想如何衡量相关性。 高度为 0 意味着完美的相关性,但对于距离很远的点,高度可能会变得非常大。 也许您可以使用 0 或 min(cluster$height) 到 max(cluster$height) 的范围来缩放它。

对于第二部分,砍伐或修剪树木的标准尚不清楚。也许是

cuttree()
功能?
这应该提供一个开始。

set.seed(0)

r1 <- rnorm(1000)
r2 <- rnorm(1000)
e <- rnorm(1000)

d <- data.frame(r1=r1, r2=r2, e=e, r4=rnorm(1000), r.is.r1=r1, 
                r.is.almost.r1=r1 + rnorm(1000)/100, 
                r12=r1*0.75 + r2*0.25, 
                r21=r1*0.25 + r2*0.75, r21e=r1*0.25 + r2*0.75 + e/10,
                r21ee=r1*0.25 + r2*0.75 + e/2 )

print(round(cor(d), 2))

cluster <- hclust(dist(t(d)), method="centroid")
plot(cluster)

#calculate the locations of the labels
distance <- as.data.frame(cluster$merge)
for(i in 1:9) {
      if(distance$V1[i] <0){
         d1 <- which( names(d)[cluster$order] %in% names(d)[abs(distance$V1[i])]) 
      }
      else
      { d1 <- distance$loc[distance$V1[i]]  }
      
      if(distance$V2[i] <0){
         d2 <- which( names(d)[cluster$order] %in% names(d)[abs(distance$V2[i])]) 
      }
      else
      { d2 <- distance$loc[distance$V2[i]] }
      distance$loc[i] <- mean(c(d1, d2))
}

#Plot the heights on the chart
dummy<-lapply(1:9, function(i) {
   text(distance$loc[i], cluster$height[i]-0.5, format(cluster$height[i], digits=3) )
})

enter image description here

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.