如何用r中的gower距离对变量进行加权

use*_*946 6 r distance hierarchical-clustering

我是R的新手,正在处理包括名义,序数和公制数据的数据集.因此我正在使用gower距离.在下一步中,我使用此距离hclust(x, method="complete")来创建基于此距离的聚类.

现在我想知道如何在gower距离中对变量赋予不同的权重.文件说:

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

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

如果有人可以提供帮助,我会很高兴的.

jlh*_*ard 5

不确定这是否是你得到的,但......

假设您有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")
Run Code Online (Sandbox Code Playgroud)

编辑(回应OP的评论)

下面的代码显示了聚类如何取决于权重.

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)
Run Code Online (Sandbox Code Playgroud)

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