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 :

Convertir Factor --> num (NAs introduced by coercion)


Sujet :

R

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Convertir Factor --> num (NAs introduced by coercion)
    Bonjour,

    Lorsque j'essaie de convertir la colonne Health en num
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data$Health<-as.numeric(as.character(data$Health))
    , j'obtiens le message d'alerte suivant:

    Warning message:
    NAs introduced by coercion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > str(data)
    'data.frame':	889 obs. of  6 variables:
     $ Year                        : Factor w/ 2 levels "2002","2003": 1 1 1 1 1 1 1 1 1 1 ...
     $ Health                      : Factor w/ 2 levels "bankruptcy","healthy": 1 1 2 2 1 1 1 2 1 1 ...
     $ EBITDA.Total.Assets         : num  -0.00491 0.08496 0.45284 0.2098 -0.07732 ...
     $ Value.Added.Total.Sales     : num  0.213 0.113 0.484 0.395 0.295 ...
     $ Quick.Ratio                 : num  0.0904 0.946 1.3734 1.2709 0.697 ...
     $ Accounts.Payable.Total.Sales: num  0.2941 0.2854 0.0598 0.2535 0.0558 ...
    Merci,

  2. #2
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Si f est un facteur as.character( f) transforme le vecteur de niveaux du facteur en un vecteur de chaines de caractères qui correspondent aux étiquettes des niveaux (labels pour R). Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    as.character(data$Health)
    va donner un vecteur contenant des chaines de caractères dont les valeurs seront des "bankruptcy" et des "healthy".
    De ce fait, la transformation as.numeric ne peut pas se faire puisqu'on essaie alors de transformer en numériques des chaînes de caractères qui ne codent pas des valeurs numériques.

    as.numeric (f) va transformer le vecteur en numériques qui correspondent au codage interne à R des niveaux du facteurs, i.e. 1, 2 (voir la fonction mode). Les valeurs numériques obtenues n'ont rien à voir avec le fait que le facteur peut coder des scores exprimés sous forme d'un nombre. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CDR <- factor( c( 0, 0.5, 1, 2, 3))
    CDR
    [1] 0   0.5 1   2   3  
    Levels: 0 0.5 1 2 3
     
    as.numeric( CDR)
    [1] 1 2 3 4 5
    Alors une question essentielle, quel est l'intérêt de transformer un facteur en valeurs numériques si les niveaux exprimés en numériques n'ont aucun sens ? Quand on veut coder le fait qu'il y a un ordre sur les niveaux, il est plus judicieux de déclarer le facteur comme ordonné (argument ordered du constructeur factor).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Merci Faubry pour votre réponse.

    En fait je suis entrain de m'initier au langage R à travers un tutoriel qui se trouve à l'adresse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    https://www.r-bloggers.com/fitting-a-neural-network-in-r-neuralnet-package/
    .

    La variable à expliquer dans le tutoriel est de type num (medv) et la structure de la table est comme suit:

    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
    'data.frame':	506 obs. of  14 variables:
     $ crim   : num  0.00632 0.02731 0.02729 0.03237 0.06905 ...
     $ zn     : num  18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
     $ indus  : num  2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
     $ chas   : int  0 0 0 0 0 0 0 0 0 0 ...
     $ nox    : num  0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
     $ rm     : num  6.58 6.42 7.18 7 7.15 ...
     $ age    : num  65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
     $ dis    : num  4.09 4.97 4.97 6.06 6.06 ...
     $ rad    : int  1 2 2 3 3 3 5 5 5 5 ...
     $ tax    : num  296 242 242 222 222 222 311 311 311 311 ...
     $ ptratio: num  15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
     $ black  : num  397 397 393 395 397 ...
     $ lstat  : num  4.98 9.14 4.03 2.94 5.33 ...
     $ medv   : num  24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
    Je souhaiterai utilisé le même tutoriel mais sur une autre base en voulant expliquer la variable (Health) qui est type factor.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    'data.frame':	889 obs. of  6 variables:
     $ Year                        : Factor w/ 2 levels "2002","2003": 1 1 1 1 1 1 1 1 1 1 ...
     $ Health                      : Factor w/ 2 levels "bankruptcy","healthy": 1 1 2 2 1 1 1 2 1 1 ...
     $ EBITDA.Total.Assets         : num  -0.00491 0.08496 0.45284 0.2098 -0.07732 ...
     $ Value.Added.Total.Sales     : num  0.213 0.113 0.484 0.395 0.295 ...
     $ Quick.Ratio                 : num  0.0904 0.946 1.3734 1.2709 0.697 ...
     $ Accounts.Payable.Total.Sales: num  0.2941 0.2854 0.0598 0.2535 0.0558 ...
    La première commande que j'ai modifiée est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lm.fit <- glm(medv~., data=train)
    j'ai remplacé medv par health en ajoutant family=binomial à la fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lm.fit <- glm(Health~., data=train, family=binomial)
    Lorsque j'essaie de modifier la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MSE.lm <- sum((pr.lm - test$Health)^2)/nrow(test)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MSE.lm <- sum((pr.lm - test$Health)^2)/nrow(test)
    ,

    j'obtiens l'erreur suivante:

    Warning message:
    In Ops.factor(pr.lm, test$Health) : ‘-’ not meaningful for factors
    C'est pourquoi j'ai pensé qu'il fallait changer le type de ma variable.

    Cordialement,

  4. #4
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Il s'agit d'un problème de statistiques. La variable Health étant une variable binaire, elle ne peut qu'être analysée par une procédure qui sait traiter une telle variable comme variable dépendante : il s'agit de la régression logistique qui se code par glm avec family=binomial. On peut éventuellement transformer cette valeur en la codant sous forme d'une indicatrice, par exemple 0 si healthy et 1 dans l'autre cas. Cependant, dans tous les cas, il faudra utiliser glm et family=binary. Ce type de transformation et le fait que cela devient implicitement une indicatrice est en effet utilisé par certaines procédures (cf. PLS-DA) mais il est vrai que les hypothèses sous-jacentes (notamment que cela revient plus ou moins à de la régression logistique) sont rarement expliquées et quand elles le sont, pas toujours très clairement.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Je vous remercie pour votre réactivité.

    En fait j'ai modifié le post car je m'étais trompé dans la commande.

    Après la première commande que j'ai corrigée en rajoutant family=binomial, lorsque j'exécute la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MSE.lm <- sum((pr.lm - test$Health)^2)/nrow(test)
    j'obtiens l'erreur suivante:

    Warning message:
    In Ops.factor(pr.lm, test$Health) : ‘-’ not meaningful for factors
    Merci,

  6. #6
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    test$Health est un facteur, donc une variable nominale. De ce fait, la soustraction (pr.lm - test$Health) n'a pas de sens. Mais d'où vient ce pr.lm ? Et qu'est test ?
    De plus, je ne comprends pas ce que tu essaies de calculer par MSE.lm.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    En fait je cherche à reproduire le tutoriel qui se trouve à l'adresse

    https://www.r-bloggers.com/fitting-a...alnet-package/

    avec les mêmes graphiques en utilisant la base de données finance que j'ai mentionnée précédemment et en utilisant comme variable explicative (health) au lieu de (medv) [variable de la base de données BOSTON.

    Et sinon pr vient de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    index <- sample(1:nrow(data),round(0.75*nrow(data)))
    train <- data[index,]
    test <- data[-index,]
    lm.fit <- glm(medv~., data=train)
    summary(lm.fit)
    pr.lm <- predict(lm.fit,test)
    MSE.lm <- sum((pr.lm - test$medv)^2)/nrow(test)
    Merci.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Pour convertir j'ai du faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data$Health <- as.numeric(as.factor(data$Health))

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

Discussions similaires

  1. problème format de données de "factor" à "num"
    Par Florence Magnin dans le forum R
    Réponses: 1
    Dernier message: 07/05/2012, 11h32
  2. Réponses: 2
    Dernier message: 20/09/2009, 20h31
  3. Convertir un num de colonne par sa lettre
    Par yahi.jye dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/10/2008, 04h19
  4. Réponses: 4
    Dernier message: 06/06/2004, 13h07
  5. convertir un nom long (win32) en format dos (8+3)
    Par kylekiller dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2002, 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