R - 差异计算警告,使用数字矩阵进行聚类

R - warning for dissimilarity calculation, clustering with numeric matrix

可重现的数据:

Data <- data.frame(
    X = sample(c(0,1), 10, replace = TRUE),
    Y = sample(c(0,1), 10, replace = TRUE),
    Z = sample(c(0,1), 10, replace = TRUE)
)

将数据帧转换为矩阵

Matrix_from_Data <- data.matrix(Data)

检查结构

str(Matrix_from_Data)

num [1:10, 1:3] 1 0 0 1 0 1 0 1 1 1 ... - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr [1:3] "X" "Y" "Z"

问题: 我有二进制对称变量的数据框(比示例大),我想做一些我以前从未尝试过的层次聚类。没有缺失值或 NA 值。

在尝试 运行 来自 'cluster' 包的雏菊函数之前,我将数据帧转换为矩阵,以获得相异矩阵。我想探索计算不同差异指标的选项,但 运行 收到警告(不是错误):

library(cluster)
Dissim_Euc_Matrix_from_Data <- daisy(Matrix_from_Data, metric = "euclidean", type = list(symm =c(1:ncol(Matrix_from_Data))))    

Warning message: In daisy(Matrix_from_Data, metric = "euclidean", type = list(symm = c(1:ncol(Matrix_from_Data)))) : with mixed variables, metric "gower" is used automatically

...这对我来说似乎很奇怪,因为 "Matrix_from_Data" 所有数字变量,而不是混合变量。 Gower 可能是一个很好的指标,但我想看看其他指标如何影响聚类。 我错过了什么?

好问题。

首先,该消息是 Warning 而不是 Error。我个人对 daisy 并不熟悉,但我无知的猜测是,当您 运行 该函数并且没有做任何工作以查看 if[ 时,会弹出该特定警告消息=46=] 警告是相关的。

不管为什么会出现该警告,比较层次聚类中由几种不同距离度量完成的聚类的一种简单方法是绘制树状图。为简单起见,让我们比较编程到 dist 中的 "euclidean""binary" 距离度量。您可以使用 ?dist 在此处阅读 "binary" 距离的含义。

# When generating random data, always set a seed if you want your data to be reproducible
set.seed(1)
Data <- data.frame(
  X = sample(c(0,1), 10, replace = TRUE),
  Y = sample(c(0,1), 10, replace = TRUE),
  Z = sample(c(0,1), 10, replace = TRUE)
)

# Create distance matrices
mat_euc <- dist(Data, method="euclidean")
mat_bin <- dist(Data, method="binary")

# Plot the dendograms side-by-side
par(mfrow=c(1,2))
plot(hclust(mat_euc))
plot(hclust(mat_bin))

我通常从 bottom-up 读取树状图,因为垂直轴上较低的点比垂直轴上较高的点彼此 更相似(即距离更近)轴.

我们可以从这些图中得到一些信息:

  • 4/6、5/10 和 7/8 使用这两个指标组合在一起。如果行相同,我们应该希望这是真的:)
  • 3 与两个距离度量的 7/8 关联最密切,尽管关联的 在二元距离中比欧几里得距离要强一些。
  • 1、2 和 9 在两个距离度量之间有一些明显不同的关系(例如,1 在欧几里德距离中与 2 的关联最密切,但在二进制距离中与 9 关联最密切)。在这种情况下,距离度量的选择会对生成的集群产生重大影响。此时返回到您的数据并理解为什么这三个点的距离度量之间存在差异是值得的。

还要记住层次聚类有不同的方法(例如完全链接和单链接),但您也可以使用相同的方法来比较方法之间的差异。有关 hclust.

提供的完整方法列表,请参阅 ?hclust

希望对您有所帮助!