Как преодолеть неопределенную ошибку матрицы (NbClust)?

#cluster-analysis

#кластерный анализ

Вопрос:

Я получаю следующую ошибку при вызове NbClust() :

Ошибка в NbClust(данные = ds[, sapply(ds, is.numeric)], diss = NULL, расстояние = «евклидово», : матрица TSS неопределенна. Должно быть слишком много пропущенных значений. Индекс не может быть рассчитан.

Я вызвал ds <- ds[complete.cases(ds),] непосредственно перед запуском NbClust, чтобы не было пропущенных значений.

Есть идеи, что стоит за этой ошибкой?

Спасибо

Комментарии:

1. Я существенно уменьшил количество переменных и теперь столкнулся со следующей ошибкой: Ошибка в NbClust(data = ds[, sapply(ds, is.numeric)], diss = NULL, distance = «евклидово», : недопустимый метод кластеризации

Ответ №1:

У меня была такая же проблема в моем исследовании. Итак, я отправил электронное письмо Наде Газзали, которая является сопровождающим пакета, и получил ответ. Я приложу свое письмо и ее ответ.

мой e-mail:

Уважаемая Надя Газзали. Привет, Надя. У меня есть несколько вопросов о функции NbClust в библиотеке R. Я пробовал гуглить, но не смог найти удовлетворительных ответов. Во-первых, я так благодарен вам за создание этой потрясающей библиотеки R. Это очень полезно для моего повторного поиска. Я протестировал функцию NbClust в библиотеке NbClust со своими собственными данными, как показано ниже.

 > clust <- NbClust(data, distance = “euclidean”, 
                   min.nc = 2, max.nc = 10, method = ‘kmeans’, index =”all”)
  

Но вскоре произошла ошибка. Ошибка: деление на ноль! Ошибка в
Индексы.WBT (x = jeu, cl = cl1, P = TT, s = ss, vv = vv) : объект
‘scott’ не найден Итак, я попробовал функцию NbClust построчно и
обнаружено, что некоторые индексы, такие как CCC, Scott, marriot, tracecovw, tracew, friedman и rubin, не были рассчитаны из-за object
vv = 0. Я не очень знаком с argebra, поэтому не знаю значения
собственного значения. Но мне кажется, что объект ss (который является квадратом
Собственные значения) не должны быть равны 0 после prodected.
Итак, вот мои вопросы.
Я предполагаю, что мои данные настолько разрежены (много нулевых значений), что sqrt (собственные значения) становится слишком маленьким, верно?Извините, я
не могу прикрепить свои данные, но я могу прикрепить некоторую часть собственных значений и
возведенные в квадрат собственные значения.

 > head(eigenValues)
[1] 0.039769880 0.017179826 0.007011972 0.005698736 0.005164871 0.004567238

> head(sqrt(eigenValues))
[1] 0.19942387 0.13107184 0.08373752 0.07548997 0.07186704 0.06758134
  

И если мое предположение верно, что я могу сделать для решения этой проблемы? Только один
как удалить 7 индексов?
Спасибо за чтение, и я буду ждать вашего ответа. С наилучшими пожеланиями!

и ее ответ:

Дорогой Хансол,

Спасибо за проявленный интерес. Да, вы хорошо понимаете. К сожалению, не удалось применить семь индексов.

С наилучшими пожеланиями,

Надя Газзали

Ответ №2:

@seni Причина этой ошибки связана с данными. Если вы посмотрите на исходный код этой функции,

 NbClust <- function(data, diss="NULL", distance = "euclidean", min.nc=2, max.nc=15, method = "ward", index = "all", alphaBeale = 0.1)
{
x<-0
min_nc <- min.nc
max_nc <- max.nc
jeu1 <- as.matrix(data)
numberObsBefore <- dim(jeu1)[1]
jeu <- na.omit(jeu1) # returns the object with incomplete cases removed 
nn <- numberObsAfter <- dim(jeu)[1]
pp <- dim(jeu)[2]
TT <- t(jeu)%*%jeu   
sizeEigenTT <- length(eigen(TT)$value)
eigenValues <- eigen(TT/(nn-1))$value
for (i in 1:sizeEigenTT) 
{
        if (eigenValues[i] < 0) {
    print(paste("There are only", numberObsAfter,"nonmissing observations out of a possible", numberObsBefore ,"observations."))
    stop("The TSS matrix is indefinite. There must be too many missing values. The index cannot be calculated.")
        } 
}
  

И я думаю, что основной причиной этой ошибки являются отрицательные собственные значения, которые просачиваются, когда количество кластеров очень велико, т.е. max.nc велико. Итак, чтобы решить проблему, вы должны посмотреть на свои данные. Посмотрите, есть ли в нем больше столбцов, чем строк. Удалите недостающие значения, проверьте наличие таких проблем, как коллинеарность и мультиколлинеарность, дисперсия, ковариация и т.д.

Для другой ошибки, invalid clustering method посмотрите на исходный код метода здесь. Посмотрите на номер строки 168, 169 по данной ссылке. Вы получаете это сообщение об ошибке, потому что метод кластеризации пуст. if (is.na(method))
stop("invalid clustering method")