erreur code pour détecter les grandes valeurs

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

anthony payoux
Messages : 17
Enregistré le : 03 Jan 2017, 18:03

erreur code pour détecter les grandes valeurs

Messagepar anthony payoux » 21 Fév 2017, 15:52

Bonjour,

je me suis inspiré d'un code que j'ai pu trouver sur le net mais je n'arrive pas à le faire tourner....

J'ai un vecteur y et je veux détecter les valeurs "grandes". Ce que je fais c'est pour la valeur en i, je prends les "lag" valeurs avant i et les "lag" valeur après i. Je calcul la moyenne et l'écart type de a= [ y[(i-lag):(i-lag)],y[(i+1):(i+lag)], et je regarde ensuite si y[i]- mean(a) > threshold*sd[a]

Si oui, alors je note 1, sinon 0.

Si quelqu'un pouvait voir où sont les erreurs, ça pourrait m'aider grandement, parce que je commence à perdre espoir...

merci :)

Code : Tout sélectionner

ThresholdingAlgo <- function(y,lag,threshold) {

signals <- rep(0,length(y))
  filteredY <- y[0:2*lag]
  avgFilter <- NULL
  stdFilter <- NULL
  avgFilter[lag] <- mean(y[0:2*lag])
  stdFilter[lag] <- sd(y[0:2*lag])


  for (i in (lag+1):(length(y)-lag)){
    if (abs(y[i]-avgFilter[i]) > threshold*stdFilter[i]) {
      signals[i] <- 1
    filteredY[i] <- y[i]
      avgFilter[i] <- mean(filteredY[(i-lag):(i-1)],filteredY[(i+1):(lag+1)])
      stdFilter[i] <- sd(filteredY[(i-lag):(i-1)],filteredY[(i+1):(lag+1)])
    } else {
      signals[i] <- 0
      filteredY[i] <- y[i]
      avgFilter[i] <- mean(filteredY[(i-lag):(i-1)],filteredY[(i+1):(lag+i)])
      stdFilter[i] <- sd(filteredY[(i-lag):(i-1)],filteredY[(i+1):(lag+i)])

    }
  }
  return(list("signals"=signals,"avgFilter"=avgFilter,"stdFilter"=stdFilter))
}

anthony payoux
Messages : 17
Enregistré le : 03 Jan 2017, 18:03

Re: erreur code pour détecter les grandes valeurs

Messagepar anthony payoux » 21 Fév 2017, 21:22

Je vais essayer d'être plus clair:

Objectif de mon algo: trouver les valeurs trop importante par rapport aux autres

Je calcul la moyenne sur 7 points, et je compare la valeur centrale moins la moyenne de ces 7 points, si le résultat est supérieur à un facteur fois l'écart type de ces 7 points alors la valeur est importante. Voila une version qui est je plus meilleur de mon code:

Cependant j'obtiens l'erreur suivante Error in avgFilter[i] <- y[(i - lag):(i + lag)] :
object 'avgFilter' not found

Code : Tout sélectionner

ThresholdingAlgo <- function(y,lag,threshold) {
 
  for (i in (lag+1):(length(y)-lag-1)){

   avgFilter[i] <- mean(y[(i-lag):(i+lag)])
      stdFilter[i] <- sd(y[(i-lag):(i+lag)])

    if ((y[i]-avgFilter[i]) > threshold*stdFilter[i]) {
     
        signals[i] <- 1;
      } else {
        signals[i] <- 0;
 
  }
}
  return(list("signals"=signals,"avgFilter"=avgFilter,"stdFilter"=stdFilter))
}


Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: erreur code pour détecter les grandes valeurs

Messagepar Pierre-Yves Berrard » 21 Fév 2017, 21:35

Bonsoir
Il faut initialiser les objets avec une valeur vide avant de les remplir.
C'était le but des "<- NULL" du code initial. Pourquoi les avoir supprimé ?
PY

anthony payoux
Messages : 17
Enregistré le : 03 Jan 2017, 18:03

Re: erreur code pour détecter les grandes valeurs

Messagepar anthony payoux » 21 Fév 2017, 21:43

En effet, cela fonctionne maintenant, j'ai de mauvaise habitude sous Matlab.

J'en profite pour poser une dernière question sur ce sujet.

j'ai sélectionner la moyenne et l'écart type de [i - lag to i +lag ].

Dans le cas où je souhaiterais ne pas inclure la valeur du centre; est il possible de dire

c( y[(i-1):(i-lag)], y[(i+1):(i+lag)],

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: erreur code pour détecter les grandes valeurs

Messagepar Pierre-Yves Berrard » 21 Fév 2017, 22:00

anthony payoux a écrit :Dans le cas où je souhaiterais ne pas inclure la valeur du centre; est il possible de dire
c( y[(i-1):(i-lag)], y[(i+1):(i+lag)])

Ça me semble tout à fait possible.

On peut aussi l'écrire comme ça (plage complète de laquelle on retire la valeur centrale) :

Code : Tout sélectionner

y[(i-lag):(i+lag)][-(lag+1)]
PY


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité