|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : janvier 2009 Messages : 98 ![]() |
Bonjour,
J'aimerai savoir comment il est possible de calculer en SAS un cumul sur période glissante. ex période glissante = 5j j1 100 j2 50 j3 40 j4 10 j5 20 j6 200 j7 60 cumul glissant j1 = 100 cumul glissant j2 = 150 cumul glissant j3 = 190 cumul glissant j4 = 200 cumul glissant j5 = 220 cumul glissant j6 = 320 (220 + 200 - 100) cumul glissant j7 = 330 (320 + 60 - 50) Pour l'instant j'ai fait une boucle while qui boucle sur les lignes tant que la période ne dépasse pas 5. Donc pour chaque ligne je boucle 5 fois. Cela marche mais je ne trouve pas cela optimisé. ex c_j7 = j7 + j6 + j5 + j4 + j3 NB : je ne peux pas passer par un lag. merci de votre aide |
|
|
00
|
|
|
#2 | ||||
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
la vieille méthode mixe le RETAIN et la fonction SUM
Code :
Je regarderai la proc EXPAND si j'étais toi : Code :
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !Moteur de recherche dans les papiers SAS |
||||
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : janvier 2009 Messages : 98 ![]() |
la méthode du retain va marcher dans mon exemple jusqu'en j5.
mais à partir de j6 cela ne marchera plus car je dois soustraire de la somme la j1 (je précise que je ne peux pas faire un lag5). proc expand je vais regarder je ne connais pas. mais merci quand meme s'il y a d'autres idées |
|
|
00
|
|
|
#4 | ||
|
Nouveau Membre du Club
![]() Gaëtan Inscription : avril 2011 Messages : 29 ![]() |
En utilisant la méthode du retain ça marche très bien, il faut juste s'arranger pour soustraire la valeur correspondante au lag5 (et d'ailleurs j'aimerais bien savoir pourquoi on ne peut pas utiliser cette fonction puisque si je ne me trompe pas elle est disponible sans module complémentaire, non ?).
Et donc pour avoir cette valeur un simple merge suffit : Code :
|
||
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : janvier 2009 Messages : 98 ![]() |
Je ne peux pas utiliser de lag car je ne connais pas le nombre de ligne qu'il y a aura dans ma période glissante.
en gros je peux avoir dans mon cas j1 100 j1 50 j2 10 pas de j3 j4 20 j4 30 je ne peux pas non plus faire agréger mes "j1" et "j4" ensemble. Derrière j1, j2...j'ai un datetime et non une date. Ma période glissante n'est pas en jour mais imaginons de 30 min. Je ne sais pas combien d'observatiosn il y a eu les 30 dernières minutes. De plus cela changera à chaque fois. donc pas de lag. Dans l'idée c'est comme ton merge avec if. Par contre je ne connais pas du tout cette syntaxe. du set + merge avec un if dedans et sans "by". ca semble usine à gaz non ? |
|
|
00
|
|
|
#6 |
|
Nouveau Membre du Club
![]() Gaëtan Inscription : avril 2011 Messages : 29 ![]() |
oui alors là si tu n'as pas le même nombre d'observation par période mon programme ne fonctionnera plus je pense ...
et sinon pour mon set + merge ça marche comme un merge mais à partir de la ligne 5. là j'ai bidouillé un truc car j'avais la flemme de chercher comment faire avec les options (surement qu'avec l'option firstobs on peut arriver à un truc mais je vois pas comment)
|
|
|
00
|
|
|
#7 | ||||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
Bonjour
Je vais te proposer une solution d'après ce que je crois avoir compris de ton problème... Mais il est possible que j'ai mal compris. En effet des choses sont un peu flous pour moi comme ta variable date qui est un "datetime" et pas une date, j'avoue n'avoir pas trop compris. Ce que j'ai compris... 1- C'est que tu as des observations discretes d'un temps continu dans tes observations (genre t=4523.2653). 2- Un nombre de mesure variables par jour, voir absentes. 3- Et que tu voudrais faire le cumul de ta variable d'intéret entre ]t-5t,t] (tu remarquera l'ouverture des crochets gauche sur la gauche, si tu veux [t-5,t] il vaudra modifier très légèrement le code). Je me suis fait un petit jeu de données Code :
Code :
Code :
En tout cas à cette étape tu dispose pour chaque observation le total cumul entre le temps courant t (par exemple t=16.2038) jusqu'à t-5 exclu(soit t=11.2038+epsilon de temps) et donc une fois que tu aura défini exactement le resultat statistique que tu veux obtenir, il ne sera plus trop compliqué d'y parvenir. |
||||||
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Salut.
Ca va être compliqué avec une étape DATA puisqu'on ne sait pas à l'avance combien de lignes on doit retenir. Je te propose une solution en SQL, en joignant la table avec elle-même pour sélectionner les valeurs dans la dernière demi-heure et les sommer. Code :
Olivier |
||
|
|
00
|
|
|
#9 |
|
Membre du Club
![]() Inscription : janvier 2009 Messages : 98 ![]() |
Merci pour vos réponses c'est exactement ce que je voulais dans les deux cas.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com