Как взвесить переменные с расстоянием Гауэра в r

Я новичок в R и работаю над набором данных, включая номинальные, порядковые и метрические данные. Поэтому я использую расстояние Гауэра. На следующем шаге я использую это расстояние с hclust(x, method="complete") для создания кластеров на основе этого расстояния.

Теперь я хочу знать, как я могу присвоить разные веса переменным на расстоянии Гауэра. В документации говорится:

daisy(x, metric = c("euclidean", "manhattan", "gower"), stand = FALSE, type = list(), weights = rep.int(1, p))

Так что способ есть, но я не уверен в синтаксисе (weights = ...). Документация weights и rep.int не помогла. Я также не нашел никакого другого полезного объяснения.

Буду очень рад, если кто-то сможет помочь.


person user3231946    schedule 24.01.2014    source источник
comment
Не забудьте упомянуть, что вы работаете с library(cluster).   -  person tonytonov    schedule 24.01.2014


Ответы (1)


Не уверен, что это то, к чему ты клонишь, но...

Допустим, у вас есть 5 переменных, например. 5 столбцов в вашем фрейме данных или матрице. Тогда weights будет вектором length=5, содержащим веса для соответствующих столбцов.

Обозначение weights=rep.int(1,p) в документации просто означает, что значение весов по умолчанию — это вектор длины p, который имеет все единицы, например. все веса равны 1. В другом месте в документации поясняется, что p — это количество столбцов.

Также обратите внимание, что daisy(...) создает матрицу различий. Это то, что вы используете в hclust(...). Итак, если x — это фрейм данных или матрица с пятью столбцами для ваших переменных, то:

d  <- daisy(x, metric="gower", weights=c(1,2,3,4,5))
hc <- hclust(d, method="complete")

EDIT (ответ на комментарии OP)

В приведенном ниже коде показано, как кластеризация зависит от весов.

clust.anal <- function(df,w,h) {
  require(cluster)
  d  <- daisy(df, metric="gower", weights=w)
  hc <- hclust(d, method="complete")
  clust <- cutree(hc,h=h)
  plot(hc, sub=paste("weights=",paste(wts,collapse=",")))
  rect.hclust(hc,h=0.8,border="red")

}

df <- read.table("ExampleClusterData.csv", sep=";",header=T)
df[1] <- factor(df[[1]])
df[2] <- factor(df[[2]])
# weights increase with col number...
wts=c(1,2,3,4,5,6,7)
clust.anal(df,wts,h=0.8)

# weights decrease with col number...
wts=c(7,6,5,4,3,2,1)
clust.anal(df,wts,h=0.8)

person jlhoward    schedule 24.01.2014
comment
Спасибо за ваш ответ! Теперь у меня проблема, что я не вижу никаких различий в дендрограмме с использованием этого синтаксиса. Я даже использовал экстремальные веса, чтобы увидеть различия. Правильно ли я понимаю, что вектор в weights=c(1,2,3,4,5) - это веса для каждого столбца? Итак, вес 1 для столбца 1, вес 2 для столбца 2 и т. д. Я пробовал это пару раз и узнал, что веса не могут быть нечетным числом, и они не могут быть больше, чем количество столбцов. В противном случае я получаю type$weights должен быть 1:ncol(x) - person user3231946; 25.01.2014
comment
Вектор, переданный как веса, должен иметь длину = количество столбцов в x, да. Но нет ограничений на нечетные, четные. Чтобы пойти дальше, мне нужен ваш набор данных. Можете ли вы опубликовать ссылку? - person jlhoward; 25.01.2014
comment
К сожалению реальных данных выдать не могу. Я создал хороший пример bit.ly/1gferLt Спасибо за усилия! - person user3231946; 26.01.2014
comment
Отличный ответ, спасибо!! - person user3231946; 26.01.2014