2013-12-18 56 views
7

データ(100行×130列)にパッケージNbClustを実行して、選択する必要があるクラスタの数を判断しようとしていますが、完全なデータに適用しようとするとこのエラーが発生します設定:私は100x80行列に法を適用すると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. 

は、それが必要な出力を生成しない(100×100また、私のエラーメッセージを与えたが、別の1)。しかし、明らかに、私はこのメソッドをデータセット全体に適用したいと思います。 FYI - 距離行列を作成し、Wardの方法でクラスタリングすることは問題ありませんでした。距離行列とデンドログラムの両方が生成されました...

答えて

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関数に影響を与える問題、princompのような問題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 
関連する問題