|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
Bonjour,
je bloque depuis quelques temps sur un programme sas dans lequel on répète plusieurs fois la même chose mais je ne parviens pas à écrire une boucle (ou une macro) permettant de faire ce que je veux. Mon jeu de données se compose comme suit: j'ai une ligne par patient et des variables allant de visite1 à visite20 correspondant aux dates des visites des patients. J'ai aussi des scores EGS1 à EGS25 et les dates associés date_EGS1 à date_EGS25 (j'espère que je suis assez clair). Voici ce que je souhaiterais faire: je voudrais créer une variable remission qui vaut 1 si le temps entre deux visites est d'au moins deux ans et s'il existe des score EGS à ces dates qui sont égaux. Autrement dit il faudrait que je compare deux à deux les visites pour vérifier s'il y a bien plus de deux ans d'écarts et si les dates de scores EGS coincident avec ces dates de visites et que les scores soient égaux. J'espere vraiment que quelqu'un pourra m'aider car je suis coincé et je ne sais pas comment m'en sortir. Merci beaucoup |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Tu peux poster quelques lignes de ta table? ça éviterait de travailler sur une table qui n'a pas la même structure que la tienne
|
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
Voici quelques lignes de ma table en piece jointe ! Il y a trop de variables pour pouvoir afficher sur ce message.
J'espere que cela suffira Merci |
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour Fabien.
A l'import, je ne retrouve pas toutes les variables dont tu parles, et plutôt que de chercher, j'ai essayé de faire un programme "de tête" (non testé : il y a donc de fortes chances que ça plante). Code :
J'aurais pu m'épargner la boucle d'indice k si j'avais la certitude que tous les scores sont mesurés à des dates consécutives, mais j'ai préféré assurer le coup. On peut peut-être faire plus simple, mais déjà, est-ce que ça te met dans la bonne direction ? Bon courage. Olivier |
||
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
Ah oui je vois ce que tu veux dire avec les arrays. Il faut que je transforme ma table en vecteurs pour pouvoir ainsi faire des boucles indicées. Je vais voir si j'y arrive avec ce que tu m'as donné comme solutions. Je reviendrais si je n'y arrive toujours pas ^^
Merci. |
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Le problème 1 est résolu:
Code :
|
||
|
|
00
|
|
|
#7 | ||||
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
j'ai une mauvaise nouvelle pour moi, après plusieurs tentatives mon code ne fonctionne pas. Je me suis servi de ce que tu m'avais donné Olivier et j'ai tenté de l'appliquer à mon problème mais ça m'affiche une erreur :
Code :
Code :
Merci de votre aide Fabien |
||||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Dans ton fichier, c'est quoi la date de visite, la date de score et le score?
|
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
Alors dans mon fichier la date de visite c'est dat_episo1 dat_episo2 .... dat_episo22, la date de score c'est dat_clin1 dat_clin2 .... dat_clin20 et les scores c'est egs_entered1 edss_entered1, egs_entered2 edss_entered2 .... egs_entered20 edss_entered20.
A chaque date de score il y a deux scores à prendre en compte. Je ne sais pas si je suis très clair Fabien |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Si, c'est clair mais lequel des scores tu vas retenir?
|
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
ben justement il faut que je compare si un des deux scores d'une date de score i est egal à un des deux autres scores d'une date de score j en prenant biensur en compte que les dates de score i et j doivent coincider avec les dates d'épisodes.
|
|
|
00
|
|
|
#12 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bon, je pense pouvoir dire sans trop me mouiller que les boucles fautives sont celles d'indices j et k.
J va vraiment de 0 à 19 ? Et k de 1 à 19 ? Ils m'ont l'air vraiment symétriques tous les deux ! Effectivement, sinon, le code a l'air correct. N'hésite pas à essayer de tracer l'exécution de ton code avec des instructions PUT dans l'étape DATA : tu verras dans la log les valeurs de tes indices de boucle et des autres variables. Code :
|
||
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Un début de code qui pourrait t'inspirer (le fichier en pièce jointe est une copine de la tienne en remplaçant les valeurs manquantes par 0).
Sur le même principe, tu vas determiner la differénce des date de score et le score et appliquer tes conditions pour constituer ta nouvelle variable. Code :
|
||
|
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour Fabien.
Je regarde ton code d'un oeil neuf ce matin, et j'ai deux remarques : 1) tu ne définis que 2 arrays alors que j'en proposais 3 (1 pour les dates de visite, 1 pour les dates de scores et 1 pour les scores eux-mêmes : c'est celui-là qui manque ?!) 2) une approche radicalement différente serait de "pivoter" ta table, de manière à avoir une observation par patient et par visite. Avec plusieurs PROC TRANSPOSE et un MERGE, ça doit bien se faire. PATIENT_ID DATE SCORE 1 12/02/2010 325 1 15/07/2010 . 1 02/12/2010 322 etc. Dans mon exemple, il y a une visite le 15/7/2010 mais pas de score mesuré. Est-ce qu'on peut facilement coder ton problème dans ce cas ? Il faudrait des LAG pour comparer les dates et les scores, du RETAIN pour compléter les trous éventuellement... Si vraiment tu es sur le point de laisser tomber l'approche avec les arrays, ce sera un moyen de te changer les idées. ![]() Par contre, je ne pense pas que les macros fassent autre chose que compliquer les programmes dans ce cas. Bon courage. Olivier |
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
Bonjour,
Olivier, pour répondre à ta question dans ton mail d'hier, j va bien de 0 à 19 et k de 1 à 19 puisqu'en fait la premiere boucle j regarde s'il y a une date de score (il y en a 19) qui est égale à la date d'épisode i -1. La deuxième boucle k parcourt les dates de score pour voir s'il y en a une qui est égale à la date d'épisode i. Après réflexion peut-etre que j va de 0 à 18 finalement ???? Megamind2, je ne comprend pas trop ton programme. Disons que je ne suis pas très doué à tout ce qui touche des macros Olivier, dans ton mail de ce matin, j'ai défini 2 arrays car en fait mes score sont dans l'array des date de score. C'est pour cela que j'ai codé date_score[2+5*j] ou date_score[4+5*j] pour selectionner les scores dans cette array. Je ne vois pas comment m'en sortir si je transpose ma table. Comment faire correspondre les dates d'épisodes avec les dates de score? Merci Fabien |
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
un select into + array &episode que tu appelles ça une macro Olivier?
C'est exactement la même chose que tu as fait avec une autre approche... |
|
|
00
|
|
|
#17 | |||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Citation:
As-tu essayé de tracer l'exécution de tes boucles avec des PUT ? Citation:
Citation:
Allez, on y croit, il fait beau aujourd'hui, ce programme fonctionnera avant le week-end ! |
|||
|
|
00
|
|
|
#18 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
Quand je fais tourner le programme pour j de 0 à 2 et k de 1 à 3 ça fonctionne ( après je ne pense pas que les résultats soient ceux que j'attends ) mais lorsque je passe de j de 0 à 3 et k de 1 à 4 ça bugg ! Je ne vois pas pourquoi !!!
On y croit on y croit, moyen, je commence à desespérer .... et puis je n'ai pas de grand soleil chez moi Merci |
|
|
00
|
|
|
#19 | |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bon, alors désolé pour le soleil.
On va déjà essayé de résoudre les questions de SAS avant celles de la météo. Citation:
Peux-tu nous expliquer ton raisonnement quand tu donnes ces indices calculés (le genre 1+5k) ? Parce que je n'arrive pas à le visualiser (peut-être un cas de manque de caféine), désolé. |
|
|
|
00
|
|
|
#20 | |
|
Invité de passage
![]() Inscription : février 2011 Messages : 20 ![]() |
Alors en fait l'array date_score est organisé comme suit:
date_clin1 edss_entered1 edss_calc1 egs_entered1 egs_calc1 et ainsi de suite jusqu'à dat_clin20 edss_entered20 edss_calc20 egs_entered20 egs_calc20 dans le même ordre. Donc lorsque je fais Citation:
C'est mieux expliquer? |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com