2

我完全按照@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生成data.frame组号(id),在第二列中生成与最佳集群数相对应的轮廓宽度值。如果该组仅包含一个人,我希望轮廓宽度为 0 - 未为少于 2 个集群定义 SW。group使用除我想使用包中的差异矩阵daisy之外cluster的所有变量。据我所知,daisy是唯一能够从混合变量计算相异矩阵的函数。接下来,我会将刚刚生成的相异矩阵传递给pam并计算各种集群配置的轮廓宽度。为了缩短计算时间,尤其是对于大型群体,我将最大数量的集群设置为群体中个体数量的三分之一。此时,我希望函数获取与最佳聚类数对应的 SW 值(通过查看最大轮廓宽度值确定)并将其与相应的组 id 一起粘贴到data.frame- 这里称为aswout.

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

我希望这个问题很清楚。如果有不明白的地方写下来,我会补充更多信息。我真的很感谢在这方面的任何帮助!

一切顺利,里卡多

编辑:

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

4

0 回答 0