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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 37
    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
    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 : 37
    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
    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 habitué
    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
    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 : 37
    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
    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 habitué
    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
    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 habitué
    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
    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.

+ 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