我是集群新手。 我想将彼此具有良好相关性的系列聚类在一起。 从一个例子开始:
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
和
直观上看起来不错(除了负相关性[如
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
)
我希望这是两个简单的问题...
应该有一种更简单的方法,但这里是树上的高度图。
我不确定你想如何衡量相关性。 高度为 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) )
})