Computing Silhouette Width - особый случай
Я полностью переформулирую этот вопрос, следуя совету @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 - SW не определено для менее чем 2 кластеров. Использование всех переменных, кроме group
Я хотел бы вычислить матрицу различий, используя daisy
от cluster
пакет. Насколько мне известно, daisy
является единственной функцией, способной вычислять матрицу различий из смешанных переменных. Далее я передам матрицу различий, только что созданную pam
и рассчитать ширину силуэта для различных конфигураций кластера. Чтобы сократить время вычислений, особенно с большими группами, я навязываю максимальное количество кластеров, равное одной трети от числа людей в группе. На этом этапе я бы хотел, чтобы функция взяла значение SW, соответствующее оптимальному количеству кластеров (определяемое по максимальному значению ширины силуэта), и вставило его вместе с соответствующим идентификатором группы в data.frame
- здесь называется aswout
,
К сожалению, эта функция, похоже, не работает должным образом (я пробовал ее только в первой группе), и мне не очень понятно, как сделать так, чтобы она "циклически повторялась" по всем группам.
Я надеюсь, что вопрос ясен. Напишите, если есть что-то, что вы не понимаете, и я добавлю больше информации. Я очень благодарен за любую помощь в этом!
Всего наилучшего, Риккардо
РЕДАКТИРОВАТЬ:
ASW
функция теперь работает. Я пытаюсь сделать это циклически по всем группам в кадре данных. Из другого поста я узнал, что включать вредную привычку data.frame
s внутри функций, которые растут по мере выполнения функции. Это, однако, было целью моего aswout
data.frame
, Сейчас я ищу способ достичь того же результата, используя цикл функций для групп и давая мне вывод data.frame
без учета data.frame
в рамках функции.