如何克服不确定的矩阵误差(NbClust)?

时间:2019-03-20 13:11:46

标签: cluster-analysis

调用NbClust()时出现以下错误:

  

NbClust(data = ds [,sapply(ds,is.numeric)],diss = NULL,距离=“ euclidean”,中的错误:TSS矩阵是不确定的。必须有太多的缺失值。索引不能计算。

在运行NbClust之前,我已经致电ds <- ds[complete.cases(ds),],所以不会丢失任何值。

知道这个错误的根源是什么吗?

谢谢

3 个答案:

答案 0 :(得分:0)

@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,请查看方法here的源代码。查看给定链接中的行号168, 169。您收到此错误消息,因为聚类方法为空。 if (is.na(method)) stop("invalid clustering method")

答案 1 :(得分:0)

我在研究中遇到了同样的问题。 因此,我已邮寄给包裹维护者Nadia Ghazzali,并得到了答复。 我将附上我的邮件和她的回复。

我的电子邮件:

  

亲爱的娜迪亚·加扎里(Nadia Ghazzali)。你好纳迪亚。我有一些疑问   R库中的NbClust函数。我曾尝试使用Google搜索,但无法   找到满意的答案。首先,我非常感谢您   这个糟糕的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):对象   找不到“斯科特”,所以我逐行尝试了NbClust函数,然后   发现一些指数,例如 CCC,Scott,mariort,tracecovw,   由于对象原因,未计算tracew,friedman和rubin   vv =0。我对代数不是很熟悉,所以我不知道意思   本征值。但在我看来,对象ss(   保护后,eigenValues)不应为0。       所以,这是我的问题。   我认为我的数据太稀疏(很多零值),导致sqrt(eigenValues)变得太小了,对吗?对不起,我   无法附加我的数据,但可以附加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个指数的方法?       感谢您的阅读,我们将等待您的回复。最好的问候!

和她的回复:

  

亲爱的汉索尔,

     

感谢您的关注。是的,您的理解很好。   不幸的是,这七个索引无法应用。

     

最诚挚的问候,

     

Nadia Ghazzali

答案 2 :(得分:-2)

确保还删除所有常量和重复的列。

您确定这是适合您数据的聚类方法吗?