2017-06-28 3 views
0

J'essaie d'utiliser la méthode NbClust dans R pour déterminer le meilleur nombre de clusters dans une analyse de cluster suivant l'approche dans le livre de Manning. Cependant, je reçois un message d'erreur indiquant:Erreur dans NbClust: pas assez d'objets à cluster

Erreur dans hclust (md, méthode = "moyenne"): doit avoir n> = 2 objets à cluster.

Même si la méthode hclust semble fonctionner. Par conséquent, je suppose que le problème est (ce qui est également indiqué par le message d'erreur), que NbClust essaie de créer des groupes avec un seul objet à l'intérieur.

Mon ensemble de données se trouvent here et voici mon code:

mydata = read.table("PLR_2016_WM_55_5_Familienstand_aufbereitet.csv", skip = 0, sep = ";", header = TRUE) 

mydata <- mydata[-1] # Without first line (int) 
data.transformed <- t(mydata) # Transformation of matrix 
data.scale <- scale(data.transformed) # Scaling of table 
data.dist <- dist(data.scale) # Calculates distances between points 

fit.average <- hclust(data.dist, method = "average") 
plot(fit.average, hang = -1, cex = .8, main = "Average Linkage Clustering") 

library(NbClust) 
nc <- NbClust(data.scale, distance="euclidean", 
      min.nc=2, max.nc=15, method="average") 

J'ai trouvé un problème similaire here, mais je n'ai pas pu adapter le code.

Répondre

2

Votre ensemble de données présente des problèmes.
Les 4 dernières lignes ne contiennent pas de données et doivent être supprimées.

mydata <- read.table("PLR_2016_WM_55_5_Familienstand_aufbereitet.csv", skip = 0, sep = ";", header = TRUE) 
mydata <- mydata[1:(nrow(mydata)-4),] 
mydata[,1] <- as.numeric(mydata[,1]) 

Maintenant redimensionnez l'ensemble de données:

data.transformed <- t(mydata) # Transformation of matrix 
data.scale <- scale(data.transformed) # Scaling of table 

Pour une raison quelconque data.scale n'est pas une matrice complète de rang:

dim(data.scale) 
# [1] 72 447 
qr(data.scale)$rank 
# [1] 71 

Par conséquent, nous supprimer une ligne de data.scale et transposons-le:

data.scale <- t(data.scale[-72,]) 

Maintenant, l'ensemble de données est prêt pour NbClust.

library(NbClust) 
nc <- NbClust(data=data.scale, distance="euclidean", 
      min.nc=2, max.nc=15, method="average") 

La sortie est

[1] "Frey index : No clustering structure in this data set" 
*** : The Hubert index is a graphical method of determining the number of clusters. 
       In the plot of Hubert index, we seek a significant knee that corresponds to a 
       significant increase of the value of the measure i.e the significant peak in Hubert 
       index second differences plot. 

*** : The D index is a graphical method of determining the number of clusters. 
       In the plot of D index, we seek a significant knee (the significant peak in Dindex 
       second differences plot) that corresponds to a significant increase of the value of 
       the measure. 

******************************************************************* 
* Among all indices:             
* 8 proposed 2 as the best number of clusters 
* 4 proposed 3 as the best number of clusters 
* 8 proposed 4 as the best number of clusters 
* 1 proposed 5 as the best number of clusters 
* 1 proposed 8 as the best number of clusters 
* 1 proposed 11 as the best number of clusters 

        ***** Conclusion *****        

* According to the majority rule, the best number of clusters is 2 

******************************************************************* 

enter image description here

+0

Merci. Votre réponse a beaucoup aidé. – Hannah