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.frames внутри функций, которые растут по мере выполнения функции. Это, однако, было целью моего aswoutdata.frame, Сейчас я ищу способ достичь того же результата, используя цикл функций для групп и давая мне вывод data.frameбез учета data.frame в рамках функции.

0 ответов

Другие вопросы по тегам