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 :

Classes et intervalles sur variables quantitatives


Sujet :

R

  1. #1
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Par défaut Classes et intervalles sur variables quantitatives
    Je continue ma découverte de R...
    Et du coup je me trouve encore confronté à des problèmes de représentation de mes données afin d'en tirer le maximum d'info sans implémentation supplémentaire.
    J'ai un tableau de classes de taux de cholesterol et l'effectif pour chaque classe :

    [1.0,1.4[ n=6
    [1.4,1.6[ n=13
    [1.6,1.8[ n=16
    [1.8,2.0[ n=22
    [2.0,2.2[ n=18
    [2.2,2.4[ n=10
    [2.4,2.6[ n=6
    [2.6,2.8[ n=4
    [2.8,3.0[ n=3
    [3.0,3.4[ n=2

    J'ai fait ceci :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    # vecteur des classes : 11 valeurs et
    # produira les 10 classes suivantes :
    # 1 a 1.4
    # 1.4 a 1.6
    # 1.6 a 1.8
    # 1.8 a 2
    # 2 a 2.2
    # 2.2 a 2.4
    # 2.4 a 2.6
    # 2.6 a 2.8
    # 2.8 a 3
    # 3 a 3.4
    > classes<-c(1,1.4,1.6,1.8,2,2.2,2.4,2.6,2.8,3,3.4)
    > classes
     [1] 1.0 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.4
     
    # vecteur des effectifs pour chaque classe
    # doit avoir 11 effectifs aussi pour etre
    # compatible avec le vecteur de classes :
    # on ajoute 0 pour les derniers effectif
    > effectifs<-c(6,13,16,22,18,10,6,4,3,2,0)
    > effectifs
     [1]  6 13 16 22 18 10  6  4  3  2  0
     
    # on replique pour chaque classe (debut de classe)
    # suivant les effectifs =>
    # 6 valeurs 1.0 pour la classe [1.0,1.2[
    # 13 valeurs 1.4 pour la classe [1.2,1.4[
    # ...
    # 2 valeurs pour la classe [3.0,+[
    > taux<-rep(classes,effectifs)
    > taux
      [1] 1.0 1.0 1.0 1.0 1.0 1.0 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4
     [19] 1.4 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.6 1.8
     [37] 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8 1.8
     [55] 1.8 1.8 1.8 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
     [73] 2.0 2.0 2.0 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.4 2.4 2.4 2.4 2.4
     [91] 2.4 2.6 2.6 2.6 2.6 2.8 2.8 2.8 3.0 3.0
     
    # création des classes elles-mêmes :
    # right = FALSE pour avoir un intervalle de la forme [x,y[
    > chol_table<-cut(taux,classes,right=FALSE)
    # on obtient bien :
    # 6 valeurs dans la classe [1,1.4[
    # 13 valeurs dans la classe [1.4,1.6[
    # ...
    # 2 valeurs dans la classe [3,3.4[
    > chol_table
      [1] [1,1.4)   [1,1.4)   [1,1.4)   [1,1.4)   [1,1.4)   [1,1.4)   [1.4,1.6)
      [8] [1.4,1.6) [1.4,1.6) [1.4,1.6) [1.4,1.6) [1.4,1.6) [1.4,1.6) [1.4,1.6)
     [15] [1.4,1.6) [1.4,1.6) [1.4,1.6) [1.4,1.6) [1.4,1.6) [1.6,1.8) [1.6,1.8)
     [22] [1.6,1.8) [1.6,1.8) [1.6,1.8) [1.6,1.8) [1.6,1.8) [1.6,1.8) [1.6,1.8)
     [29] [1.6,1.8) [1.6,1.8) [1.6,1.8) [1.6,1.8) [1.6,1.8) [1.6,1.8) [1.6,1.8)
     [36] [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)
     [43] [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)
     [50] [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)   [1.8,2)
     [57] [1.8,2)   [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)
     [64] [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)
     [71] [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)   [2,2.2)   [2.2,2.4) [2.2,2.4)
     [78] [2.2,2.4) [2.2,2.4) [2.2,2.4) [2.2,2.4) [2.2,2.4) [2.2,2.4) [2.2,2.4)
     [85] [2.2,2.4) [2.4,2.6) [2.4,2.6) [2.4,2.6) [2.4,2.6) [2.4,2.6) [2.4,2.6)
     [92] [2.6,2.8) [2.6,2.8) [2.6,2.8) [2.6,2.8) [2.8,3)   [2.8,3)   [2.8,3)
     [99] [3,3.4)   [3,3.4)
    10 Levels: [1,1.4) [1.4,1.6) [1.6,1.8) [1.8,2) [2,2.2) [2.2,2.4) ... [3,3.4)
    Bon la représentation me semble convenable même si j'ai mis les derniers effectifs à 0 pour avoir 2 vecteurs de même dimension.
    Le souci c'est que l'objet chol_table obtenu est un "factor" et que la moyenne dessus ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    > mean(chol_table)
    [1] NA
    Warning message:
    In mean.default(chol_table) :
      l'argument n'est ni numérique, ni logique : renvoi de NA
    Et summary ne me donne ni moyenne, ni quantiles mais seulement les effectifs par classe (ce qui est déjà pas mal puisque cohérent avec mes données...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    > summary(chol_table)
      [1,1.4) [1.4,1.6) [1.6,1.8)   [1.8,2)   [2,2.2) [2.2,2.4) [2.4,2.6) [2.6,2.8) 
            6        13        16        22        18        10         6         4 
      [2.8,3)   [3,3.4) 
            3         2
    Merci pour toutes vos pistes et aide.

  2. #2
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    En fait pour faire une moyenne tu as besoin de créer un vecteur avec les centres de classes
    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
    33
    34
    35
    > classes.c <- sapply(2:length(classes), 
    +                     function(i)
    +                     {
    +                        mean(classes[(i-1):i])
    +                     })
     
    > effectifs <- c(6, 13, 16, 22, 18, 10, 6, 4, 3, 2, 0)
     
    > taux <- rep(classes, effectifs)
     
    # Pour être sûr de ne pas avoir d'erreur à cause des bornes, tu peux également le créer avec les centres de classes (en plus tu verras qu'il peut-être utilisé directement après) :
    > effectifs2 <- c(6,13,16,22,18,10,6,4,3,2)  # pas besoin de 0 à la fin
    > taux2 <- rep(classes.c, effectifs2)
    > taux2
      [1] 1.2 1.2 1.2 1.2 1.2 1.2 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
     [19] 1.5 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.7 1.9
     [37] 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9 1.9
     [55] 1.9 1.9 1.9 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.1 2.1
     [73] 2.1 2.1 2.1 2.3 2.3 2.3 2.3 2.3 2.3 2.3 2.3 2.3 2.3 2.5 2.5 2.5 2.5 2.5
     [91] 2.5 2.7 2.7 2.7 2.7 2.9 2.9 2.9 3.2 3.2
     
    > chol_table <- cut(taux2, classes, right=FALSE)
     
    # Tu peux nommer les centres de classes pour pouvoir les indexer avec les noms de classes :
    > names(classes.c) <- levels(chol_table)
     
    > mean(classes.c[as.character(chol_table)])
    [1] 1.974
     
    # Mais pas vraiment besoin d'aller jusque là :
    > mean(taux2)
    [1] 1.974
     
    > weighted.mean(classes.c, effectifs2)
    [1] 1.974

  3. #3
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 259
    Par défaut
    Retour de week-end, merci pour la réponse !
    Une fois celle-ci lue, cela semble si facile...

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

Discussions similaires

  1. retour à la ligne sur variable DOS
    Par Goldorak2 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 29/03/2007, 17h32
  2. Réponses: 8
    Dernier message: 20/02/2006, 15h28
  3. Réponses: 15
    Dernier message: 29/12/2005, 10h32
  4. Comparaison sur variable de type Binary (32)
    Par krapno dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/10/2005, 12h48
  5. Faire un select sur une quantité défini d'élément
    Par tripper.dim dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2005, 11h14

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