Как преодолеть неопределенную матричную ошибку (NbClust)? - PullRequest
0 голосов
/ 20 марта 2019

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

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

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

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

Спасибо

Ответы [ 3 ]

0 голосов
/ 21 марта 2019

@ 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")

0 голосов
/ 04 июля 2019

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

мой e-mail:

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

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

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

> 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 индексов?Спасибо за чтение, и я буду ждать вашего ответа.С наилучшими пожеланиями!

и ее ответ:

Уважаемый Hansol,

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

С уважением,

Надя Газзали

0 голосов
/ 20 марта 2019

Не забудьте также удалить все константы и дубликаты столбцов.

Вы уверены, что это подходящий метод кластеризации для ваших данных?

...