更新的响应 - 使用 single 链接而不是默认的 complete 链接。
我会尽我所能解释我如何看待这个工作。我相信这与hclust. 中使用的method 参数一样简单hclust 的默认方法不遵循您制定的算法,但我们可以调整method 使其如此。
但首先,我在您尝试制作的情节上遇到了错误:
> data<-data.frame(X=c(1,2,3,4),Y=c(1,3,2,1))
> for(i in 1:nrow(data)){ data[i,i]<-NA}
> colnames(data) <- c("A","B","C","D")
> rownames(data) <- c("A","B","C","D")
> plot(hclust(dist(data)))
Error in hclust(dist(data)) :
NA/NaN/Inf in foreign function call (arg 11)
您对for(i in 1:nrow(data)){ data[i,i]<-NA} 行的意图是什么?在该行之后,您的 data 对象如下所示:
X Y V3 V4
1 NA 1 NA NA
2 2 NA NA NA
3 3 2 NA NA
4 4 1 NA NA
但是,如果我们可以从以下代码开始,我们可以生成所需的树,如下所示:
dt<-data.frame(X = c(1, 2, 3, 4), Y = c(1, 3, 2, 1))
rownames(dt) <- c("A", "B", "C", "D")
dt<-dist(dt)
plot(hclust(dt, method = "single"))
注意hclust 调用method = single 时method 的变化。默认method 是method = complete。 complete 链接方法不根据最短距离而是最长簇间距离将簇加入节点。从奇妙的Introduction to Statistical Learning with Applications in R 中提取一些材料,其中描述了可用的各种链接方法:
本文由 James、Witten、Hastie 和 Tibshirani 撰写,可通过上面的链接免费下载。关于层次聚类的部分从第 390 页开始。如果这有助于理清问题,请告诉我。
原始回复
我认为您以错误的方式调用了dist 函数,并且可能调用了太多次。试试这个:
dt<-data.frame(X=c(1,2,3,4),Y=c(1,3,2,1))
rownames(dt) <- c("A","B","C","D")
dt<-dist(dt)
plot(hclust((dt)))
实际上,您在一个已经是 dist 类的对象上调用 dist,然后您将其转换为一个矩阵,然后在您对 plot 的调用中再次调用 dist。
我们可以只检查距离对象如下:
> dt
A B C
B 2.236068
C 2.236068 1.414214
D 3.000000 2.828427 1.414214
在将此对象传递给hclust 函数之前,无需再次对该对象调用dist。