NA в функциях кластеризации (kmeans, pam, clara). Как связать кластеры с исходными данными?

Мне нужно сгруппировать некоторые данные, и я пробовал kmeans, pam и clara с R.

Проблема в том, что мои данные находятся в столбце фрейма данных и содержат NA.

Я использовал na.omit() для получения своих кластеров. Но тогда как я могу связать их с исходными данными? Функции возвращают вектор целых чисел без NA и не сохраняют никакой информации об исходной позиции.

Есть ли умный способ связать кластеры с исходными наблюдениями во фрейме данных? (или способ разумного выполнения кластеризации при наличии NA?)

Спасибо


person Bakaburg    schedule 18.12.2014    source источник
comment
вы назвали свои строки? я думаю, что kmeans и pam (по крайней мере) сохраняют имена строк, не так ли?   -  person agenis    schedule 18.12.2014
comment
Я делаю так: kmeans(na.omit(x), k)   -  person Bakaburg    schedule 18.12.2014
comment
Векторы кластера (например, clus$cluster) соответствуют не-NA элементам x. Таким образом, индексы x, которым соответствуют элементы clus$cluster, равны which(!is.na(x)).   -  person jbaums    schedule 18.12.2014


Ответы (2)


Выход kmeans соответствует элементам объекта, переданного в качестве аргумента x. В вашем случае вы опускаете элементы NA, поэтому $cluster указывает кластер, к которому принадлежит каждый элемент na.omit(x).

Вот простой пример:

d <- data.frame(x=runif(100), cluster=NA)
d$x[sample(100, 10)] <- NA
clus <- kmeans(na.omit(d$x), 5)

d$cluster[which(!is.na(d$x))] <- clus$cluster

А на графике ниже цвет указывает на кластер, к которому принадлежит каждая точка.

plot(d$x, bg=d$cluster, pch=21)

введите здесь описание изображения

person jbaums    schedule 18.12.2014

Этот код работает для меня, начиная с матрицы, содержащей целую строку NA:

DF=matrix(rnorm(100), ncol=10)
row.names(DF) <- paste("r", 1:10, sep="")
DF[3,]<-NA
res <- kmeans(na.omit(DF), 3)$cluster
res
DF=cbind(DF, 'clus'=NA)
DF[names(res),][,11] <- res
print(DF[,11])
person agenis    schedule 18.12.2014