2017-10-14 1 views
0

J'essaie de faire un peu de regroupement et je rencontre cette erreur.Le composant 'height' de 'tree' n'est pas trié Erreur dans cutree

Evaluation error: the 'height' component of 'tree' is not sorted (increasingly).

Mon entrée est:

library(stringdist) 
name <- c("luke,abcdef","luke,abcdeh","luke,abcdeg") 
a<-stringdistmatrix(name, method="jw") 
clusts <- hclust(a, method="ward.D2") 

Mais lorsque je tente de le couper, il me donne une erreur:

> cutree(clusts, h = 0.155) 
Error in cutree(clusts, h = 0.155) : 
    the 'height' component of 'tree' is not sorted (increasingly) 

Mais si j'utilise

a<-stringdistmatrix(name, method="jw", p=0.05) 

jamais Tout fonctionne bien.

J'ai cherché une solution et je n'ai pas trouvé de solution. Que dois-je faire pour éviter que cela ne se produise et que cela continue?

J'ai aussi remarqué, que si j'ai la même matrice à distance, mais généré par la main (donc il n'y a aucun paramètre à distance du cluster.

+0

Si vous regardez 'diff (clusts $ height)' pour ces deux exemples, le premier sort comme un petit nombre négatif, le second comme exactement zéro. Fondamentalement, le problème est que dans ce cas simple toutes les distances sont les mêmes mais il y a de petites différences d'arrondi dues à une représentation binaire imparfaite des nombres décimaux. Je ne pense pas que vous auriez ce problème avec un ensemble plus varié de chaînes. –

+0

Donc, c'est une question spécifique, qui s'est produite au hasard parce que je suis malchanceux, pour ainsi dire? Le problème est, même si ces noms ne sont pas mes noms réels, les distances entre ces noms et mes noms réels sont les mêmes (les pris pour une raison). Y a-t-il un moyen de le faire fonctionner automatiquement? Comme j'ai besoin de mon algorithme pour fonctionner dans tous les cas, même dans des cas aussi malchanceux que ceux-ci .. Alors, puis-je faire quelque chose à ce sujet, si je garde ces mêmes chaînes? – Ravonrip

+0

Vous pouvez essayer d'arrondir les hauteurs après avoir calculé les clustes - essayez 'clusts $ height <- round (clusts $ height, 6)' –

Répondre

1

Si vous comparez diff(clusts$height) pour ces deux exemples, le premier sort comme un petit nombre négatif, la seconde exactement zéro. donc, le problème est causé par des différences d'arrondi binaire représentation des valeurs qui doivent être égales.

Il devrait fonctionner si vous autour des hauteurs après avoir calculé clusts ...

clusts$height <- round(clusts$height, 6)