IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Description de classes (suite à un dendrogramme) avec poids sur les individus


Sujet :

R

  1. #1
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut Description de classes (suite à un dendrogramme) avec poids sur les individus
    Bonjour à tous,

    Je dispose d'un jeu de données composé de variables qualitatives et d'une variable numérique de "poids". Je réalise une ACM pondérée sur ces données à l'aide de la fonction MCA (du package "FactoMineR"). Par la suite, je réalise une classification hierarchique sur les composantes de l'ACM que j'ai préalablement sélectionnée, à l'aide de la fonction hclust.
    Une fois mes individus séparés en k groupes, je souhaite obtenir la description de chacun de ces groupes. Pour cela j'utilise la fonction catdes (du package "FactoMineR") en lui donnant en argument les variables qualitatives de mon jeu de données initial ainsi qu'une variable "groupe" ayant k modalités différentes.

    Le problème est que les valeurs en sortie de la fonction catdes sont calculées sur les données brutes intiales et ne prennent donc pas en compte ma variable de "poids". La fonction catdes n'a pas d'argument permettant de lui indiquer le poids des individus d'un jeu de données et je ne peux pas simplement modifier mes variables initiales en leur appliquant un poids car j'aurais alors des variables quantitatives et ce n'est pas ce qui m'intéresse.

    J'ai commencé à rechercher une autre fonction de description de classes qui pourrait prendre en compte le poids sur les individus mais pour le moment je n'ai rien trouvé. Toutes les pistes que vous pourrez avoir m'intéressent et si mon problème n'est pas assez clair, n'hésitez pas à me poser des questions !

    Merci d'avance


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bon alors, je n'ai pas réussi à trouver de fonctions permettant de faire ce que je souhaite (mais si jamais quelqu'un passe par là et peut me répondre, n'hésitez pas ).

    Du coup, je suis repartie de la fonction catdes (du package "FactoMineR") que j'ai modifiée à ma sauce.
    Pour info, pour ajouter la prise en compte du poids sur les individus, j'ai ajouté un argument "weight" à la fonction et l'ai par exemple ajouté lors des appels à xtabs comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table <- xtabs(weight~donnee[, num.var] + donnee[, quali[i]])


    A. D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Je suis confrontée à la même problématique que vous et je ne comprends pas votre solution. Pouvez-vous m'éclaircir dessus svp:
    - quand vous dites avoir modifié la fonction catdes, qu'avez-vous fait?
    - comment avez-vous utilisé xtabs que vous avez créé?

    Merci d'avance pour votre réponse

    P. G.

  4. #4
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Vous pouvez accéder au code de la fonction "catdes" comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    library(FactoMineR)
     
    catdes
    Ensuite, je n'ai quasiment pas touché au code de la fonction, j'ai juste rajouté les éléments suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    mycatdes<-function (donnee, num.var, proba = 0.05, weight) 
    {
    
    [...]
    
     if (nb.quali > 0) {
            options(warn = -1)
            Test.chi = matrix(NA, nrow = nb.quali, ncol = 2)
            marge.li = xtabs(weight~donnee[, num.var])
            nom = tri = structure(vector(mode = "list", length = nb.modalite), 
                names = levels(donnee[, num.var]))
            for (i in 1:nb.quali) {
                Table <- xtabs(weight~donnee[, num.var] + donnee[, quali[i]])
                marge.col = xtabs(weight~donnee[, quali[i]])
                Test <- chisq.test(Table, correct = FALSE)
    
    [...]
    
    }
    Avec "weight" qui est le vecteur des poids de chacun de mes individus.

    NB: Je n'ai pas touché à la partie concernant les variables quantitatives car je ne traite que des variables qualitatives ! Si vous traitez des variables quantitatives, n'oubliez pas de modifier également la partie correspondante.

    Est-ce que cela vous paraît clair? Sinon n'hésitez pas à poser d'autres questions.
    Et si vous entendez parler d'une fonction déjà implémentée dans R qui fait cela, je suis intéressée !


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour votre réponse.

    Ca marche parfaitement pour les variables qualitatives.
    Malheureusement, j'ai également des variables quantitatives et n'arrive pas à déchiffrer le code pour savoir où je dois rajouter la commande de poids.
    Pouvez-vous m'aider là-dessus? Sinon, je me plongerai plus longuement dans le code.

    Concernant votre demande sur un autre programme qui le ferait, je n'en ai pour l'instant pas trouvé.

    Merci en tout cas pour votre aide.
    P. G.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Je me suis plongée dans le code et ai trouvé les lignes à changer. Malheureusement cela ne semble pas fonctionner: j'obtiens le message suivant pour le weighted.mean dans la fonction by (alors que le weighted.mean quelques lignes plus bas fonctionne parfaitement):
    [12] ERREUR:
    'x' and 'w' must have the same length
    Je ne comprends pas parce que les deux variables ont la même longueur (en ne prenant pas en compte les valeurs manquantes). Quelqu'un aurait une idée d'où vient le problème, ou sinon une notice détaillée sur la fonction BY?

    Voici mon code avec la prise en compte du poids (en rouge):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    mycatdes<-function (donnee, num.var, proba = 0.05, weight) 
    [...]
     if (!is.null(quanti)) {
            nom = result = structure(vector(mode = "list", length = nb.modalite), 
                names = levels(donnee[, num.var]))
            for (i in 1:length(quanti)) {
                moy.mod = by(donnee[, quanti[i]], donnee[, num.var], 
                    weighted.mean,w=weight, na.rm = TRUE)
                n.mod = summary(donnee[, num.var])
                sd.mod = by(donnee[, quanti[i]], donnee[, num.var], 
                    sd, na.rm = TRUE)
                sd.mod = sd.mod * sqrt((n.mod - rep(1, nb.modalite))/n.mod)
                moy = weighted.mean(donnee[, quanti[i]],weight, na.rm = TRUE)
                et = sd(donnee[, quanti[i]], na.rm = TRUE) * sqrt(1 - 
                    1/sum(n.mod))
                for (j in 1:nb.modalite) {
                    v.test = (moy.mod[j] - moy)/et * sqrt(n.mod[j])/sqrt((sum(n.mod) - 
                      n.mod[j])/(sum(n.mod) - 1))
                    p.value = pnorm(abs(v.test), lower.tail = FALSE) * 
                      2
                    if (!is.na(v.test)) {
                      if (abs(v.test) > -qnorm(proba/2)) {
                        result[[j]] = rbind(result[[j]], c(v.test, 
                          moy.mod[j], moy, sd.mod[j], et, p.value))
                        nom[[j]] = c(nom[[j]], colnames(donnee)[quanti[i]])
                      }
                    }
                }
            }
    
    [...]
    Merci d'avance pour votre réponse.

    P. G.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bon, j'ai avancé sur le problème même si je ne suis pas encore arrivée à une solution !

    Le problème vient effectivement de la fonction BY : elle attend dans le paramètre weight un vecteur de taille ni où ni=nombre d'individus dans le niveau i. Or je lui transmets l'ensemble des poids soit n valeurs (n=somme des ni).

    Il faudrait donc que je sélectionne les poids des individus appartenant au niveau i.
    Or je n'y arrive pas en utilisant le code:
    où je demande de sélectionner la 2ème colonne (celle des poids) du tableau TAB où les lignes respectent la condition : valeur en 3ème colonne (celle des niveaux) = 1.

    Ce code fonctionnerait si je voulais les poids du niveau 1. Or via la fonction BY, le niveau est incrémenté automatiquement et je n'arrive pas à l'inclure dans la condition.

    Savez-vous comment faire?

    Merci d'avance

    P. G.

  8. #8
    Membre habitué
    Homme Profil pro
    Analyste
    Inscrit en
    Février 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Février 2012
    Messages : 62
    Points : 143
    Points
    143
    Par défaut
    Bonsoir,

    Peut-être cela fonctionnera-t-il :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[which(tab[,3]=="1"),2]
    ou...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[which(tab[,3]==1),2]
    ...si la troisième colonne de tab contient des numeric et non des chaînes de caractères comme le laisse penser les guillemets.

    Bon courage et bonne soirée

    Guinue

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    En fait, je me suis mal exprimée : la condition fonctionne seule mais pas correctement dans un BY comme dans le code ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res4=by(tab[,1],tab[,3],weighted.mean,tab[tab[,3]=="1",2],na.rm = TRUE)
    car il faudrait que la valeur "1" corresponde à la valeur traitée par le BY (soit les différents niveaux de tab[,3] : d'abord 1 puis 2).
    Je pense plus à une macro-variable (ou quelque chose de semblable). Est-ce que cela existe dans R et la fonction BY?
    Merci d'avance.

    P. G.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bon j'y suis presque arrivée mais finalement en passant par la fonction SAPPLY et non BY:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sapply(split(df1,df1[,3]),function(x) weighted.mean(x$var1,x$var2,na.rm = TRUE))
    Par contre, lorsque je veux remplacer le nom des dataframes et des variables par ceux de mon cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    moy.mod=sapply(split(IKEA4,IKEA4[,c("Cluster")]),
      function(x) weighted.mean(x$colnames(IKEA4[19]),x$Poids,na.rm = TRUE))
    j'obtiens ce message d'erreur:
    Erreur dans weighted.mean(x$colnames(IKEA4[19]), x$Poids, na.rm = TRUE) :
    tentative d'appliquer un objet qui n'est pas une fonction
    Il n'aime donc par le colnames mais je ne sais pas comment récupérer autrement le nom de la variable.
    Quelqu'un aurait une idée?

    Merci d'avance
    P. G.

  11. #11
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    J'ai suivi un peu "de loin" votre problématique mais pas vraiment eu le temps de me mettre dedans.
    Je pense que le passage par une fonction de type "sapply" était indispensable dans un tel cas, à cause du problème d'indices pour le vecteur de poids que vous avez rencontré.

    Pour votre dernier soucis, pourquoi ne pas accéder au premier élément directement par le numéro de colonne? Par exemple avec quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    moy.mod=sapply(split(IKEA4,IKEA4[,c("Cluster")]),
      function(x) weighted.mean(x[,19],x$Poids,na.rm = TRUE))
    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Acm avec des poids pour les individus
    Par noura.sas dans le forum SAS STAT
    Réponses: 1
    Dernier message: 08/04/2014, 13h42
  2. Pb avec image sur les boutons
    Par dalton5 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/03/2007, 10h05
  3. [BO]prompt avec filtre sur les valeurs proposées
    Par arnauann dans le forum Deski
    Réponses: 3
    Dernier message: 30/11/2006, 17h00
  4. [XSLT]copie partielle avec condition sur les axes
    Par MasterOfChakhaL dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 13/10/2006, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo