NbClust包错误

时间:2013-12-18 22:16:35

标签: r cluster-analysis

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

> 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's Method进行聚类都没有问题。距离矩阵和树状图都产生了......

3 个答案:

答案 0 :(得分:9)

我很确定我找到了此错误消息的原因,并且它本质上与数据相关。我查找了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给出了一个非常好的原因解释和可能的解决方案。 我现在正在分析我的数据,以找出导致这种情况的原因。所以代码很好:如果你收到这条错误信息,你可能需要回到你的数据。

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

答案 1 :(得分:3)

我不知道函数会发生什么,但你可以用一个循环来应用diferents方法:(如果你想要应用这段代码,你必须改变“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

答案 2 :(得分:2)

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

在这种情况下我这样做的方法就是使用转置矩阵:

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