根据@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
。