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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    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 confirmé
    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
    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 chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    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 confirmé
    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
    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 chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    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 confirmé
    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
    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 chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    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

+ 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