【问题标题】:NbClust package errorNbClust 包错误
【发布时间】:2014-01-07 07:22:27
【问题描述】:

我正在尝试对我的数据(100 行 x 130 列)运行包 NbClust 以确定我应该选择的集群数量,但如果我尝试将其应用于完整数据集,我会不断收到此错误:

> nc <- NbClust(mydata, distance="euclidean", min.nc=2, max.nc=99, method="ward",
index="duda")     
[1] "There are only 100 nonmissing observations out of a possible 100 observations."
Error in NbClust(mydata, distance = "euclidean", min.nc = 2, max.nc = 99,  : 
The TSS matrix is indefinite. There must be too many missing values. The index cannot be calculated.

当我将该方法应用于 100x80 矩阵时,它确实产生了所需的输出(100x100 也给了我一个错误消息,但不同)。但是,显然,我想将此方法应用于整个数据集。 仅供参考 - 创建距离矩阵和使用 Ward 方法进行聚类都没有问题。距离矩阵和树状图都生成了……

【问题讨论】:

    标签: r cluster-analysis


    【解决方案1】:

    我不知道函数会发生什么,但您可以通过循环应用不同的方法:(如果您想应用此代码,您必须更改“base_muli_sinna”)

    lista.methods = c("kl", "ch", "hartigan","mcclain", "gamma", "gplus",
                      "tau", "dunn", "sdindex", "sdbw", "cindex", "silhouette",
                      "ball","ptbiserial", "gap","frey")
    lista.distance = c("metodo","euclidean", "maximum", "manhattan", "canberra")
    
    tabla = as.data.frame(matrix(ncol = length(lista.distance), nrow = length(lista.methods)))
    names(tabla) = lista.distance
    
    for (j in 2:length(lista.distance)){
    for(i in 1:length(lista.methods)){
    
    nb = NbClust(base_multi_sinna, distance = lista.distance[j],
                 min.nc = 2, max.nc = 10, 
                 method = "complete", index =lista.methods[i])
    tabla[i,j] = nb$Best.nc[1]
    tabla[i,1] = lista.methods[i]
    
    }}
    
    tabla
    

    【讨论】:

    • base_multi_sinna 应该是开始的原始数据框?谢谢!非常有用。
    【解决方案2】:

    我很确定我找到了此错误消息的原因,它本质上与数据有关。我查找了 NbClust 包的原始代码,发现错误源于代码的开头部分:

    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.")
            } 
    }
    

    所以,就我而言,我的矩阵产生负特征值。我仔细检查了这一点,确实如此:多达大约 100 个主子矩阵的特征值保持正数,然后它们开始变为负数。所以这是我的矩阵的数学问题,这意味着它不是正定矩阵。出于很多原因,这很重要 - http://www2.gsu.edu/~mkteer/npdmatri.html 给出了对原因和可能解决方案的非常好的解释 我现在正在分析我的数据以找出导致这种情况的原因。所以代码没问题:如果您收到此错误消息,您可能必须返回您的数据。

    我会告诫不要转置您的数据,因为您实际上是在将转置数据(即原始数据)的转置与转置数据相乘。 转置的原始时间与原始的转置时间不同!

    【讨论】:

    • 这发生在我使用 10 个元素的样本进行测试时。相反,当我使用 1000 个元素时,此错误不再发生。
    【解决方案3】:

    在处理列多于行的矩阵时,我遇到了同样的问题 - 当您尝试进行 PCA 分析时,这个问题可能会影响其他 R 函数,例如 princomp(在这种情况下,您应该使用 prcomp )。

    在这种情况下,我的做法是简单地使用转置矩阵:

    NbClust(t(mydata), distance="euclidean", min.nc=2, max.nc=99, method="ward", 
    index="duda")
    

    【讨论】:

    • 这似乎在我使用 Duda 索引时有效,但是如果我尝试从所有索引中获取集群的 benumbed,我会再次收到一条错误消息。 “solve.default(W) 中的错误:系统在计算上是奇异的:倒数条件数 = 3.65978e-17”。显然,Beale 索引会产生 NaN……另外,我想知道的另一件事是:在计算距离矩阵时,会计算行之间的距离。所以结果不会受到我转置矩阵这一事实的影响(从那时起,它基本上是在计算列之间的距离,现在已经变成了行)。
    • 抱歉打错字了,我的意思是第一句中的“所有索引中的簇数”
    • 你知道这会让你对你的特征而不是你的样本进行聚类,对吧?这是一个非常危险的提议,不应该在没有上下文的情况下出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2018-04-17
    • 2018-12-20
    • 1970-01-01
    • 2020-01-01
    • 2020-06-28
    相关资源
    最近更新 更多