Enveloppes convexes de groupes d'individus

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 13 Juil 2007, 08:33

Sinon, représenter les classes dans un plan d'ACP, j'ai vu cela dans plusieurs livres


oui tout à fait, je le fait moi même (trop :p) régulièrement mais c'est la méthode d'obtention des classes qui me met un doute. Je ne sais pas si le plan factoriel d'une ACP peut permettre de mettre en évidence les classes calculées par un algorithme qui n' a rien à voir avec l'ACP (enfin à ma connaissance) vu que les calculs sont effectués sur les données brutes et non sur les valeurs de l'ACP. Il me semble que c'est un peu comme essayer de superposer deux images qui ont été prises sous deux angles différents (c'est possible mais pas comme ça :D).
Lorsque je représente des classes, j'utilise souvent la fonction s.class en première approche mais je travaille sur le acp$li, et j'analyse la pertinence de ces classes avec un test de permutation sur une analyse between (ou parfois between(within()) ).
Voilà pour la démarche que j'utilise. Maintenant si tu veux faire du kmeans, la représentation adéquate est certainement bivariée (un plot()) ce qui ne correspond peut être pas à tes données. Je pense que si tu veux faire apparaitre un kmeans avec une ACP, tu dois utiliser les valeurs issues de l'ACP et pas tes données (même normées) mais là je ne fais que des suppositions.
J'espère déjà être clair quant au doute que j'exprime :D

Pour le moment je ne vois pas trop quoi te dire de plus :)

Héléna Castermant
Messages : 39
Enregistré le : 08 Juin 2007, 07:40

Messagepar Héléna Castermant » 13 Juil 2007, 10:05

Merci pour tes précisions !
Il est sûr que je ne dois pas faire quelque chose de correct pour obtenir un tel graphique...
As-tu un exemple précis de code de la méthode que tu décris stp ?
Et qu'entends-tu par utiliser les valeurs issues de l'ACP et non les données? Quelles valeurs de l'ACP ?
Sinon, je viens d'essayer d'utiliser la fonction clusplot, qui fait exactement la représentation de points de cluster dans un plan d'ACP.
Voici mon code :

Code : Tout sélectionner

>donnees<-read.table("N:/G_GRD/RESERVE/Z_CASTERMANT/donnees.txt",header=FALSE,sep="\t")
> donnees2<-scale(donnees,center=TRUE,scale=TRUE)
> cl<-kmeans(donnees2,5,algorithm="MacQueen")
>clcluster<-as.vector(cl$cluster)
> c<-clusplot(donnees2,clcluster,cor=FALSE,stand=FALSE,labels=4,lines=1,color=TRUE)
> c$Distances
     [,1] [,2] [,3] [,4] [,5]
[1,]    0   NA   NA   NA   NA
[2,]   NA    0   NA   NA   NA
[3,]   NA   NA    0   NA   NA
[4,]   NA   NA   NA    0   NA
[5,]   NA   NA   NA   NA    0

Voici mon graphique :
Image

Si quelqu'un peut me dire comment juste obtenir les ellipses et non les points, ce sera bienvenu ! :wink:

On constate toujours le même problème de superposition de classes.
Il est vrai que dans l'aide, il est indiqué que cela s'applique souvent sur des algorithmes de classification variantes du kmeans, et non précisément le kmeans. Est-ce que mon problème pourrait venir que ce genre de graphique n'est interprétable que pour d'autres classifications que le kmeans ? :?

Merci pour votre aide.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 13 Juil 2007, 11:07

Bonjour,

Pour enlever les points : col.p="transparent". Après il se peut aussi que tes classes n'aient pas de sens et que de ce fait les ellipses se superposent. Soit c'est un problème graphique soit ça n'a pas de sens. Pour ce qui est des valeurs de l'ACP Nico te propose d'utiliser les coordonnées de tes points sur les axes de l'ACP (ACP$li). Sur lesquels tu peux aussi faire une kmean et regarder ensuite la pertinence de la kmean.

Maxime

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 13 Juil 2007, 11:46

Pour les valeurs de l'ACP, c'est donné dans le message de Maxime :)

une autre méthode consiste à utiliser un dendrogramme afin de calculer les classes. Tu peux calculer les distances entre les points de l'ACP avec la fonction dist.dudi() puis utiliser la matrice de distance obtenue dans la fonction hclust(). Je pense que tu devrais obtenir des classes utilisables graphiquement dans le plan de l'ACP.

Avec clusplot, il faut peut être utiliser les clusters issus de la fonction hclust qui par défaut utilise un algorithme de Ward.

Héléna Castermant
Messages : 39
Enregistré le : 08 Juin 2007, 07:40

Messagepar Héléna Castermant » 13 Juil 2007, 12:15

Re,

Merci tout d'abord de prendre le temps de répondre.
Alors, je ne pense pas que je doive utiliser les coordonnées acp$li pour faire le graphique, car c'est bien un kmeans sur le tableau de données de départ que je dois faire...Je ne comprends pas mes résultats, dans beaucoup de livres pourtant cela est fait, mais il est vrai que je n'ai jamais vu la programmation de leurs graphiques...
J'ai voulu néanmoins essayer ton idée Nicolas d'utiliser les coordonnées acp$li, voici mon code :

Code : Tout sélectionner

> donnees<-read.table("N:/G_GRD/RESERVE/Z_CASTERMANT/donnees.txt",header=FALSE,sep="\t")
> donnees2<-scale(donnees,center=TRUE,scale=TRUE)
> library(ade4)
> acp<- dudi.pca(donnees) # a normed PCA
Select the number of axes: 2
> cl2<-kmeans(acp$li,5)
> s.class(acp$li,as.factor(cl2$cluster))

Je vous épargne le graphique, qui est très proche des précédents...

Quant à ta suggestion Nicolas d'utiliser un dendogramme, je crois que je ne peux pas le faire pour cause de mémoire. J'ai plus de 175000 observations, donc je ne peux pas utiliser hclust, sauf dans le cas d'une classification mixte.

La question que je me pose actuellement surtout est de savoir si tout ceci veut dire qu'une classification est inadaptée à mon tableau de données ? Il est vrai que je n'ai que 3 variables et qu'elles ne sont pas très pertinentes. De plus, beaucoup de mes points (sur les plus de 175000) se "ressemblent" au niveau des données.

Si vous avez d'autres remarques, n'hésitez pas, car là je suis vraiment perdue... :cry:

Merci à vous.

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 13 Juil 2007, 12:36

premier point : ton plan est il équilibré ? autement dit as tu autant d'observations dans chacune de tes classes ? Si ce n'est vraiment pas le cas alors il faut voir à faire un peu de tri.
Tu as une classe qui est très étalée et du coup qui écrase peut être la différence entre les autres. Enlève cette classe et regardes ce que ça donne a niveau graphique.
Enfin regardes l'analyse between de ton ACP (fonction between() du package ade4) et tu peux faire un randtest.between sur cette analyse ce qui te donnera le% d'inertie explqué par tes classes dans l'ACP ainsi qu'une p-value (très souvent significative en raison de la méthode). Après il faut être prudent et regarder l'inertie totale de ton nuage car le test ne te donne qu'un pourcentage et un pourcentage de rien ça fait toujours rien :D

Héléna Castermant
Messages : 39
Enregistré le : 08 Juin 2007, 07:40

Messagepar Héléna Castermant » 17 Juil 2007, 09:54

Merci Nicolas pour tes réponses ! Désolée d'avoir mis du temps à te répondre.

premier point : ton plan est il équilibré ? autement dit as tu autant d'observations dans chacune de tes classes ? Si ce n'est vraiment pas le cas alors il faut voir à faire un peu de tri.

Oui, mon plan est équilibré, même si la classe la plus étalée a légèrement un effectif plus faible.
Cependant, j'ai effectué un tri sur les données, donc j'en ai moins. Il s'agissait de données, qui de l'avis d'experts, n'auraient pas pu être à risque, et je cherche avec ma classification à déterminer une (ou des)classes à risque.

J'ai regardé l'analyse between et le randtest dont tu parles, mais j'avoue ne pas comprendre d'où sortent les résultats. J'ai cru comprendre sur le net, qu'il s'agit d'analyse de co-inertie et le randtest renvoie à un test de Monte Carlo, et ce sont des choses que je n'ai jamais étudié. J'essaie actuellement de me documenter là dessus.
En tout cas, tu parles de regarder l'inertie totale du nuage, et justement je me demandais que ce soit avec kmeans, ou hclust, comment obtient-on les inerties intra et inter ? J'ai juste trouvé pour kmeans, withinss qui renvoie les inerties intra-classes... :oops:

Merci encore pour vos réponses.

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 19 Juil 2007, 08:26

bonjour,

J'ai regardé l'analyse between et le randtest dont tu parles, mais j'avoue ne pas comprendre d'où sortent les résultats. J'ai cru comprendre sur le net, qu'il s'agit d'analyse de co-inertie ...


non, ce n'est pas juste.

J'essaie actuellement de me documenter là dessus.


sage décision (adresse utile : http://pbil.univ-lyon1.fr/R/enseignement.html)


pour le reste, je ne souhaite pas rentrer dans le débat.
je suis assez en accord avec un certain nombre des posts qui on été supprimés.


en espérant avoir aidé un peu


@+

Pierre
=@===--------¬-------¬------¬-----¬
liens utiles :
http://www.gnurou.org/Writing/SmartQuestionsFr
http://neogrifter.free.fr/welcomeOnInternet.jpg
]<((((*< -------------------------------

Héléna Castermant
Messages : 39
Enregistré le : 08 Juin 2007, 07:40

Messagepar Héléna Castermant » 19 Juil 2007, 08:46

Bonjour,

Merci pour votre réponse Pierre et pour le lien.

non, ce n'est pas juste.

Comme quoi, je n'ai vraiment pas compris...

pour le reste, je ne souhaite pas rentrer dans le débat.
je suis assez en accord avec un certain nombre des posts qui on été supprimés.

Merci pour votre franchise et surtout de répondre si vous pensez cela. Chacun ses opinions, je ne le prends pas mal tant que l'on me respecte.

A plus.

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 16 Aoû 2007, 13:06

Logez Maxime a écrit :Re,

c'est parce que cl$cluster n'est pas un facteur. Essaie s.chull(acp$li,as.factor(cl$cluster),optchull=1,cpoint=1)

Maxime



Bonjour je rebondis sur ce sujet qui m'interesse pour la représentation graphique d'enveloppes convexes de clusters.

En effet, après une acm, je tente le même code que précedemment, c'est à dire

> s.class(res$li,as.factor(cl$cluster),col=coul)

res étant le résultat de dudi.acm

à priori cela fonctionne mal ou bien je ne sais pas bien interpréter mon graphe. Mon d est égal à 50 déjà, puis j'ai juste un petit carré orange qui représente ma classe 5... peut etre que je ne vois pas mes autres classes car elles sont orientés différemment?

Bref si quelqu'un est en mesure de m'aider merci d'avance :)


[/img]

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 16 Aoû 2007, 13:47

Bonjour,

Peut-être devrais-tu ouvrir un autre post. De plus juste la dernière commande ne permet pas trop de savoir d'ou vient le problème. Si je reprends ce qui a ete fait plus haut je suppose que tu as fait un truc dans le genre :

Code : Tout sélectionner

library(ade4)
data(banque)
acm1 <- dudi.acm(banque,scannf=F,nf=20)
cl <- kmeans(acm1$li,5)
coul<-c("red","green","black","blue","orange")
s.class(acm1$li,as.factor(cl$cluster),col=coul)
# tu peux aussi essayé
s.chull(acp$li,as.factor(cl$cluster),optchull=1,cpoint=0,col=coul)


Maxime

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 16 Aoû 2007, 14:04

Salut Maxime

oui j'ai exactement fait ça!

Mais graphiquement ca ne donne vraiment rien de top comme je l'expliquais tout à l'heure. Ta ligne de commande non plus...

Ce d=50 doit y etre pour quelque chose je suppose

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 20 Aoû 2007, 08:29

Bonjour,


Le fait que tu ais un d=50 provient sûrement de modalités de tes facteurs qui sont très peu représentés et qui du coup tir l'analyse, un peu comme des corresponsdances pointues dans une AFC. Tu devrais commencé par faire un summary du tableau que tu analyses pour vérifier ceci.

Maxime

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 20 Aoû 2007, 10:02

j'ai modifié mon tableau de départ, rajouté une colonne et cela est nettement mieux...

Je te remercie Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité