1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    novembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : novembre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut Utilisation de MEAN dans une boucle

    Bonjour,

    Je débute avec SAS et je bloque sur un programme que j'ai besoin de faire.

    J'ai une table contenant des données climatiques quotidiennes de deux années consécutives avec les colonnes suivantes :

    date_in tmin tmax rain vp humid

    J'ai converti mes dates en nombre reconnu par SAS (01/01/1998=13880).

    Mon problème est le suivant :

    J'aimerais ajouter, pour chaque paramètre climatique, une colonne correspondant à la moyenne des valeurs des 50 jours suivants.
    En clair, pour tmin j'aimerais rajouter la colonne average_tmin.
    La première observation de average_tmin serait la moyenne des températures allant de la date 1 à la date 50.
    La 2ème observation de average_tmin serait la moyenne des valeurs allant de la date 2 à la date 51.
    Etc.


    Pour cela, j'ai pour l'instant rédigé le programme suivant :
    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
     
    DATA climate_av;
    	set climate;
    	keep tmin2 
    		tmax2
    		rain2
    		vp9
    		humid9
    		date_in;
     	DO i=1 to 1096;          /*J'ai 1096 jours de données climatiques, soit 1096 lignes dans climate*/
     		proc means data=climate_av (FIRSTOBS=1+i OBS=50+i) mean;
     		var tmin2;          /*Tentative 1*/
     		run;
     		*av_tmin = mean(tmin2(FIRSTOBS=1+i OBS=50+i));       /*Tentative2*/
     	END;
    PROC print data=climate_av;
    J'ai conscience que mettre un PROC dans une boucle ne fonctionne pas donc je cherche une alternative...
    Sinon je pensais utiliser la fonction mean mais je ne sais pas comment l'appliquer aux valeurs qui m'intéressent...


    Est-ce que quelqu'un pourrait me donner des pistes s'il vous plait ?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : novembre 2017
    Messages : 13
    Points : 21
    Points
    21

    Par défaut

    Bonjour,

    Voici une piste, je n'ai pas eu le temps de tester cette méthode et ne suis pas trop familier avec la proc expand donc je vous laisse tester cette méthode sur vos données.

    On trie d'abord la table en ordre descendant (du plus récent au plus ancien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    proc sort data = climate; by date_in descending; run;
    On utilise la proc expand pour calculer une moyenne mobile sur 50 observations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    proc expand data=climate out=climate_av;
      id date_in;
      convert tmin2=t_ave / transform=(CUAVE 50);
    run;

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    novembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : novembre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Bonjour,

    Merci beaucoup pour votre aide ! Malheureusement pour moi, je n'ai accès qu'à la version universitaire de SAS, qui n'inclue pas la fonction EXPAND... J'ai donc pour réponse "Procedure EXPAND not found."

    Y aurait-il une autre fonction similaire à celle-ci ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : novembre 2017
    Messages : 13
    Points : 21
    Points
    21

    Par défaut

    A ma connaissance, il n'existe pas de fonction similaire. Mais on peut toujours se débrouiller sans...

    Pour cela nous allons utiliser la fonction lag().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data climate_av;
         retain somme;
         set climate;
         somme = sum (somme, tmin2, -lag50(tmin2));
         t_ave   = somme / min(_N_, 50);
    run;
    la variable "somme" contiendra pour chaque observation, la somme cumulée des 49 observations précédentes et de l'observations en cours.
    Pour obtenir la moyenne sur les 50 premières observations, on utilise le numéro de ligne car il est inférieur à 50.

    Bon courage !

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    novembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : novembre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Super, merci beaucoup pour votre aide !!

Discussions similaires

  1. Utiliser le OU dans une boucle while
    Par Yann_69 dans le forum Général Java
    Réponses: 10
    Dernier message: 21/06/2012, 17h32
  2. Utilisation de condition dans une boucle for-each
    Par siro1 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/03/2012, 18h07
  3. [Débutant] utilisation des Textbox dans une boucle For
    Par zayoub dans le forum VB.NET
    Réponses: 31
    Dernier message: 28/07/2011, 16h55
  4. Utiliser un pas dans une boucle For .. to .. do
    Par colorid dans le forum Langage
    Réponses: 4
    Dernier message: 14/06/2009, 12h09
  5. Utilisation de MAX() dans une boucle
    Par renaud26 dans le forum Fonctions
    Réponses: 5
    Dernier message: 21/04/2009, 16h32

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