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 :

remplacer NA par valeur interpolée


Sujet :

R

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut remplacer NA par valeur interpolée
    Bonjour,

    j'ai des séries temporelles avec des valeurs manquantes (NA) un peu au hasard.
    J'aimerais remplacer ces NA par une interpolation linéaire des valeurs qui l'encadrent. J'ai donc fait quelques tests avec la fonction "approx" mais j'obtiens un message d'erreur que je ne comprends pas.

    Je sais par exemple que: D[4,2] est NA, D étant mon data frame.
    J'ai donc essayé, après une série de tests et en essayant de réduire la formule au plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AM[4,2] <- approx(AM[3,2],AM[5,2],method="linear")
    Et j'obtiens toujours, peu importe le test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error in approx(AM[3, 2], AM[5, 2], method = "linear") : 
      need at least two non-NA values to interpolate
    Alors que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > AM[3,2]
    [1] -1.75
    > AM[5,2]
    [1] -0.51
    Mes x,y sont bien non-NA.

    Toutefois, il existe sûrement des approches simples et efficaces pour remplacer toutes ces NA par une valeur interpolée. Si vous pouvez m'expliquer la source de ce message d'erreur et partager vos idées sur la façon la plus efficace de remplir les NA d'un data frame de façon efficace, je serais ravie de les lire!

    Merci

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Hello,

    Pour interpoler, il faut au minimum deux points, c'est à dire deux coordonnées x et deux coordonnées y.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    approx(AM[3,2],AM[5,2],method="linear")
    > AM[3,2]
    [1] -1.75
    > AM[5,2]
    [1] -0.51
    La tu dis: "interpoles moi le point d'abscisse -1.75 et d'ordonnée -0.51", ce qui explique l'erreur.


    Je suppose que pour toi, - 1.75 et -0.51 sont deux ordonnées, et que les abscisses sont suivent des pas de temps régulier de 1.
    Donc ca donnerait:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    approx(x=,c(3,5)y=c(AM[3,2],AM[5,2]),method="linear",xout=4),
    où xout précise que tu veux interpoler en x=4.


    D'autre part, interpoler linéairement deux points au milieu de leurs deux abscisses revient à ... faire la moyenne des deux ordonnées qui l'encadrent: (-1.75 -0.51)/2 =-1.13


    Toutefois, il existe sûrement des approches simples et efficaces pour remplacer toutes ces NA par une valeur interpolée.
    Oui, tu peux facilement faire la même chose d'un coup pour tous les points na en utilisant la syntaxe de approx telle que je l'ai écrit sur l'ensemble de ta série.
    Mais est ce vraiment utile? tu n'apportes aucune information nouvelle (pire, tu fausses la volatilité de ta série).


    Edit: ah je viens de voir que ca parlait déjà de ca sur ce sujet:
    http://www.developpez.net/forums/d13...tion-lineaire/

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    oui en effet, je n'avais pas vraiment saisi le sens de la fonction.
    Cependant, j'ai toujours un petit souci. Mon but serait que NA soit remplacé par la valeur interpolée dans mon data frame, or en exécutant cette fonction, j'ai toujours NA.

    Il manque quelque chose?

    Mais est ce vraiment utile? tu n'apportes aucune information nouvelle (pire, tu fausses la volatilité de ta série).
    Oui (enfin je pense) car lorsque je veux agréger mes données par la suite, ces NA me donnent des NA lors de l'agrégation.

    Merci

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Citation Envoyé par Florence Magnin Voir le message
    Bonjour,

    oui en effet, je n'avais pas vraiment saisi le sens de la fonction.
    Cependant, j'ai toujours un petit souci. Mon but serait que NA soit remplacé par la valeur interpolée dans mon data frame, or en exécutant cette fonction, j'ai toujours NA.

    Il manque quelque chose?
    Ben il faut quand même assigner ce que renvoit la fonction approx à ta valeur na ca va pas le faire tout seul (je sais pas si c'est ce qu'il te manquait ou si c'est autre chose):


    Oui (enfin je pense) car lorsque je veux agréger mes données par la suite, ces NA me donnent des NA lors de l'agrégation.

    C'est normal puisqu'une opération sur des NA renvoit NA.
    Je ne pense pas qu'interpoler soit la meilleure solution si c'est juste ca le problème. Tu peux:


    1) Virer tous les na de ton data frame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AM<-AM[!is.na(AM[,2]),]
    2) Ne pas les virer, mais dès que tu fais une opération, tu la fait sur les valeurs non NA. Exemple:

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    j'avais bien pensé à assigner la valeur calculée par l'interpolation à la valeur que je voulais remplacer (voir ma 1ère discussion) mais plusieurs petits soucis.

    Tout d'abord quand je fait avec la nouvelle formulation, j'obtiens ce message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    > AM[4,2] <- approx(x=c(3,5),y=c(AM[3,2],AM[5,2]),method="linear",xout=4)
    Warning message:
    In `[<-.data.frame`(`*tmp*`, 4, 2, value = list(x = 4, y = -1.13)) :
      provided 2 variables to replace 1 variables
    que je 'nai pas si je n'assigne pas la formule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    > approx(x=c(3,5),y=c(AM[3,2],AM[5,2]),method="linear",xout=4)
    $x
    [1] 4
     
    $y
    [1] -1.13
    Mais là je ne comprends pas trop le résultat et je me demande si la fonction approx est bien adaptée à ce que je veux faire: simplement remplacer mes NA dans mon data frame par des valeurs interpolées linéairement entre la dernière valeur et la première valeur non NA.
    Y-a-t'il une autre fonction plus adaptée pour ça?
    En quoi l'assignation montrée ci-dessus pose-t-elle problème?

    Pour ce qui est la suite des calcules avec ou sans NA, merci, je prends note et appliquerait cela suivant les circonstances. Mais quoi qu'il en soit, parvenir à pouvoir facilement interpoler certaines valeurs de mon data frame serait une aide indispensable!!

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    C'est l'élement y qui t'interesse (le x étant déjà donné par le numéro de ligne de ton df).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AM[4,2] <- approx(x=c(3,5),y=c(AM[3,2],AM[5,2]),method="linear",xout=4)$y

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    merci, en effet cela a plus de sens comme ça et je parviens au résultat escompté. Merci beaucoup.

    Seulement, mon idée de départ était de pouvoir l'appliquer sur l'ensemble de mon data frame.
    J'ai donc fait une petite fonction, mais cela ne fonctionne plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     gap <- function(D) { 
      for (j in 2:length(D)) { 
        for (k in 1:length(D[[j]])) {
          if (is.na(D[[j]][k]==T))  {
           k <- approx(x=c(k-1,k+1),y=c(D[[j]][k-1],D[[j]]   [k+1]),method="linear",xout=k)$???}
         }
      }
     }
    j'ai essayé plusieurs choses à la place des NA, mais la encore je doit mal comprendre la logique du langage puisque dans tous les cas, mes NA reste après avoir appliqué cette fonction à AM.
    Je suis donc encore preneuse d'esplications et conseilspour ça.

    Merci d'avance

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Citation Envoyé par Sengar Voir le message
    C'est l'élement y qui t'interesse (le x étant déjà donné par le numéro de ligne de ton df).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AM[4,2] <- approx(x=c(3,5),y=c(AM[3,2],AM[5,2]),method="linear",xout=4)$y

    Pour généraliser à tous les na:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ind<-1:nrow(AM)
    liste.na<-ind[is.na(AM[,2])]
    nona<-ind[!is.na(AM[,2])]
     
     
    AM[liste.na,2] <- approx(x=liste.na,y=AM[nona,2],method="linear",xout=liste.na)$y

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    merci pour l'aide mais j'obtiens quand même un message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error in xy.coords(x, y) : 'x' and 'y' lengths differ
    En effet, la fonction ne semble pas adapatée à cette démarche puisque j'ai plus de non NA que de NA.
    Je vais donc continuer à voir comment spécifier les x et y autrement.
    Merci.

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Citation Envoyé par Florence Magnin Voir le message
    merci pour l'aide mais j'obtiens quand même un message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error in xy.coords(x, y) : 'x' and 'y' lengths differ
    .
    Pardon je me suis planté pour x:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ind<-1:nrow(AM)
    liste.na<-ind[is.na(AM[,2])]
    nona<-ind[!is.na(AM[,2])]
    
    
    AM[liste.na,2] <- approx(x=nona,y=AM[nona,2],method="linear",xout=liste.na)$y

  11. #11
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut Florence Magnin
    Merci, en effet cela a plus de sens.

    Il ne me reste plus qu'à appliquer ça à toutes les colonnes de mon data frame (la solution donnée ne s'applique qu'à la colonne 2, c'est bien ça?) et à l'écrire de façon à pouvoir reproduire la fonction sur n'importe quel data frame.

    Merci

  12. #12
    Membre éclairé

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Points : 816
    Points
    816
    Par défaut
    Bonjour,

    A noter, la méthode d'imputation CopyMean dans le package KmL donne des résultats meilleurs que l'interpolation linéraire.

    Christophe
    Christophe
    Porteur du projet R++ https://rplusplus.com
    YouTubeur https://www.youtube.com/c/lesstatsmemepasmal

  13. #13
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Merci de l'information. Je n'ai pas trouvé cette fonction, mais en la cherchant il m'a semblé que c'était la fonction "imputation", dans laquelle on peut utiliser la méthode "CopyMean", est-ce bien celle-là?

    Merci.

  14. #14
    Membre éclairé

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Points : 816
    Points
    816
    Par défaut
    Oui (désolé pour le manque de précision).

    Si tu as besoin de l'article qui détaille la méthode, je peux te l'envoyer par mail.
    Christophe
    Porteur du projet R++ https://rplusplus.com
    YouTubeur https://www.youtube.com/c/lesstatsmemepasmal

  15. #15
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    Merci.

    Je pense l'avoir trouvée du coup:

    http://jds2012.ulb.ac.be/myreview/fi...ission_272.pdf

    ??

    Merci

  16. #16
    Membre éclairé

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Points : 816
    Points
    816
    Par défaut
    Non, ca c'est la conférence qui va avec. Mais bon, ca suffit pour comprendre la méthode.
    Christophe
    Porteur du projet R++ https://rplusplus.com
    YouTubeur https://www.youtube.com/c/lesstatsmemepasmal

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2010, 14h38
  2. Remplacer variable par sa valeur
    Par bronon dans le forum Langage
    Réponses: 4
    Dernier message: 07/04/2008, 13h37
  3. Remplacer par valeur cellule
    Par ber243 dans le forum Excel
    Réponses: 9
    Dernier message: 14/10/2007, 22h00
  4. [Requête/SQL]Remplacer champ par valeur autre champ
    Par BORDEAUX4 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/04/2007, 11h05
  5. remplacement d'une valeur par une autre
    Par hugoos dans le forum Langage
    Réponses: 9
    Dernier message: 20/09/2005, 21h43

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