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 :

séquençage d'une variable continue


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 9
    Par défaut séquençage d'une variable continue
    Bonjour à tous,

    j'ai une variable indépendante X continue (qui s'étend de 0.005 à 0.240) et une variable dépendante Y binomiale. Je souhaiterais diviser en plusieurs intervalles réguliers X puis créer un tableau de contingence qui compterait le nombre de 0 et de 1 de la variable Y pour chaque intervalle créé.

    Je le fais pour le moment manuellement dans Excel grâce à un filtre numérique mais ça prend un temps fou et je suis sûre que ça pourrait ne prendre que quelques minutes dans R!

    Merci d'avance pour vos conseils!

  2. #2
    Membre émérite

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Billets dans le blog
    2
    Par défaut
    Exemple de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Z<-seq(0.005, 0.240, by = (0.005-0.240)/le_pas)
    data <- data.frame(X, Y)
    data <- data[order(data$X),]
    aggregate(data$Y, by = data$Z)
    Avec ce petit code, tu devrais pouvoir obtenir le nombre de 1 de Y dans chaque intervalle entre 0.005 et 0.240 (avec un pas "le_pas"). Les données sont trié en ordre croissant pour la variable data pour faire correspondre la séquence Z avec X. Cela suppose que des données X soit continue et linéaire tout comme Z.

  3. #3
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 9
    Par défaut
    Merci beaucoup, ça me semble une bonne piste, par contre j'ai des messages d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > aggregate(data$Y, by = data$Z)
    Erreur dans match.fun(FUN) : 
    l'argument "FUN" est manquant, avec aucune valeur par défaut
    Alors j'ai essayé comme fonction SUM mais j'ai du coup un autre message d'erreur qui s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > aggregate(data$Y, by = data$Z, FUN=sum)
    Erreur dans aggregate.data.frame(as.data.frame(x), ...) : 
      'by' doit être une liste

  4. #4
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 9
    Par défaut erreur: 'by' doit être une liste
    J'ai trouvé une solution pour l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aggregate(data$Y, by = data$Z, FUN=sum)
    Erreur dans aggregate.data.frame(as.data.frame(x), ...) : 
      'by' doit être une liste
    qui est d'ajouter la fonction list():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Z<-list(seq(0.005, 0.240, by = (0.005-0.240)/le_pas))
    Mais j'ai maintenant un nouveau message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aggregate(data$Y, by = Z, FUN=sum)
    Erreur dans aggregate.data.frame(as.data.frame(x), ...) : 
      les arguments doivent avoir la même longueur

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Par défaut
    Bonjour,

    La fonction cut permet de découper une variable en facteur, ci-dessous tu trouveras un exemple d'utilisation.

    N'hésite pas à consulter l'aide R :
    ?cut
    ?by
    ?tapply
    et
    ?do.call.

    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
     
    # jeu de donnees pour l'exemple
    donnees <- data.frame(
    	X=runif(200, 0.005, 240),
    	Y=sample(x=c(1,0), size=200, replace=TRUE)
    )
    donnees$Y <- as.factor(donnees$Y)
     
    # utilisation de la fonction cut pour découper une variable en un nombre de classes
    # et qui affecte chaque ligne du data.frame à la classe calculée
     
    donnees$X.categories <- cut(donnees$X, breaks=10)
     
    # ensuite il y a plusieurs manières de faire le comptage, je préfère la seconde option
    # solution moche
    tapply(donnees$X.categories, donnees$Y, summary)
     
    # solution sympa mais plus compliquée
    do.call(rbind, 
    	by(data=donnees, INDICES=list(X=donnees$X.categories),function(X){
    		return(data.frame(
    			Y.1=length(X$Y[X$Y==1]),
    			Y.0=length(X$Y[X$Y==0])
    			)
    		)
    	})
    )

  6. #6
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 9
    Par défaut
    Merci beaucoup pour cette autre astuce!

    J'ai cependant un nouveau message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    donnees$Y <- as.factor(donnees$Y)
    Erreur dans `$<-.data.frame`(`*tmp*`, "Y", value = c(1L, 1L, 1L, 1L, 1L,  : 
    replacement has 14464 rows, data has 200
    Que j'ai essayé de contourner en utilisant un autre code qui m'affiche un autre message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    donnees$Y <- as.factor(donnees[,Y])
    Erreur dans sort.list(y) : 'x' doit être atomique pour 'sort.list'
    Avez-vous appelé 'sort' sur une liste ?

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Par défaut
    Bonjour,

    Le code que j'ai indiqué est un exemple prêt à tourner (si tu copies colle dans ta console R l'exemple tourneras et fonctionneras) indépendant de tes données.
    La première partie est juste la création d'un jeu de données factice qui comporte 2 colonnes :
    - une colonne X : variable aléatoire, je tire au hasard selon une loi uniforme 200 valeurs comprises entre 0.005 et 240 (fonction runif).
    - une colonne Y : là encore 200 tirages aléatoires (avec remise) des valeurs 1 ou 0 (fonction sample). Mais cette variable est donc un facteur (as.factor).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    # jeu de donnees pour l'exemple
    donnees <- data.frame(
    	X=runif(200, 0.005, 240),
    	Y=sample(x=c(1,0), size=200, replace=TRUE)
    )
    donnees$Y <- as.factor(donnees$Y)
    De cette manière je pensais simuler ton jeu de données mais pas le remplacer :

    j'ai une variable indépendante X continue (qui s'étend de 0.005 à 0.240) et une variable dépendante Y binomiale
    Il faut donc maintenant que tu fasses l'effort d'adapter le code à ton jeu de données, de la construction des données à l'application des fonctions, en n'hésitant pas à consulter les aides qui accompagnent les fonctions :
    - ?data.frame
    - ?as.factor
    - ?do.call
    - ?tapply
    - ? ...

    Ensuite si tu veux de l'aide, n'hésite pas à mettre un peu plus de code dans ton message, il serait ainsi plus facile d'identifier là où tu te trompes.

  8. #8
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 9
    Par défaut
    autant pour moi, j'avais bien adapté les codes à mes données mais je pensais qu'il n'était pas nécessaire de changer le nom des vecteurs que tu avais donné comme les nouveaux remplaceraient automatiquement les anciens du même nom selon moi (mais apparemment non).

    Bref, ça marche à merveille! merci beaucoup!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/01/2015, 18h47
  2. Réponses: 2
    Dernier message: 14/11/2014, 18h39
  3. Réponses: 4
    Dernier message: 07/08/2012, 20h51
  4. Réponses: 0
    Dernier message: 11/07/2012, 11h39
  5. Fonction pour catégoriser une variable continue
    Par joyeux_lapin13 dans le forum R
    Réponses: 8
    Dernier message: 12/04/2011, 14h34

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