我完全按照@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.frame
s 包含在随着函数执行而增长的函数中是一个坏习惯。然而,这是我的目标aswout
data.frame
。我现在正在寻找一种方法来实现相同的结果,让函数在组上循环并给我一个输出data.frame
,而不包括data.frame
函数内的。