【问题标题】:How do I weight variables with gower distance in r如何在 r 中使用 gower 距离对变量进行加权
【发布时间】:2014-02-15 13:34:21
【问题描述】:

我是 R 新手,正在研究一个数据集,包括名义数据、有序数据和度量数据。 因此我使用的是高尔距离。在下一步中,我使用这个距离和hclust(x, method="complete") 来创建基于这个距离的集群。

现在我想知道如何对高尔距离中的变量赋予不同的权重。 文档说:

daisy(x, metric = c("euclidean", "manhattan", "gower"), stand = FALSE, type = list(), weights = rep.int(1, p))

所以有一种方法,但我不确定语法(weights = ...)。 weightsrep.int 的文档没有帮助。 我也没有找到任何其他有用的解释。

如果有人能帮忙,我会很高兴的。

【问题讨论】:

  • 别忘了提及您正在使用library(cluster)

标签: r distance hierarchical-clustering


【解决方案1】:

不确定这是否是您的意思,但是...

假设您有 5 个变量,例如数据框或矩阵中的 5 列。那么weights 将是length=5 的向量,其中包含相应列的权重。

文档中的符号weights=rep.int(1,p) 仅表示权重的默认值是长度为 p 且全为 1 的向量,例如。权重都等于 1。在文档的其他地方,它解释了 p 是列数。

另外,请注意daisy(...) 会产生一个相异矩阵。这就是您在hclust(...) 中使用的内容。因此,如果 x 是一个数据框或矩阵,其中包含五列变量,那么:

d  <- daisy(x, metric="gower", weights=c(1,2,3,4,5))
hc <- hclust(d, method="complete")

编辑(对 OP 的 cmets 的回应)

下面的代码显示了聚类如何依赖于权重。

clust.anal <- function(df,w,h) {
  require(cluster)
  d  <- daisy(df, metric="gower", weights=w)
  hc <- hclust(d, method="complete")
  clust <- cutree(hc,h=h)
  plot(hc, sub=paste("weights=",paste(wts,collapse=",")))
  rect.hclust(hc,h=0.8,border="red")

}

df <- read.table("ExampleClusterData.csv", sep=";",header=T)
df[1] <- factor(df[[1]])
df[2] <- factor(df[[2]])
# weights increase with col number...
wts=c(1,2,3,4,5,6,7)
clust.anal(df,wts,h=0.8)

# weights decrease with col number...
wts=c(7,6,5,4,3,2,1)
clust.anal(df,wts,h=0.8)

【讨论】:

  • 感谢您的回答!我现在遇到的问题是,使用这种语法我看不到树状图中的任何差异。我什至使用极端重量来观察差异。我是否正确理解weights=c(1,2,3,4,5) 中的向量是每列的权重?所以第 1 列的权重 1,第 2 列的权重 2 等等。我尝试了几次,我了解到权重不能是奇数,它们不能高于列数。否则我得到 type$weights must be 1:ncol(x)
  • 作为权重传递的向量必须具有长度 = x 中的列数,是的。但是对奇数、偶数没有限制。为了更进一步,我需要你的数据集。能发个链接吗?
  • 很遗憾我不能给出真实的数据。我创建了一个很好的例子bit.ly/1gferLt谢谢你的努力!
  • 很好的答案,谢谢!!
猜你喜欢
  • 2015-09-22
  • 1970-01-01
  • 2021-06-01
  • 2021-12-18
  • 2018-06-13
  • 2017-09-23
  • 1970-01-01
  • 2017-12-31
  • 2011-03-07
相关资源
最近更新 更多