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 :

Appels entre les fonctions


Sujet :

R

  1. #1
    Membre averti
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Points : 316
    Points
    316
    Par défaut Appels entre les fonctions
    Bonjour,

    Je cherche implémenter des fonctions qui s'appellent en chaîne. j'ai un petit problème dans le code ci-dessous :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
     
    ## Fonction phi pour implémenter EWMA-C
    # gamma et lambda paramètre de ACUSUM-C
    # e représente la variable de la fonction phi 
    # (e(t)=X(t)-delta(t-1))
     
    phi <- function(e, gamma, lambda) {
     
      if ( e < (-gamma) ) {
        phie <- e+(1-lambda)*gamma
      }
     
      else if ( abs(e) <= gamma ) {
        phie <- lambda*e
      }
     
      else if ( e > gamma ) {
        phie <- e-(1-lambda)*gamma
      }
     
      return(phie)
     
    }
     
    #_________________________________________________________________#
     
    ## Fonction EWMA-C
    # X : la série temporelle à etudier
    # gamma et lambda paramètre de ACUSUM-C
     
    ewmac <- function(X, gamma, lambda) {
     
      delta    <- vector(mode = "numeric", length = length(X))
      delta[1] <-0
     
      for ( t in 2:length(X) ) {
        e    <- X[t]-delta[t-1]
        phie <- phi(e, gamma, lambda)
        delta[t] <- delta[t-1] + phie
      }
     
      return(delta)
    }
     
    #_________________________________________________________________#
     
    ## Fonction acusumc
    # X : la série temporelle à etudier
    # gamma et lambda paramètre de ACUSUM-C
    acusumc <- function(X, gamma, lambda, delta.min) {
      S    <- vector(mode = "numeric", length = length(X))
      S[1] <- 0
     
      delta <- ewmac(X, gamma, lambda)
     
      for ( t in 2:length(X) ) {
        delta.plus <- max(delta.min, delta[t])
        S[t] <- max(0, S[t-1] + delta.plus*(X[t]-delta.plus/2) )
      }
     
      return(S)
    }
     
    #_________________________________________________________________#
     
    ## Fonction acusumc.c1.mild
     
    acusumc.c1.mild <- function(X, gamma, lambda, delta.min) {
      S      <- vector(mode = 'numeric', length = length(X))
      S[1:7] <- acusumc(X[1:7], gamma, lambda, delta.min)
     
      for (i in 8:length(X)) {
        X1 <- X[i-7:i]
        S1 <- acusumc(X1, gamma, lambda, delta.min)
        S[i] <- S1[8]
      }
     
      return(S)
    } 
     
    #_________________________________________________________________#
    # Série simulée suivant une loi normale de paramètre (mu,1) (N(mu,1))
    mu <- 0
    X  <- rnorm(n = 100, mean = mu, sd = 1)
     
    gamma  <- 2
    lambda <- 0.25
    delta.min <- 1
     
    delta <- ewmac(X, gamma, lambda)
     
    S         <- acusumc(X, gamma, lambda, delta.min)
     
    S.c1.mild <- acusumc.c1.mild(X, gamma, lambda, delta.min)
    Seulement j'ai une erreur qui me dit :
    S.c1.mild <- acusumc.c1.mild(X, gamma, lambda, delta.min)
    Error in if (e < (-gamma)) { : missing value where TRUE/FALSE needed
    Pourtant cela marche bien lorsque je calcule S mais pas pour calculer S.c1.mild avec la fonction acusumc.c1.mild qui fait pourtant appel à la fonction acusumc. J'ai l'impression que le "e" n'est pas calculé dans la fonction ewmac.

    Bref, je suis un peu perdu...

    Merci de votre aide !

  2. #2
    Membre averti
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Points : 316
    Points
    316
    Par défaut
    C'était juste un bête problème de parenthèses lorsque je créais une sous-série...

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

Discussions similaires

  1. liens entre les fonctions
    Par autousto dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 31/07/2012, 10h01
  2. Quelle est la différence entre les fonctions Hxxxx et SQLxxxx?
    Par THOMAS Patrice dans le forum WinDev
    Réponses: 2
    Dernier message: 30/07/2010, 11h40
  3. [XL-2003] Différence entre les fonctions Round() Excel et VBA ?
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/05/2010, 15h22
  4. Réponses: 2
    Dernier message: 29/09/2009, 11h08
  5. [Débutant] Passer des données entre les fonctions callback
    Par Nouk_Lea dans le forum Interfaces Graphiques
    Réponses: 10
    Dernier message: 18/02/2009, 16h11

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