计算轮廓宽度 - 特殊情况

时间:2014-07-18 21:13:12

标签: r cluster-analysis r-daisy

根据@MrFlick的建议,我完全重新起草了这个问题。

假设我有data.frame,如下所示

set.seed(1)

group<-(rep(1:10, sample(50:200, 10, replace=T)))
gender<-factor((sample(0:1, 1328, replace=T, prob=c(0.55, 0.45))))
country<-factor((sample(6030:6098, 1328, replace=T)))
ethnicity<-factor((sample(7040:7101, 1328, replace=T)))
yearbirth<-(sample(1950:1986, 1328, replace=T))
df<-data.frame(group, gender, country, ethnicity, yearbirth)

对于每个group,我想计算与“最佳”聚类数对应的轮廓宽度(SW)。为此,我准备了以下函数,我想在任何group

上重复
library(cluster)
library(fpc)

ASW<-function(x){

  x<-as.data.frame(x)
  id<-as.integer(x[1,1])
  people<-length(as.vector(x[,1]))
  if (people==1){
    p=0
  } else {
    x<-x[,-1]
    diss<-daisy(x, metric="gower")
    if (people/3<2) {
      maxclus=2      
    } else {
      maxclus<-round(people/3)
    }  
    asw <- numeric(maxclus)
    for (k in 2:maxclus) asw[[k]] <- pam(diss, k, diss=T) $ silinfo $ avg.width
    k.best <- which.max(asw)
    p<-asw[k.best]
  }  
  swg<-numeric(2)
  swg[1]<-id
  swg[2]<-p
  swg
}

作为最终输出,我希望ASW生成第一列中具有组编号(id)的data.frame,并且剪影宽度值对应于第二列中的最佳簇数。如果该组仅包含一个个体,我希望Silhouette Width为0 - SW未定义少于2个簇。 使用group以外的所有变量我想使用daisy包中的cluster来计算相异度矩阵。据我所知,daisy是唯一能够从混合变量计算相异矩阵的函数。接下来,我将刚刚生成的相异矩阵传递给pam并计算各种群集配置的轮廓宽度。为了缩短计算时间,特别是对于大型群体,我强加的最大群集数量等于群组中个人数量的三分之一。 此时,我希望函数将SW值对应于最佳簇数(通过查看最大Silhouette Width值确定)并将其与相应的组ID一起粘贴到data.frame中 - 这里称为aswout

不幸的是,这个功能似乎没有正常工作(我只在第一组上尝试过)并且我不太清楚如何让它在所有组中“循环”。

我希望问题很清楚。写下如果你不理解的东西,我会添加更多信息。 我真的很感谢你对此有任何帮助!

一切顺利, 的Riccardo

编辑:

ASW功能现在有效。我试图让它循环数据框中的所有组。我从另一篇文章中了解到,将data.frame包含在函数执行时生成的函数中是一个坏习惯。这是我aswout data.frame的目标。我现在正在寻找一种方法来实现相同的结果,让函数循环遍历组并给我一个输出data.frame,而不在函数中包含data.frame

0 个答案:

没有答案