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 :

Fonction bugguée ? [Débutant(e)]


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Fonction bugguée ?
    Bonjour, après avoir cherché de long en large et en travers sur le forum je n'ai pas trouvé de réponse à mon problème de codage.
    Je suis actuellement entrain de réaliser différents modules ayant pour but de mettre en évidence des résultats d'un écrit sur la statistique. Dans ce cadre nous travaillons sur une data frame de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Individu,Temps,x1,x2,x3,x4,c1
    1,14,0,0,1,0,0
    1,15,0,0,1,0,1
    2,20,1,0,0,0,0
    2,28,1,0,1,0,0
    2,35,1,1,1,0,0
    3,19,1,0,0,0,0
    Le but que je me suis fixé est de calculer pour un T donné le nombre de marqueurs d'un individu ; j'ai nommé ma fonction Esp.T et l'ai codée de la façon suivante (je vous laisse mes commentaires, peut être seront-ils utiles):
    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
    Esp.T <- function(df,t)
    { 
      ## Data Frame
      ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ## Purpose: Calculer dans une df le nombre de marqueurs moyens pour une date t donnée
      ##~~~~~~~~~~~~~~~~~~~~
      ## Arguments:df une data frame
      ##           t une date donnée
      if (class(df) != "data.frame")
      {
            stop("'df' doit être une data.frame")
      }else{
      ## Test si t est bien plus grand qu'au moins une valeur sinon pas de sens
      if (min(df$Temps)>t)
      {E<- 0
      }else{
            N <-dim(df)
            n <-df[N[1],1]
            p <-N[2]
      ##Mise en place vecteur pour le nombre de marqueur  
            M <- rep(0,n) 
      ##Debut de la boucle du calcul du vecteur des marqueurs      
            for (i in 1:n)
            {
      ## Restriction du df à l'ind i et on enleve les t supérieurs        
            DIT<- df[df$Individu==i&df$Temps<=t,]
      ## Vérification qu'il y a bien un marqueur à la date t     
            if (nrow(DIT)==0)
            {M[i] <-0
            }else{
      ## Vérification de la censure        
                  if (DIT[nrow(DIT),ncol(DIT)]==1)
                  {M[i] <-NA
                  }else{
                        DITf<-DIT[nrow(DIT),-c(1,2,p)]
                        M[i]<- sum(DITf)
                        }
                 }
            }
       ##Suppression des NA dans M pour calculer la bonne espérance
    M.manq <- which(is.na(M),arr.ind=T)
    M <- M[-unique(M.manq)]
    l <- length(M)
    E <- (1/l)*sum(M)
    #return(M)
    #return(l)
            }
      }
     
    return(E)
    }
    Le problème que je rencontre est lorsque je prend la valeur minimale de t de ma data frame puisque la réponse renvoyée est NaN.
    Après avoir repris ligne par ligne etc... Je n'ai toujours pas réussi à trouver d'où pouvait provenir l'erreur. Alors si quelqu'un à la moindre idée, je lui en serait reconnaissant.

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    J'ai jeté un oeil rapidement à votre fonction et je pense que le problème se situe dans cette ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M <- M[-unique(M.manq)]
    En effet, si l'objet "M.manq" est vide (ie. s'il n'y a pas de NA dans M), alors cette commande renvoie : numeric(0), et tous les calculs suivants sont faussés.

    De plus, je pense qu'il y a sûrement plus simple pour calculer ce que vous souhaitez, notamment peut-être en ayant recours à la fonction "by".


    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour cette réponse, j'ai déjà procédé en rajoutant une petite boucle If qui fonctionne a la perfection en testant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (any(is.na(M))==TRUE) {....}
    Pour procéder par by, je n'ai pas la moindre idée de comment faire la chose. Je me pencherai sur le problème la semaine prochaine puisque je dois présenter quelques résultats d'ici lundi.

    Si vous pouviez m'éclairez sur la direction à prendre se serait fort aimable. En tout cas merci beaucoup pour tout.

    Cordialement,
    Julien

  4. #4
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Alors, après réflexion je ne suis pas bien sûre d'avoir compris quel est le but final de votre fonction : calculer le nombre de "marqueurs" à un instant t donné et le moyenner par le nombre d'individus total?

    Si tel est le cas, vous pouvez avoir recours à la fonction by par exemple 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # fonction pour le calcul de la valeur recherchée pour un temps t donné
    myfun<-function(M,ind=df$Individu)
    {
    	s<-sum(M[,3:7])/(length(table(ind)))
    	s
    }
     
    # va appliquer "myfun" sur chacun des différents temps t trouvés dans df$Temps
    by(df,df$Temps,myfun)
     
    df$Temps: 14
    [1] 0.3333333
    ------------------------------------------------------------ 
    df$Temps: 15
    [1] 0.6666667
    ------------------------------------------------------------ 
    df$Temps: 19
    [1] 0.3333333
    ------------------------------------------------------------ 
    df$Temps: 20
    [1] 0.3333333
    ------------------------------------------------------------ 
    df$Temps: 28
    [1] 0.6666667
    ------------------------------------------------------------ 
    df$Temps: 35
    [1] 1
    Après, je ne suis pas non plus très familière de la fonction "by" et il y a sûrement d'autres manières de procéder. Cela dit cela vous donne une première idée de ce qui peut être fait avec cette fonction et n'hésitez pas à consulter son aide et à faire vos propres tests bien sûr.

    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  3. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  4. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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