2013-12-18 163 views
7

我想在我的數據(100行x 130列)上運行包NbClust以確定我應該選擇的羣集數,但是如果我嘗試將其應用於完整數據設置: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矩陣,它產生所需的輸出(100×100也給我一個錯誤消息,但不同的一個)。但是,顯然,我想將這種方法應用於整個數據集。僅供參考 - 創建距離矩陣,並用Ward's Method進行聚類都不是問題。生成距離矩陣和樹狀圖......

回答

6

我敢肯定,我發現這個錯誤信息的原因,它本質上是相關的數據。我擡頭對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 我現在正在分析我的數據以找出導致此問題的原因。所以代碼很好:如果你得到這個錯誤信息,你可能不得不回到你的數據。

我會謹慎反對轉置您的數據,因爲那樣您基本上將轉置數據(即原始數據)的轉置與轉置數據相乘。 轉置的原始時間與轉換的時間不一樣!

+0

這發生在我身上,當時我正在測試10個元素的樣本。當我使用了1000個元素時,這個錯誤再也沒有發生過。 – Eduardo

2

當使用列數多於行的矩陣時,我遇到了同樣的問題 - 可能會影響其他R函數的問題,比如當您嘗試執行PCA分析(在這種情況下,您應該使用prcomp)。

我在這種情況下,這樣做的方法是簡單地使用轉置矩陣:

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

這似乎當我使用Duda索引時工作,但如果我試圖從所有索引中獲取集羣麻煩,我會再次收到錯誤消息。 「solve.default(W)中的錯誤: 系統是計算奇異的:互惠條件數= 3.65978e-17」。顯然,Beale索引產生NaN ...另外,我想知道的另一件事是:在計算距離矩陣時,計算行之間的距離。所以不是受到我將矩陣轉置的事實所影響的結果(因爲它基本上是計算列之間的距離,現在它們變成了行)。 – Geraldine

+0

對於錯字,我的意思是「來自所有索引的聚類數」在第一句 – Geraldine

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