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 !